Seite 1 von 1

Ansteuern einer Zelle auf einem beliebigen Tabellenblatt

Verfasst: Fr, 17.11.2006 23:57
von WN
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

Verfasst: Sa, 18.11.2006 09:19
von Karolus
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

Verfasst: Sa, 18.11.2006 21:40
von WN
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

Verfasst: Sa, 18.11.2006 22:24
von Charly
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:

Code: Alles auswählen

Controller = odoc.currentcontroller

'anzeigen der ersten Zelle

Controller.select(oZiel1)
Gruß
Charly

Verfasst: Sa, 18.11.2006 22:40
von Karolus
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 :

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

Verfasst: Sa, 18.11.2006 22:54
von WN
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

Verfasst: So, 19.11.2006 21:16
von 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

Verfasst: Mo, 20.11.2006 08:40
von Toxitom
Hey WN,
Ich habe zwar ein Buch über die OpenOffice-Programmierung.
Was hast du denn für ein Buch? Im ersten Post dieses Forums werden diverse Literaturquellen genannt - da sollte was dabei sein :-)

Gruss
Thomas

Verfasst: Mo, 20.11.2006 21:12
von WN
Hallo Thomas,

das Buch über die OpenOffice-Programmierung ist von René Martin, und danke für den Tipp mit den Links.

Gruß
WN

Verfasst: Mo, 20.11.2006 21:48
von Charly
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:

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 
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

Verfasst: Mo, 20.11.2006 22:10
von WN
Hallo Charly,

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 
Das Ganze sieht jetzt viel eleganter aus.

Herzlichen Dank und viele Grüße
WN

Verfasst: Di, 21.11.2006 07:38
von Charly
Hallo WN!

Genauso habe ich es gemeint.

Statt:

Code: Alles auswählen

i = odoc.getCurrentSelection().value 
kannst du auch kürzer schreiben:

Code: Alles auswählen

i = oZiel2.value 
Gruß
Charly