Per Button das Makro eines anderen Dokuments starten
Moderator: Moderatoren
-
- ****
- Beiträge: 117
- Registriert: So, 09.05.2010 09:53
- Wohnort: Coburg
- Kontaktdaten:
Per Button das Makro eines anderen Dokuments starten
Hallo!
Ich würde gerne per Buttonklick im Dokument2.odt ein Makro starten, welches im Dokument1.odt enthalten ist. Dummerweise habe ich gerade gesehen, dass sobald ich auf die Eigenschaften des Kontrollfelds "Button" gehe und dann auf "Makro zuweisen" mir lediglich die Makros des jeweiligen Dokuments zur Verfügung stehen oder die, welche in OpenOffice gespeichert sind.
Nun ist es etwas unglücklich, weil ich innerhalb des Dokumentes1 eine globale Variable (Datenbankverbindung) deklariert habe welche ich dann im Dokument2 brauche, deshalb wollte ich per Tastendruck auf ein Makro des Dokuments1 zugreifen.
Hat jemand einen Lösungsvorschlag?
Gruß
Arek
Ich würde gerne per Buttonklick im Dokument2.odt ein Makro starten, welches im Dokument1.odt enthalten ist. Dummerweise habe ich gerade gesehen, dass sobald ich auf die Eigenschaften des Kontrollfelds "Button" gehe und dann auf "Makro zuweisen" mir lediglich die Makros des jeweiligen Dokuments zur Verfügung stehen oder die, welche in OpenOffice gespeichert sind.
Nun ist es etwas unglücklich, weil ich innerhalb des Dokumentes1 eine globale Variable (Datenbankverbindung) deklariert habe welche ich dann im Dokument2 brauche, deshalb wollte ich per Tastendruck auf ein Makro des Dokuments1 zugreifen.
Hat jemand einen Lösungsvorschlag?
Gruß
Arek
Re: Per Button das Makro eines anderen Dokuments starten
Aloha
Eine Lösungsmöglichkeit wäre der ScriptProvider von Dokument1 ala
(in Dokument2)
(In Dokument1 )
Deine in Dokument1 deklarierte Variable wird auch dann in Dokument2 nicht sichtbar sein.arkadiuszpaluszek hat geschrieben:Nun ist es etwas unglücklich, weil ich innerhalb des Dokumentes1 eine globale Variable (Datenbankverbindung) deklariert habe welche ich dann im Dokument2 brauche, deshalb wollte ich per Tastendruck auf ein Makro des Dokuments1 zugreifen.
Eine Lösungsmöglichkeit wäre der ScriptProvider von Dokument1 ala
(in Dokument2)
Code: Alles auswählen
Sub ExecuteMacroInOtherDoc
sLibName = "Standard"
sModuleName = "Module1"
sMakroName = "ReturnConnection"
oScript = Dokument1.ScriptProvider.getScript("vnd.sun.star.script:" & sLibName & "." & sModuleName & "." & sMakroName _
& "?language=Basic&location=document")
Dim oCon as Object
oScript.invoke(Array(oCon),Array(),aReturnValues)
oCon = aReturnValues(0)
End Sub
Code: Alles auswählen
Sub ReturnConnection(Dummy)
Dummy = oConnection
End Sub
-
- ****
- Beiträge: 117
- Registriert: So, 09.05.2010 09:53
- Wohnort: Coburg
- Kontaktdaten:
Re: Per Button das Makro eines anderen Dokuments starten
O.k., hört sich sehr gut an, aber minimalisieren wir es zunächst auf ein einfacheres Beispiel. Ich habe ein geöffnetes Dokument mit dem Namen "test2.odt" welches fologendes Makro beinhaltet:
Im Dokoment "test.odt" habe ich dagegen Dein Makro, welches ich ein bisschen vereinfach habe:
Blöderweise führt das ganze zu einem Fehler, es heißt "Objektvariable nicht belegt", wobei die Zeile oScript=MyDokument.... markiert wird - zum "invoke" kommt es erst gar nicht - wo ist der Fehler?
Gruss
Arek
Code: Alles auswählen
Sub MakroTest
Msgbox ("Hello World!")
End Sub
Code: Alles auswählen
Sub ExecuteMacroInOtherDoc
sLibName = "Standard"
sModuleName = "Module1"
sMakroName = "MakroTest"
MyDokument="test2.odt"
oScript = MyDokument.ScriptProvider.getScript("vnd.sun.star.script:" & sLibName & "." & sModuleName & "." & sMakroName & "?language=Basic&location=document")
oScript.invoke()
End Sub
Gruss
Arek
Re: Per Button das Makro eines anderen Dokuments starten
Aloha
Da ich Deinen Code nicht kenne (und daher nicht weiss, ob und wie Du das andere Dokument referenzierst), einfach mal mithilfe des ComponentWalkers:
"myDocument" muss logischerweise die Referenz auf das Dokumentmodel des jeweils anderen Dokuments beinhalten, dort ist schliesslich Deine "MakroTest"-Prozedur und nur von dort kann der ScriptProvider Dir die Prozedur zur Verfügung stellen.arkadiuszpaluszek hat geschrieben:Blöderweise führt das ganze zu einem Fehler, es heißt "Objektvariable nicht belegt", wobei die Zeile oScript=MyDokument.... markiert wird - zum "invoke" kommt es erst gar nicht - wo ist der Fehler?
Da ich Deinen Code nicht kenne (und daher nicht weiss, ob und wie Du das andere Dokument referenzierst), einfach mal mithilfe des ComponentWalkers:
Code: Alles auswählen
sLibName = "Standard"
sModuleName = "Module1"
sMakroName = "MakroTest"
sOtherDocumentsTitle = "test2.odt"
oComponents = StarDesktop.getComponents
enumComponents = oComponents.createEnumeration
Do While enumComponents.hasMoreElements
thisElement = enumComponents.nextElement
If thisElement.Title = sOtherDocumentsTitle Then
MyDokument = thisElement
Exit Do
End If
Loop
If isEmpty(MyDokument) Then Exit Sub
oScript = MyDokument.ScriptProvider.getScript("vnd.sun.star.script:" & sLibName & "." & sModuleName & "." & sMakroName & _
"?language=Basic&location=document")
oScript.invoke(Array(),Array(),Array())
-
- ****
- Beiträge: 117
- Registriert: So, 09.05.2010 09:53
- Wohnort: Coburg
- Kontaktdaten:
Re: Per Button das Makro eines anderen Dokuments starten
Super, es funktioniert, danke! Etwas umständlich finde ich allerdings den Weg über den ComponentWalker der sich durch alle offenen Dokumente durchwühlt bis er bei "test2.odt" ankommt, aber es scheint wohl, dass es keine Möglichkeit gibt die Datei z.B. direkt über den Namen anzusprechen, oder? Zumindest wenn ich sage
myDoc=StarDesktop.GetComponents
verfügt dann myDoc nicht über die Methode "GetByName", schade eigentlich! Aber - auch mit dem ComponentWalker funktioniert es, also schon mal herzlichen Dank!
Gruss
Arek
myDoc=StarDesktop.GetComponents
verfügt dann myDoc nicht über die Methode "GetByName", schade eigentlich! Aber - auch mit dem ComponentWalker funktioniert es, also schon mal herzlichen Dank!
Gruss
Arek
Re: Per Button das Makro eines anderen Dokuments starten
Aloha
Man könnte jetzt über die URL gehen - aber was ist dann mit Dateien, die noch nicht gespeichert sind, aber natürlich trotzdem offen?
Du siehst, nicht so einfach, wie man sich das vorstellt
Deshalb werden die geöffneten Dokument nicht aktiv vorgehalten (=mit ihrem Namen/Titel/wasauchimmer in einem Container zwischengespeichert), sondern es wird nur bei Bedarf betrachtet, was genau denn gerade geöffnet ist.
Abgesehen davon:
Bei genauerem Hinsehen frage ich mich gerade, ob Du diesen Weg überhaupt gehen musst.
Die Connection kannst Du doch einfach im fraglichen Dokument neu aufbauen (bzw. die Connection muss bei Standardeinstellungen mit Connection-Pooling in der Regel noch nichtmal neu hergestellt werden, sondern wird ja eh vorgehalten).
Das dürfte Dir einige Umstände ersparen.
Naja, wie viele Dokumente hat man denn schon offen? Die Enumeration und das Finden des anderen Dokuments sieht im Code komplizierter aus, als es im tatsächlichen Makro-Lauf ist, das geht blitzschnell.arkadiuszpaluszek hat geschrieben:Etwas umständlich finde ich allerdings den Weg über den ComponentWalker der sich durch alle offenen Dokumente durchwühlt bis er bei "test2.odt" ankommt
Da theoretisch zwei Dateien offen sein können mit dem gleichen Titel ("C:\a.ods" und "D:\a.ods" => beides "a.ods") wäre das etwas problematisch.arkadiuszpaluszek hat geschrieben:aber es scheint wohl, dass es keine Möglichkeit gibt die Datei z.B. direkt über den Namen anzusprechen, oder?
Man könnte jetzt über die URL gehen - aber was ist dann mit Dateien, die noch nicht gespeichert sind, aber natürlich trotzdem offen?
Du siehst, nicht so einfach, wie man sich das vorstellt

Deshalb werden die geöffneten Dokument nicht aktiv vorgehalten (=mit ihrem Namen/Titel/wasauchimmer in einem Container zwischengespeichert), sondern es wird nur bei Bedarf betrachtet, was genau denn gerade geöffnet ist.
Abgesehen davon:
Bei genauerem Hinsehen frage ich mich gerade, ob Du diesen Weg überhaupt gehen musst.
Die Connection kannst Du doch einfach im fraglichen Dokument neu aufbauen (bzw. die Connection muss bei Standardeinstellungen mit Connection-Pooling in der Regel noch nichtmal neu hergestellt werden, sondern wird ja eh vorgehalten).
Das dürfte Dir einige Umstände ersparen.