Wechseln zwischen Tabellen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Bernhard...

Wechseln zwischen Tabellen

Beitrag von Bernhard... » So, 29.04.2018 20:33

Hallo,

gleich vorweg, ich bin blutiger Anfänger bei OO-Makros und habe mit dem Makro-Recorder ein simples Makro aufgenommen. Leider funktioniert der Recorder nur mit der aktuellen Tabelle und da fängt mein Problem an:

Ich habe das Makro ergänzt und eine neue Tabelle aufgemacht:

oDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, Array())

aber der weiterführende Code bezieht sich weiterhin auf die Ursprungstabelle, unter der auch das Makro gespeichert ist.

Wie kann ich die neueröffnete Tabelle ansprechen bzw. wie kann man generell zwischen Tabellen wechseln? Ich habe dazu noch nichts Aussagekräftiges gefunden.

Vielen Dank!

Stephan
********
Beiträge: 10521
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Wechseln zwischen Tabellen

Beitrag von Stephan » So, 29.04.2018 20:52

oDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, Array())

aber der weiterführende Code bezieht sich weiterhin auf die Ursprungstabelle, unter der auch das Makro gespeichert ist.
Wenn der weiterführende Code dispatch-Befehle enthält musst Du nach Erstellen der neuen Datei den Bezug des Dispatchers darauf herstellen, ungefähr so:

Code: Alles auswählen

oDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, Array()

document2   = oDoc
dispatcher2 = createUnoService("com.sun.star.frame.DispatchHelper")

dim args1(...) as new com.sun.star.beans.PropertyValue
args1(0).Name = ...
args1(0).Value = ...
...
dispatcher2.executeDispatch(document2, ".uno:...", "", 0, args1())
Wie kann ich die neueröffnete Tabelle ansprechen bzw. wie kann man generell zwischen Tabellen wechseln?
Einen 'generellen' Befehl gibt es nicht weil das Wechseln zwischen Tabellen eines Dokuments etwas Anderes ist als das Wechseln zwischen Tabellen verschiedener Dokumente. Wahrscheinlich solltest Du auch vom Dispatcher-Code wegkommen und besser nativen Code verwenden, einen ersten Einstieg bildet z.B.:
http://www.dannenhoefer.de/faqstarbasic ... -Calc.html



Gruß
Stephan

Bernhard.

Re: Wechseln zwischen Tabellen

Beitrag von Bernhard. » Di, 01.05.2018 12:49

Hallo Stephan,
vielen Dank für Deine Hilfe, Deine Ausführungen erscheinen mir logisch, jedoch funktioniert es bei mir nicht so ganz.
Ich habe folgendes Makro zuerst mit dem Rekorder aufgezeichnet und dann mit dem Öffnen der neuen Tabelle ergänzt.
Beim Ausführen markiert OO die vorletzte Zeile "dispatcher2.executeDispatch.....) und meldet sich mit der Fehlermeldung:

BASIC-Laufzeitfehler.
Es ist eine Exception aufgetreten.
Type: com.sun.star.lang.IllegalArgumentException
Message: cannot coerce argument type during corereflection.call!

Was habe ich da falsch gemacht?

Vielen Dank und Grüße!
Bernhard

REM ***** BASIC *****


sub Main
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Nr"
args1(0).Value = 3

dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$G$15"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())

oDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, Array()

document2 = oDoc
dispatcher2 = createUnoService("com.sun.star.frame.DispatchHelper")

dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "Nr"
args3(0).Value = 3

dispatcher2.executeDispatch(document2, ".uno:JumpToTable", "", 0, args3())

end sub

Stephan
********
Beiträge: 10521
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Wechseln zwischen Tabellen

Beitrag von Stephan » Di, 01.05.2018 13:35

die Zeile:

Code: Alles auswählen

document2 = oDoc
muss lauten:

Code: Alles auswählen

document2 = oDoc.CurrentController.Frame

nochmal aber der Hinweis, das Du im Allgemeinen mit nativem Code besser fährst als mit dispatcher-Code. In Deinem konkreten Falle sähe das z.B. so aus:

Code: Alles auswählen

Sub Main2()
	tc = ThisComponent
	akt_view = tc.CurrentController
	
   akt_view.Select(tc.Sheets(2).getCellRangeByName("G15")) 'Tabellenzählung beginnt bei 0
   
   oDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, Array())
   oDoc.CurrentController.setActiveSheet(oDoc.Sheets(2))  'Tabellenzählung beginnt bei 0
	
End Sub


Gruß
Stephan

Bernhard_mu
Beiträge: 1
Registriert: So, 29.04.2018 20:25

Re: Wechseln zwischen Tabellen

Beitrag von Bernhard_mu » Di, 01.05.2018 21:59

Funktioniert, vielen Dank!

Wie kann ich jetzt wieder auf die Ursprungstabelle wechseln?

Du hast sicher recht mit dem nativen Code, allerdings fange ich erst damit an und ich muß mir am Anfang noch mit dem Makrorecorder behelfen, um Code zu generieren.

Deine Hilfe ist echt toll!!!

Stephan
********
Beiträge: 10521
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Wechseln zwischen Tabellen

Beitrag von Stephan » Mi, 02.05.2018 08:59

Wie kann ich jetzt wieder auf die Ursprungstabelle wechseln?
Da beide Dokumente sichtbar sind, genügt es das ursprüngliche Dokument in den Vordergrund zu holen:

Code: Alles auswählen

Sub Main2()
	tc = ThisComponent
	akt_view = tc.CurrentController
	
	akt_view.Select(tc.Sheets(2).getCellRangeByName("G15")) 'Tabellenzählung beginnt bei 0
	
	oDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, Array())
	oDoc.CurrentController.setActiveSheet(oDoc.Sheets(2))  'Tabellenzählung beginnt bei 0
	
	tc.CurrentController.Frame.ContainerWindow.toFront()
End Sub

Gruß
Stephan

Antworten