Seite 1 von 1

Makro bei Änderung an bestimmter Zelle ausführen

Verfasst: So, 09.02.2014 09:38
von Verjigorm
Hallo,

ich hab trotz intensiver Suche leider keinen Beitrag gefunden, der mir eine Lösung für mein Problem liefert.

Folgendes kleines Makro hab ich in der Tabelle, welches den Namen des Tabellenblatts entsprechend eines Zellinhaltes ändert:

Code: Alles auswählen

Sub Main
with thisComponent.sheets
for i = 0 to .count -1
.getByIndex(i).Name = .getByIndex(i).getCellByPosition(0,0).string
next i
end with
End Sub
Ich hätte nun gern noch, dass dieses Makro bei der Änderung des Inhalts der Zelle "$Translations.$C$1" einmal automatisch ausgeführt wird.
Bin mir fast sicher, dass das nur eine oder zwei Zeilen Code sind, aber ich kriegs leider nicht hin :?

Vielen Dank im Voraus
Verji

Re: Makro bei Änderung an bestimmter Zelle ausführen

Verfasst: So, 09.02.2014 10:51
von F3K Total
Hi,
das hängt davon ab, ob du die Eintragung in Zelle A1 von Hand machst, oder durch eine Formel, die aus einer anderen Zelle befüllt wird.
Was genau willst Du erreichen?
Gruß R

Re: Makro bei Änderung an bestimmter Zelle ausführen

Verfasst: So, 09.02.2014 10:52
von Stephan
aufgrund einer Besonderheit (normalerweise ist es nämlich in Calc nicht möglich mittels Tabellenfunktionen Dinge aktiv zu schreiben) geht das z.B. dadurch das Du kein Sub sondern eine Function benutzt die lauten muss:

Code: Alles auswählen

Function aendere_blattname(x)
with thisComponent.sheets
for i = 0 to .count -1
.getByIndex(i).Name = .getByIndex(i).getCellByPosition(0,0).string
next i
end with
End Function
schreibe nun folgenden Funktionsaufruf in eine beliebige Zelle des Tabellenblatts namens "Translations":

=AENDERE_BLATTNAME(C1)

Das wars schon, jetzt wird immer der Code ausgeführt wenn $Translations.$C$1 sich ändert.


Hinweis:
die Function muss in der Makrobibliothek namens "Standard" des aktuellen Dokuments oder der zentralen OO-Bibliothelen (=meine Makros) gespeichert werden.


Gruß
Stephan

Re: Makro bei Änderung an bestimmter Zelle ausführen

Verfasst: So, 09.02.2014 11:07
von Verjigorm
F3K Total hat geschrieben:Hi,
das hängt davon ab, ob du die Eintragung in Zelle A1 von Hand machst, oder durch eine Formel, die aus einer anderen Zelle befüllt wird.
Was genau willst Du erreichen?
Gruß R
Von Hand, man wählt in der Zelle die gewünschte Sprache aus, die die Inhalte haben sollen... gibt man dann entweder von Hand ein oder wählt aus dem gegebenen Dropdown-Menü...


Stephan hat geschrieben:aufgrund einer Besonderheit (normalerweise ist es nämlich in Calc nicht möglich mittels Tabellenfunktionen Dinge aktiv zu schreiben) geht das z.B. dadurch das Du kein Sub sondern eine Function benutzt die lauten muss:

Code: Alles auswählen

Function aendere_blattname(x)
with thisComponent.sheets
for i = 0 to .count -1
.getByIndex(i).Name = .getByIndex(i).getCellByPosition(0,0).string
next i
end with
End Function
schreibe nun folgenden Funktionsaufruf in eine beliebige Zelle des Tabellenblatts namens "Translations":

=AENDERE_BLATTNAME(C1)

Das wars schon, jetzt wird immer der Code ausgeführt wenn $Translations.$C$1 sich ändert.


Hinweis:
die Function muss in der Makrobibliothek namens "Standard" des aktuellen Dokuments oder der zentralen OO-Bibliothelen (=meine Makros) gespeichert werden.


