Ansteuern einer Zelle auf einem beliebigen Tabellenblatt
Moderator: Moderatoren
Ansteuern einer Zelle auf einem beliebigen Tabellenblatt
Hallo,
ich versuche, ein Makro zu schreiben, komme im Moment aber nicht weiter.
Bestandteil des Makros soll folgendes sein:
Ich befinde mich auf einem beliebigen Tabellenblatt in irgendeiner Zelle, und möchte von dort in die Zelle A1 springen. Anschließend will ich wieder in die Ausgangszelle zurückkehren. Nachdem ich verschiedene Beiträge gelesen habe, meine ich folgendermaßen ans Ziel zu gelangen:
1. Ich ermittle die Adresse der aktuellen Zelle
2. Ich springe in die Zelle A1
3. Ich springe wieder in die Ausgangszelle zurück, deren Adresse ich ermittelt habe.
Das Problem ist, dass in allen Beiträgen, die ich bis jetzt gelesen habe, immer vorausgesetzt wird, dass man sich auf einem bestimmten Tabellenblatt befindet (zum Beispiel "Tabelle 1"). Aber genau das soll nicht sein. Das Makro soll unabhängig vom Tabellenblatt anwendbar sein.
Zu 1.: Hier meine ich, mit folgendem Code weiterzukommen:
ozelle = thiscomponent.getcurrentselection()
adresse = ozelle.getcelladdress()
blatt = adresse.sheet
zeile = adresse.row
spalte = adresse.column
Da ich kein Programmiercrack bin, wars das aber auch schon.
Ich hoffe, es kann mir jemand bei der Lösung helfen. Vielen Dank.
Gruß
WN
ich versuche, ein Makro zu schreiben, komme im Moment aber nicht weiter.
Bestandteil des Makros soll folgendes sein:
Ich befinde mich auf einem beliebigen Tabellenblatt in irgendeiner Zelle, und möchte von dort in die Zelle A1 springen. Anschließend will ich wieder in die Ausgangszelle zurückkehren. Nachdem ich verschiedene Beiträge gelesen habe, meine ich folgendermaßen ans Ziel zu gelangen:
1. Ich ermittle die Adresse der aktuellen Zelle
2. Ich springe in die Zelle A1
3. Ich springe wieder in die Ausgangszelle zurück, deren Adresse ich ermittelt habe.
Das Problem ist, dass in allen Beiträgen, die ich bis jetzt gelesen habe, immer vorausgesetzt wird, dass man sich auf einem bestimmten Tabellenblatt befindet (zum Beispiel "Tabelle 1"). Aber genau das soll nicht sein. Das Makro soll unabhängig vom Tabellenblatt anwendbar sein.
Zu 1.: Hier meine ich, mit folgendem Code weiterzukommen:
ozelle = thiscomponent.getcurrentselection()
adresse = ozelle.getcelladdress()
blatt = adresse.sheet
zeile = adresse.row
spalte = adresse.column
Da ich kein Programmiercrack bin, wars das aber auch schon.
Ich hoffe, es kann mir jemand bei der Lösung helfen. Vielen Dank.
Gruß
WN
Hallo WN
odoc = thisComponent
mysheet=odoc.currentcontroller.activesheet
Zellaktuell=odoc.getCurrentSelection().getCellAddress()
oRow=Zellaktuell.Row
oColumn=Zellaktuell.column
oZiel1 = mySheet.getCellByPosition(0,0) 'A1
...
oZiel2= mySheet.getCellByPosition(ocolumn,orow) 'aktuelle Selektion
...
Gruß Karo
odoc = thisComponent
mysheet=odoc.currentcontroller.activesheet
Zellaktuell=odoc.getCurrentSelection().getCellAddress()
oRow=Zellaktuell.Row
oColumn=Zellaktuell.column
oZiel1 = mySheet.getCellByPosition(0,0) 'A1
...
oZiel2= mySheet.getCellByPosition(ocolumn,orow) 'aktuelle Selektion
...
Gruß Karo
Hallo Karo,
vielen Dank für Deine Antwort. Ich habe den Code ausprobiert, aber aus einem mir nicht erklärbaren Grund wird der Sprung nicht ausgeführt. Die Ermittlung der Zeilen- und der Spaltennummer funktioniert (habe ich über msgbox abgefragt), nicht jedoch der Sprung in die Zelle A1 und wieder zurück (ich habe den Wert von oRow um 1 verändert, um das Ergebnis kontrollieren zu können).
Ich habe den Code, so wie Du ihn mitgeteilt hast in eine Sub kopiert (die Punkte habe ich entfernt). Eine Fehlermeldung wird nicht angezeigt. Ausprobiert habe ich das Ganze in der OO-Version 2.0.4 .
Muss ich noch irgendetwas beachten ?
Viele Grüße
WN
vielen Dank für Deine Antwort. Ich habe den Code ausprobiert, aber aus einem mir nicht erklärbaren Grund wird der Sprung nicht ausgeführt. Die Ermittlung der Zeilen- und der Spaltennummer funktioniert (habe ich über msgbox abgefragt), nicht jedoch der Sprung in die Zelle A1 und wieder zurück (ich habe den Wert von oRow um 1 verändert, um das Ergebnis kontrollieren zu können).
Ich habe den Code, so wie Du ihn mitgeteilt hast in eine Sub kopiert (die Punkte habe ich entfernt). Eine Fehlermeldung wird nicht angezeigt. Ausprobiert habe ich das Ganze in der OO-Version 2.0.4 .
Muss ich noch irgendetwas beachten ?
Viele Grüße
WN
Hallo WN!
In OOO.Basic wird die Auswahl der Zellen nicht sichtbar durchgeführt. Mit dem Objekt oZiel1 und oZiel2 kannst du die Zellen jedoch ansprechen, auch wenn sie nicht markiert sind.
Wenn du mit Basic eine Zelle sichtbar markieren willst brauchst du noch Zusatzbefehle:
Gruß
Charly
In OOO.Basic wird die Auswahl der Zellen nicht sichtbar durchgeführt. Mit dem Objekt oZiel1 und oZiel2 kannst du die Zellen jedoch ansprechen, auch wenn sie nicht markiert sind.
Wenn du mit Basic eine Zelle sichtbar markieren willst brauchst du noch Zusatzbefehle:
Code: Alles auswählen
Controller = odoc.currentcontroller
'anzeigen der ersten Zelle
Controller.select(oZiel1)
Charly
Hallo WN
Ja ich dachte deine eigentliche Frage war 'wie ermittle ich die Adresse der aktuell selektierten Zelle und wie rufe ich sie auf'.
Aber erst mal eine Gegenfrage :
Das Makro soll doch bestimmt etwas mehr tun als nur von einer selektierten Zellle zu A1 zu hopsen und wieder zurück, schreib doch mal welche Aktionen wo ausgeführt werden sollen ?
Gruß Karo
Ps.evtl. reichen dir ja ein ein paar Zeilen mittels 'Makro aufzeichnen' erzeugten Code :
Ja ich dachte deine eigentliche Frage war 'wie ermittle ich die Adresse der aktuell selektierten Zelle und wie rufe ich sie auf'.
Aber erst mal eine Gegenfrage :
Das Makro soll doch bestimmt etwas mehr tun als nur von einer selektierten Zellle zu A1 zu hopsen und wieder zurück, schreib doch mal welche Aktionen wo ausgeführt werden sollen ?
Gruß Karo
Ps.evtl. reichen dir ja ein ein paar Zeilen mittels 'Makro aufzeichnen' erzeugten Code :
Code: Alles auswählen
dim document as object
dim dispatcher as object
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "A1" 'Bestimmen der Adresse
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1()) 'und ausführen
Hallo Charly, hallo Karo
das Makro läuft jetzt. Die Zellmarkierung war das, was noch gefehlt hat (deren Notwendigkeit war mir in meiner ursprünglichen Fragestellung aber auch gar nicht bewusst).
Nochmals vielen Dank für Eure Lösungen. Zukünftig weiss ich, wie Zellen unabhängig vom Tabellenblatt ansprechen kann.
Viele Grüße
WN
das Makro läuft jetzt. Die Zellmarkierung war das, was noch gefehlt hat (deren Notwendigkeit war mir in meiner ursprünglichen Fragestellung aber auch gar nicht bewusst).
Nochmals vielen Dank für Eure Lösungen. Zukünftig weiss ich, wie Zellen unabhängig vom Tabellenblatt ansprechen kann.
Viele Grüße
WN
Hallo Karo,
ich habe gerade gesehen, dass Du mir gestern noch geantwortet hast.
Zu Deiner Gegenfrage:
Das Makro soll Werte der aktuellen Zelle umrechnen, die vorher eingegeben wurden (das Makro wird entweder durch eine Tastenkombination ausgelöst bzw. mit einem Symbol verbunden). Um die Eingabe nicht mit der Enter-Taste bestätigen und dann wieder in die Zelle zurückspringen zu müssen, soll die Berechnung auch dann funktionieren, wenn sich der Wert noch in der Eingabe befindet. Nur aus diesem Grund habe ich die Konstruktion mit dem Sprung in die Zelle A1 (hätte mit anderen Zellen auch funktioniert) und wieder zurück benötigt.
Der Code lautet jetzt wie folgt:
odoc = thisComponent
Controller = odoc.currentcontroller
mysheet=odoc.currentcontroller.activesheet
dim i as double
Zelleaktuell=odoc.getCurrentSelection().getCellAddress()
oRow=Zelleaktuell.Row
oColumn=Zelleaktuell.column
oZiel1 = mySheet.getCellByPosition(0,0)
Controller.select(oZiel1)
oZiel2= mySheet.getCellByPosition(ocolumn,orow)
Controller.select(oZiel2)
oziel2 = odoc.getCurrentSelection().value
i = oziel2
i = i/1.95583
oziel2 = odoc.getCurrentSelection()
oziel2.value = i
oziel2.numberformat = 106
Bis jetzt konnte ich noch keine Fehler finden. Bestimmt hätte man das Ganze auch einfacher programmieren können. Ich bin aber schon ganz froh, dass ich mit Eurer Hilfe soweit gekommen bin.
Jetzt hätte ich aber noch eine Frage:
Wo finde ich Literatur darüber, welche Objekte erstellt werden können (z.B. der CurrentController), was mit diesen angestellt werden kann bzw. wie man Zellen anspricht ? Ich habe zwar ein Buch über die OpenOffice-Programmierung. Dieses hat mir aber in dem Fall nicht weitergeholfen.
Ich habe auch schon versucht, den Zellsprung aufzuzeichnen und habe denselben Code erhalten, den Du gestern gepostet hast. Aber hier muss ich zugeben, dass ich diesen nicht verstanden habe. Da waren mir zu viele "Unbekannte" enthalten.
Viele Grüße
WN
ich habe gerade gesehen, dass Du mir gestern noch geantwortet hast.
Zu Deiner Gegenfrage:
Das Makro soll Werte der aktuellen Zelle umrechnen, die vorher eingegeben wurden (das Makro wird entweder durch eine Tastenkombination ausgelöst bzw. mit einem Symbol verbunden). Um die Eingabe nicht mit der Enter-Taste bestätigen und dann wieder in die Zelle zurückspringen zu müssen, soll die Berechnung auch dann funktionieren, wenn sich der Wert noch in der Eingabe befindet. Nur aus diesem Grund habe ich die Konstruktion mit dem Sprung in die Zelle A1 (hätte mit anderen Zellen auch funktioniert) und wieder zurück benötigt.
Der Code lautet jetzt wie folgt:
odoc = thisComponent
Controller = odoc.currentcontroller
mysheet=odoc.currentcontroller.activesheet
dim i as double
Zelleaktuell=odoc.getCurrentSelection().getCellAddress()
oRow=Zelleaktuell.Row
oColumn=Zelleaktuell.column
oZiel1 = mySheet.getCellByPosition(0,0)
Controller.select(oZiel1)
oZiel2= mySheet.getCellByPosition(ocolumn,orow)
Controller.select(oZiel2)
oziel2 = odoc.getCurrentSelection().value
i = oziel2
i = i/1.95583
oziel2 = odoc.getCurrentSelection()
oziel2.value = i
oziel2.numberformat = 106
Bis jetzt konnte ich noch keine Fehler finden. Bestimmt hätte man das Ganze auch einfacher programmieren können. Ich bin aber schon ganz froh, dass ich mit Eurer Hilfe soweit gekommen bin.
Jetzt hätte ich aber noch eine Frage:
Wo finde ich Literatur darüber, welche Objekte erstellt werden können (z.B. der CurrentController), was mit diesen angestellt werden kann bzw. wie man Zellen anspricht ? Ich habe zwar ein Buch über die OpenOffice-Programmierung. Dieses hat mir aber in dem Fall nicht weitergeholfen.
Ich habe auch schon versucht, den Zellsprung aufzuzeichnen und habe denselben Code erhalten, den Du gestern gepostet hast. Aber hier muss ich zugeben, dass ich diesen nicht verstanden habe. Da waren mir zu viele "Unbekannte" enthalten.
Viele Grüße
WN
Hey WN,

