Hallo Gerhard,
"Paste" und "InsertContents" sind beides UNO-Befehle, die aber etwas
völlig unterschiedliches tun:
[1] "Paste" entspricht "LO≡calc [Einfügen] -> [Einfügen]"
[2] "InsertContents" entspricht "LO≡calc [Einfügen] -> [Einfügen]
[Inhalte Einfügen]"
Mit Unterschieden zwischen Makro-Programmierung und Makro-Aufzeichnung
hat das nichts zu tun, beides basiert in diesem Fall auf der Verwendung
von UNO-Befehlen.
LO basiert intern auf UNO-Befehlen und deshalb kann sich da für den
Anwender schon mal etwas ändern, wenn LO-intern etwas geändert wird.
Das andere sind die Makro-Programmiersprachen wie z.B. die BASIC-IDE
(Integrated Development Environment), welche auch die Möglichkeit zur
Bearbeitung von z.B. "LO≡calc"-Dokumenten beinhalten, nur heißen da die
Befehle anders. Sie stellen quasi eine Oberfläche dar, die auf die
UNO-Befehle "aufgesetzt" ist. Man kann auch (einfach ausgedrückt) sagen,
dass sie die UNO-Befehle "kapseln/verbergen" und der "Kapsel" einen
anderen (Befehls-) Namen geben.
[3] Beispiel: Nur den Inhalt der Zellen A1:A15 nach D1:D15 kopieren
[3.1] Makro BASIC
dim aData()
dim oTab as variant, oBereich as Variant, oZielbereich as Variant
oTab = thisComponent.sheets(0)
oBereich = oTab.getCellRangeByName("A1:A15")
aData = oBereich.getDataArray()
oZielbereich = oTab.getCellRangeByName("D1:D15")
oZielbereich.setDataArray(aData)
[3.2] Makro UNO
dim document as object
dim dispatcher as object
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 = "$A$1:$A$15"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = "$D$1:$D$15"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
Beide Makros sind in ihrer Wirkung identisch. Das BASIC Makro benutzt,
für den Benutzer unsichtbar, LO-intern auch die UNO-Befehle.
[4] Vorteile/Nachteile
[4.1] BASIC Makro
[4.1.1] Vorteile: Änderungen auf der UNO-Ebene wirken sich (für den
Benutzer) nicht aus, das sie (hoffentlich immer) von den LO-Entwicklern
"eingepflegt" werden.
[4.1.2] Nachteile: Für manche Aktionen, die man z.B. mit
"LO≡calc"-Dokumenten machen kann, gibt es keine BASIC-Befehle.
[4.2] UNO Makro
[4.2.1] Vorteile: Man kann mit "LO≡calc"-Dokumenten Dinge tun, für die
es keine BASIC-Befehle gibt.
[4.2.2] Nachteile: LO-interne Änderungen bei UNO-Befehlen muss man
selbst "nachkorrigieren".
[5] Literatur
Sehr empfehlenswert, da sehr ausführlich:
[ENG] http://www.pitonyak.org/OOME_3_0.pdf
[ENG] http://www.pitonyak.org/OOME_3_0.odt
Deutsche Übersetzung von "Pitonyak":
[DEU]
https://www.uni-due.de/~abi070/files/OOo/OOME/OOME_3_0_deutsch.pdf
[DEU] https://www.uni-due.de/~abi070/count.php?id=OOME_3_0_deutsch.odt
Weitere Makro-Beispiele:
[DEU] https://www.wollmux.net/wiki/images/f/f9/Makro_Kochbuch.pdf
Ich bin jetzt auch nicht der "große & erfahrene" Makro-Programmierer,
aber im "Großen & Ganzen" sollte das schon passen, was ich da
kommuniziert habe,
Gruß Hans-Werner
------ Originalnachricht ------
Von: "Gerhard Weydt" <gerhard.weydt@t-online.de>
An: users@de.libreoffice.org
Gesendet: 20.08.2017 01:25:53
Betreff: Re: [de-users] Calc, Makroaufzeichnung,Bereiche kopieren
Hallo Günter,
beim Aufräumen in meinem Postfach habe ich die angehängte Mail
gefunden. Da war ja keine Antwort vonnöten, aber ich hatte sie wohl mal
stehen lassen, um zu sehen, ob da noch was kommt.
Aber ich denke, dass das ein typisches Beispiel ist, wie sich
Makro-Aufzeichnung und Programmierung mit Uno unterscheiden. Ich
spekuliere da ein bisschen, weil ich auch nicht genau weiß, was
wirklich im Programm passiert, aber ich glaube doch, dass ich im
Wesentlichen das Richtige treffe.
Ich habe versucht, ein entsprechendes Makro aufzuzeichnen, aber statt
des komplizierten "InsertContents" wurde bei mir nur ein "Paste"
generiert, ich kann nicht sagen, ob das am Release oder etwas anderem
liegt. Aber sei's drum: entweder das oder die Änderung der Wertes des
Parameters "args4(5).Value", die du herausgefunden hast, zeigen in die
selbe Richtung: die Aufzeichnung nimmt die aktuellen Werte, die in der
Programmierung der Oberfläche verwendet werden, und die können sich
schnell mal ändern, weil es eben direkte Werte sind; wenn man Uno
verwendet, gibt es Variablen, die auch nach Änderungen den gleichen
Namen, aber evtl. anderen Inhalt haben.
Wenn man Uno-Befehle verwendet, findet man (für ein Datenblatt) die
Befehle CopyRange und MoveRange, bei denen man den Quellbereich und die
linke obere Zelle des Ziels benennt. Das ist auch ein anderes Vorgehen
als in der Oberfläche, die erst selektiert, dann erst sagt, was
passieren soll, und zum Schluss, wo. Ich habe diese Befehle nicht
konsequent ausprobiert, aber sie sollten die Aufgabenstellung
grundsätzlich und release-unabhängig lösen.
Wenn man häufig die gleiche Aufgabenstellung hat, also hier: ich habe
einen Bereich in einer Calc-Tabelle markiert und möchte den irgendwo
anders hinkopieren, dann funktioniert das aufgezeichnete Makro
wunderbar. Für temporäre Bedürfnisse ist das auf jeden Fall nützlich.
Bei deinem Makro, das bereits mit Variablen arbeitet, möchte ich
annehmen, dass dementsprechend die Variable" von" einen Bereich
beschreibt und die Variable "nach" die linke obere Zelle des
Zielbereichs. Dann funktioniert das auch grundsätzlich mit verschieden
großen Quellbereichen.
Aber du musst dir immer bewusst sein: Der Makro-Rekorder zeichnet die
Aktionen in der Oberfläche auf, die sich schneller mal ändert (z.B.
Menü-Befehle), während die Uno-Befehle konstant bleiben sollten. Du
musst dir also grundsätzlich überlegen: Machst du etwas "schnell
erledigt und nicht für die Ewigkeit"("quick and dirty") oder
längerfristig haltbar. Gerade bei diesem Beispiel sind das ganz
unterschiedliche Vorgehensweisen, und man kann nicht sagen, dass eine
schlechter als die andere sei. Aber bei den aufgezeichneten Makros, die
auf Oberflächenfunktionen basieren, nimmt man einfach in Kauf, dass sie
bei einem neuen Release neu erzeugt werden müssen.
Gruß
Gerhard
Am 18.04.2017 um 14:52 schrieb Günter Fritze:
Am 18.04.2017 um 14:46 schrieb Günter Fritze:
Am 18.04.2017 um 14:29 schrieb Günter Fritze:
Hallo zusammen!
Vor längerer Zeit habe ich durch Makroaufzeichnung eine Prpzedur
generieren lassen, die einen Tabellenbereich an eine andere Stelle
kopiert.
sub Copyall(von As Variant, nach As Variant)
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 = "ToPoint"
args1(0).Value = von
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0,
args1())
rem
----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
rem
----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = nach
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0,
args3())
rem
----------------------------------------------------------------------
dim args4(5) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Flags"
args4(0).Value = "A"
args4(1).Name = "FormulaCommand"
args4(1).Value = 0
args4(2).Name = "SkipEmptyCells"
args4(2).Value = false
args4(3).Name = "Transpose"
args4(3).Value = false
args4(4).Name = "AsLink"
args4(4).Value = false
args4(5).Name = "MoveMode"
args4(5).Value = 4
dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0,
args4())
end sub
Diese Prozedur funktionierte mindestens 6 Monate einwandfrei.
Ich war jetzt gezwungen mein Linuxsystem LinuxMint neu zu
installieren.
Die neue Version ist.
Version: 5.1.4.2
Build-ID: 1:5.1.4-0ubuntu1
CPU-Threads: 4; BS-Version: Linux 4.4; UI-Render: Standard;
Gebietsschema: de-DE (de_DE.UTF-8)
Die Kopien bringen teilweise unsinnige Ergebnisse. Ich habe nun eine
neue Prozedure generieren lassen, und siehe da: Es geht wieder. Die
einzigen Unterschiede sind in
args4(5) steht statt der 4 eine 6.
Vielleicht ist damit einem Mitstreiter geholfen.
MfG
Günter Fritze
-- Liste abmelden mit E-Mail an: users+unsubscribe@de.libreoffice.org
Probleme?
http://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://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? http://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://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.