Gruß
Stephan
Die Lösung wirkt ein wenig unelegant, aber ich schaus mir mal an. Wenn keine andere Lösung kommt, werd ich ohnehin damit Vorlieb nehmen müssen. Vielen Dank trotzdem schonmal :)

Re: Makro bei Änderung an bestimmter Zelle ausführen

Verfasst: So, 09.02.2014 11:16
von F3K Total
Hi,
die Frage an sich ist etwas verwirrend, Du möchtest in C1 eine Änderung machen, dein Makro liest den Zellinhalt aber aus A1 aus.
Ausserdem läuft das Makro über alle vorhandenen Blätter und gibt ihnen jeweils den Namen, der in der Zelle A1 des jeweiligen Blattes steht.
Du kannst aber eh nur auf einem Blatt zur Zeit den Inhalt einer Zelle manuell ändern.
Also, wie nun?
  • Änderung in C1 -> Name aus C1 für das aktuelle Blatt
  • Änderung in C1 -> Name aus A1 für das aktuelle Blatt
  • Änderung in C1 -> Name aus C1 für alle Blätter
  • Änderung in C1 -> Name aus A1 für alle Blätter
???
Gruß R

Re: Makro bei Änderung an bestimmter Zelle ausführen

Verfasst: So, 09.02.2014 11:30
von Verjigorm
Sorry, ich bin ein echter Makro-Noob...

Ich hab mehrere Blätter und bei allen soll bis auf dem letzten soll der Blattname dem Inhalt der Zelle A1 auf dem entsprechenden Blatt gleich sein.

Der Inhalt der Zellen A1 auf den Blättern hängt am Wert der Zelle $Translations.$C$1. Wenn sich dieser ändert, ändern sich auch alle A1-Werte und genau dann soll auch das Makro ins Spiel kommen und die Blattnamen entsprechend anpassen.

Tut mir leid, wenn ich mich unklar ausgedrückt habe... ich hoffe nun ist klar, was beabsichtigt ist.

Re: Makro bei Änderung an bestimmter Zelle ausführen

Verfasst: So, 09.02.2014 11:35
von Stephan
Die Lösung wirkt ein wenig unelegant
aber sie ist das Gegenteil davon, was überhaupt der Grund war mir die Arbeit zu machen sie aufzuschreiben.

Die langweilige Standardlösung ginge nämlich so:

eigentlich müsste für die Zelle C1 ein sog. Listener registrierrt werden um das Ändern-Ereignis abzufangen, was aber keiner der sich mit OO/LO-Programmierung auskennt gerne tut, weil das immer latent instabil ist, folglich gäbe es noch die Wege:

(a)
über Daten-Gültigkeit das Makro zu starten

(b)
über Tabellenereignisse-Inhalt geändert das Makro unselektiv zu starten und erst im Makro zunächst zu prüfen ob C1 geändert wurde, wenn ja Makro weiterlaufen lassen, wenn nein Makro beenden



Gruß
Stephan

Re: Makro bei Änderung an bestimmter Zelle ausführen

Verfasst: So, 09.02.2014 11:39
von Verjigorm
Dann hab ich, was ich wollte :)

Trotzdem vielen Dank...

Re: Makro bei Änderung an bestimmter Zelle ausführen

Verfasst: So, 09.02.2014 11:51
von F3K Total
Na,
auch wenn es langweilig ist, hier noch eine Lösung b

Code: Alles auswählen

Sub S_Set_Sheetnames(event)
    if event.celladdress.row = 0 and event.celladdress.column = 2 then 
        with thisComponent.sheets
            for i = 0 to .count -1
                if .getByIndex(i).Name <> "Translations" then
                    .getByIndex(i).Name = .getByIndex(i).getCellByPosition(0,0).string
                end if
           next i
        end with
   endif
End sub
Mir gefällt die function-Lösung auch besser.
Gruß R

Re: Makro bei Änderung an bestimmter Zelle ausführen

Verfasst: So, 09.02.2014 13:22
von Verjigorm
Dann belass ichs bei dabei. Trotzdem danke für die andere Lösung :)