LO CALC - Run Macro Hidden

Hallo,

folgendes Makro-Problem:

Mit einem kleinen Perl-Programm [2] starte ich ein Makro [1], das (in diesem vereinfachten Beispiel) weiter nichts tut, als in einer bestehenden CALC-Datei ("E:\TMP\RunMacroHidden.ods") in die Zelle "A1" die Zeichenkette "Hello world !" zu schreiben

So lange die beiden Makro-Zeilen | ' aPV1(0).name = "Hidden" | und | ' aPV1(0).value = True | (entnommen von [4]) auskommentiert sind funktioniert alles prima.

Jetzt möchte ich aber, dass das Ganze "Hidden" abläuft, die Tabellendatei nicht geöffnet wird.

Wenn ich nun die beiden oben genannten Zeilen de-kommentiere, kommt für die Makrozeile "oF = ThisComponent.CurrentController.Frame" die Fehlermeldung "BASIC-Laufzeitfehler. Eigenschaft oder Methode nicht gefunden: CurrentController."

Im Prinzip meine ich schon zu verstehen, warum: Da nix mehr angezeigt wird, gibt es wohl auch keinen "CurrentController". Und in Folge davon hat dann auch die Objekt-Variable "oF", die bei den "uno"-Kommandos benötigt wird, sicherlich auch keinen Inhalt.

So meine Frage:

Was muss man anders beziehungsweise noch zusätzlich angeben, damit die Fehlermeldung nicht mehr kommt und die Objekt-Variable "oF" die "uno"-Kommandos mit der benötigten Information versorgt ?

In [3] "OpenOffice.org-Makros" sowie [4] "OpenOffice.org Makros - Kochbuch" wird zwar eine Menge zur Funktionsweise von "StarDesktop"/"Frames"
ausgeführt und in [4] erscheint mir die Zeile "oDoc.getCurrentController().getFrame().getContainerWindow().setVisible(true)" sehr hinweisverdächtig was zu tun ist, aber dennoch hat es bei mir nicht den Geistesblitz für die richtigen Schlussfolgerungen erzeugt - leider, ich komme da nicht wirklich weiter :-(( ...

Vielen Dank im Voraus für Hinweise und Tipps,

Grüße
Hans-Werner

Hallo Hans,

eigentlich weisst Du ja, warum es nicht geht;)

Lädst Du das Dokument "hidden", gibt es keinen Frame - also kein Fenster. Das Objekt (oDoc) existiert nur im Hauptspeicher.

Was immer Du mit Makros machen möchtest... vergiss den Dispatcher Code. DA du keine Ahnung hast, was der tatsächlich im Hintergrund macht und keine "echte" Kontrolle ausüben kannst, nutze ihn gar nicht oder nur im äußersten Notfall.

Sowohl bei Pitoniak als auch in dem Makro-Grundlagen Buch kannst Du recht anschaulich die Basis-Programmierung erlernen - ohne je auf Dispatcher Code ausweichen zu müssen.

Deine Aufgabenstellung hingegen ist sehr einfach:

bis zurZeile oDoc übernehmen. Jetzt hast Du das Objekt des Dokumentes im Speicher.

Zugriff auf das Zellobjekt (hier Zelle A1 des Tabellenblattes):

oZelle = oDoc.getSheets().GetByName("<NamedesTabellenblattes>").getCellRAngeByName("A1")

Die Zelle kann drei unterschiedliche Inhalte aufnehmen: Texte, Formeln oder Zahlen (Werte). Du möchtest einen String (Text) reinschreiben.

oZelle.string = "Hello World!"

Fertig.

Jetzt noch Dokument speichern:

oDoc.store()

und schliessen

oDoc.close(true)

Es gibt ein paar Nebenbedingungen, weitere Prüfungen und Sachen, die Du machen könntest oder anpassen solltest ... aber das würde hier zu weit führen. Beschäftige Dich wirklich mit den Grundlagen:)

Hier die Makro Zusammenfassung:

Sub RunMacroHidden

Dim oD as Object
Dim oDoc as Object
Dim oF as Object
Dim PathFile as String

PathFile = "E:\TMP\RunMacroHidden.ods"

aPV1(0).name = "Hidden"
aPV1(0).value = True

oDoc = StarDesktop.loadComponentFromURL(ConvertToURL(PathFile),"_blank",0,aPV1())
oZelle = oDoc.getSheets().GetByName("<NamedesTabellenblattes>").getCellRAngeByName("A1")
oZelle.string = "Hello World!"
oDoc.store()
oDoc.close(true)

end sub

VG Thomas

Hallo Thomas,

ich danke Dir für Deine Erläuterungen und Hinweise.

Dass ich den DISPATCHER-CODE nutzte (beziehungsweise nutzte) hat eine ganz einfache Erklärung: Meinen ersten Kontakt mit der Makro-Programmierung hatte ich über den MacroRecorder, der nun mal bei LO (systembedingt) DISPATCHER-CODE auflistet. Damals dachte ich mir, na gut, warum 2 "Wege gehen", wenn es auch mit einem Weg zu funktionieren scheint. So blieb ich am DISPATCHER-CODE "hängen". Ich merkte schon (bald), dass es viel schwieriger war, sich den entsprechenden DISPATCHER-CODE "zu beschaffen", wenn mal der MacroRecoder "nichts geliefert hat" als bei der Marko-Programmierung ohne DISPATCHER-CODE, da gibt es ONLINE viel gute und leicht verständliche Literatur :-)) ...

Ich hatte am Anfang meiner Makro-Programmierung einfach nicht überschaut, dass ich mit DISPATCHER-CODE irgendwann in problematische Bereiche gerate und deshalb (in der Rückschau) die "erste Weiche falsch gestellt", das war alles und der Rest ist einfach nur "Lehrgeld zahlen dürfen", da hätte ich wohl besser den Ratschlag im Kapitel "4.1 Dispatcher" in Deinem "OpenOffice.org Makros - Kochbuch" befolgt ;-)) ...

Dank auch für Dein Code-Beispiel. Dieser Weg war mir nicht unbekannt, ich wollte einfach nur auf der DISPATCHER-CODE "Welle weiter reiten" und habe dann den Überblick verloren :-o ...

Viele Grüße
Hans-Werner

------ Originalnachricht ------