Date: prev next · Thread: first prev next last
2017 Archives by date, by thread · List index


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 ------
Von: "Thomas Krumbein" <Thomas.Krumbein@documentfoundation.org>
An: users@de.libreoffice.org
Gesendet: 11.11.2017 21:17:08
Betreff: Re: [de-users] LO CALC - Run Macro Hidden

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

Am 11.11.2017 um 19:47 schrieb OoOHWHOoO:
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

---------------

[1] Makro

Sub RunMacroHidden

Dim oD as Object
Dim oDoc as Object
Dim oF as Object
Dim PathFile as String
Dim aPV1(0) as New com.sun.star.beans.PropertyValue

PathFile = "E:\TMP\RunMacroHidden.ods"
oD = createUnoService("com.sun.star.frame.DispatchHelper")

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

oDoc = StarDesktop.loadComponentFromURL(ConvertToURL(PathFile),"_blank",0,aPV1())
oF = ThisComponent.CurrentController.Frame

aPV1(0).Name = "Nr"
aPV1(0).Value = 1
oD.executeDispatch(oF,".uno:JumpToTable","",0,aPV1()

aPV1(0).Name = "ToPoint"
aPV1(0).Value = "A1"
oD.executeDispatch(oF,".uno:GoToCell","",0,aPV1())
aPV1(0).Name = "StringName"
aPV1(0).Value = "Hello world !"
oD.executeDispatch(oF,".uno:EnterString","",0,aPV1()

aPV1(0).Name = "ToPoint"
aPV1(0).Value = "A1"
oD.executeDispatch(oF,".uno:GoToCell","",0,aPV1())
oD.executeDispatch(oF,".uno:Save", "",0,Array())
oD.executeDispatch(oF,".uno:CloseDoc","",0,Array())
oD.executeDispatch(oF,".uno:CloseWin","",0,Array())

End Sub

[2] Externer Makro-Aufruf via Perl

use strict;
use warnings;

my $L; # Libre Office
my $M; # Makro

$L = "C:/Program Files/LibreOffice 5/program/soffice.exe";
$M = "macro:///Standard.Temporary.RunMacroHidden";

`"$L" --nologo "$M"`;

---------------

[3] Andrew Pitonyak: OpenOffice.org-Makros erklärt - Ins Deutsche übertragen und mit einem Beitrag von Volker Lenhardt ( http://www.uni-due.de/~abi070/count.php?id=OOME_3_0_deutsch.odt )

[4] Thomas Krumbein: OpenOffice.org Makros - Kochbuch ( https://www.wollmux.net/wiki/images/f/f9/Makro_Kochbuch.pdf )



-- Liste abmelden mit E-Mail an: users+unsubscribe@de.libreoffice.org
Probleme? https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert


--
Liste abmelden mit E-Mail an: users+unsubscribe@de.libreoffice.org
Probleme? https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: https://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.