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 objectrem ----------------------------------------------------------------------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 = 4dispatcher.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 inargs4(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