Gruss
Thomas
Was hast du denn für ein Buch? Im ersten Post dieses Forums werden diverse Literaturquellen genannt - da sollte was dabei seinIch habe zwar ein Buch über die OpenOffice-Programmierung.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Hallo WN!
Ich habe mir deinen Code angeschaut. Ich glaube da sind ein paar überflüssige Befehle darin. Um die aktuelle Zelle oZiel2 zu markieren, brauchst du den ganzen Umweg mit der Ermittlung der Zeile und Spalte gar nicht machen. Es genügt: oZiel2 = oDoc.getCurrentSelection()
Hier mein Vorschlag:
Ich habe das übrige unverändert gelassen. Allerdings würde ich die Variable oZiel2 nicht sowohl als Objektvariable als auch als Wertvariable verwenden. Denn dann ersparst du dir dieser Variablen nochmals, die Zelle als Objekt zuweisen zu müssen.
gruß Charly
Ich habe mir deinen Code angeschaut. Ich glaube da sind ein paar überflüssige Befehle darin. Um die aktuelle Zelle oZiel2 zu markieren, brauchst du den ganzen Umweg mit der Ermittlung der Zeile und Spalte gar nicht machen. Es genügt: oZiel2 = oDoc.getCurrentSelection()
Hier mein Vorschlag:
Code: Alles auswählen
odoc = thisComponent
Controller = odoc.currentcontroller
mysheet=Controller.activesheet
dim i as double
oZiel2 = oDoc.getCurrentSelection()
oZiel1 = mySheet.getCellByPosition(0,0)
Controller.select(oZiel1)
Controller.select(oZiel2)
oZiel2 = odoc.getCurrentSelection().value
i = oziel2
i = i/1.95583
oziel2 = odoc.getCurrentSelection()
oziel2.value = i
oziel2.numberformat = 106
gruß Charly
Hallo Charly,
wenn ich Dich richtig verstanden habe, meinst Du folgendes:
Das Ganze sieht jetzt viel eleganter aus.
Herzlichen Dank und viele Grüße
WN
wenn ich Dich richtig verstanden habe, meinst Du folgendes:
Code: Alles auswählen
odoc = thisComponent
Controller = odoc.currentcontroller
mysheet=Controller.activesheet
dim i as double
oZiel2 = oDoc.getCurrentSelection()
oZiel1 = mySheet.getCellByPosition(0,0)
Controller.select(oZiel1)
Controller.select(oZiel2)
i = odoc.getCurrentSelection().value
i = i/1.95583
oziel2.value = i
oziel2.numberformat = 106
Herzlichen Dank und viele Grüße
WN
Hallo WN!
Genauso habe ich es gemeint.
Statt:
kannst du auch kürzer schreiben:
Gruß
Charly
Genauso habe ich es gemeint.
Statt:
Code: Alles auswählen
i = odoc.getCurrentSelection().value
Code: Alles auswählen
i = oZiel2.value
Charly