Seite 1 von 1
(gelöst) Suchen-Ersetzen-Makro
Verfasst: Di 2. Jan 2024, 16:28
von Freischreiber
Hallo (und ein Gutes Neues Jahr),
gerade war ich einmal vorbildlich und habe mir aus dem deutschen OO-Makro-Lehrbuch von Pitonyak (Quelle:
https://makromador.wordpress.com/oome-o ... explained/) ein einfaches Suchen- und Ersetzen-Makro vorgenommen, das ich nach eigenen Bedürfnissen erweitern will.
Und zwar das folgende:
Code: Alles auswählen
Listing 379. Ersetzt „hallo du“ durch „hallo ich“.
oDescriptor = oDoc.createReplaceDescriptor()
With oDescriptor
.SearchString = "hallo du"
.ReplaceString = "hallo ich"
End With
oDoc.ReplaceAll(oDescriptor)
Pechvogel, wie ich bin, laufen bei mir nicht einmal Mustermakros aus Lehrbüchern. Es kommt "Objektvariable nicht belegt", obwohl ich schon mit
Print ThisComponent.getURL()
geprüft habe, daß das Makro auch im richtigen Dokument ausgeführt wird.
Nach Herumprobieren habe ich dann eine funktionierende Variante gefunden:
Code: Alles auswählen
Sub SuchenErsetzen
Print ThisComponent.getURL()
oDescriptor = ThisComponent.createReplaceDescriptor()
With oDescriptor
.SearchString = "hallo du"
.ReplaceString = "hallo ich"
End With
ThisComponent.ReplaceAll(oDescriptor)
End Sub
Und frage mich jetzt: warum?? und warum nicht so, wie es im Buch steht?
Freue mich über Hinweise,
Freischreiber
Re: Suchen-Ersetzen-Makro
Verfasst: Di 2. Jan 2024, 19:47
von mikele
Hallo,
das Listing 379 ist etwas unvollständig und auch inkonsistent gegenüber dem vorangegangenen.
Knackpunkt ist die Zeile
oDoc ist eine (Objekt-)Variable, der vorher üblicherweise das Objekt ThisComponent übergeben wird.
Also vollständig:
Code: Alles auswählen
Sub SuchenErsetzen_hallo_du_ich
oDoc= ThisComponent
oDescriptor = oDoc.createReplaceDescriptor()
With oDescriptor
.SearchString = "hallo du"
.ReplaceString = "hallo ich"
End With
oDoc.ReplaceAll(oDescriptor)
End Sub
Konsistenter wäre das Listing in der Form:
Code: Alles auswählen
oDescriptor = ThisComponent.createReplaceDescriptor()
With oDescriptor
.SearchString = "hallo du"
.ReplaceString = "hallo ich"
End With
ThisComponent.ReplaceAll(oDescriptor)
oder gleich vollständig:
Code: Alles auswählen
Sub SimpleSearchReplace
Dim oDescriptor 'Der Ersetzungsdeskriptor
oDescriptor = ThisComponent.createReplaceDescriptor()
With oDescriptor
.SearchString = "hallo du"
.ReplaceString = "hallo ich"
End With
ThisComponent.ReplaceAll(oDescriptor)
End Sub
Re: Suchen-Ersetzen-Makro
Verfasst: Mi 3. Jan 2024, 11:03
von Freischreiber
Hallo @mikele,
wenn ich das richtig sehe, ist deine konsistentere Version das, was ich durch Herumprobieren aus Versehen gebaut habe? Das nehme ich jetzt einfach mal als Kompliment.
Kann man sagen, der "Umweg" über die Variable ist nur, damit der Code kürzer wird, wenn das Objekt öfter angesprochen werden soll?
Re: Suchen-Ersetzen-Makro
Verfasst: Mi 3. Jan 2024, 13:33
von mikele
Hallo,
im Falle von ThisComponent kann man es so sehen.
deutlicher wird es, wenn ich mehrfach auf ein anderes Objet, z. B. "Tabelle 1" zugreifen möchte.
Prinzipiell kann ich jedesmal
nutzen. Einserseit ist es jeoch eine lange Zeile und zweitens (meiner Meinung nach wichtiger) wird dann jedesmal auf das Objekt ThisDocument (also auf das gesamte Calc-Datei) zugegriffen, darin dann die Tabellenobjekte angesprochen und davon die Tabelle mit dem Namen "Tabelle 1" ausgewählt.
Mit
wird die "Tabelle 1" direkt auf der Variablen oTab abgelegt (genauer: es wird ein Verweis/eine Referenz auf dieses Tabellenblatt angelegt).
Anmerkung: das kleine "o" soll nur deutlich machen, dass es sich um eine Objektvariable handelt (siehe hier
https://wiki.openoffice.org/wiki/DE/Mak ... #Variablen)
Nach dieser Logik ist es konsequent auch für das Dokument eine Variable zu nutzen:
Code: Alles auswählen
oDoc=ThisComponent
oTab=oDoc.Sheets.getByName("Tabelle 1")
Edit: im Originalpost habe ich "ThisDocument" geschrieben, was es gar nicht gibt und nun korrigiert ist
Re: Suchen-Ersetzen-Makro
Verfasst: Mi 3. Jan 2024, 13:48
von karolus
Hallo
»
thisComponent« ist ja nicht nur eine »Variable« sondern genaugenommen eine »globale Funktion« die entweder:
- das momentan aktive Dokument(-objekt) zurückgibt
oder (im Fall der Makrocode ist in einem Dokument gespeichert)
- eben dieses Dokument(-objekt)
Da diese Funktion einerseits ein wenig Laufzeit benötigt, und andererseits in komlexeren langlaufenden Code auch mal das »falsche« Dokument zurückgeben kann, würde ich grundsätzlich dazu raten das exakt einmal zu verwenden und einer Variablen zuzuweisen.
Re: Suchen-Ersetzen-Makro
Verfasst: Mi 3. Jan 2024, 16:51
von Freischreiber
mikele hat geschrieben: ↑Mi 3. Jan 2024, 13:33
...
Mit
wird die "Tabelle 1" direkt auf der Variablen oTab abgelegt (genauer: es wird ein Verweis/eine Referenz auf dieses Tabellenblatt angelegt).
Anmerkung: das kleine "o" soll nur deutlich machen, dass es sich um eine Objektvariable handelt (siehe hier
https://wiki.openoffice.org/wiki/DE/Mak ... #Variablen)
Nach dieser Logik ist es konsequent auch für das Dokument eine Variable zu nutzen:
Code: Alles auswählen
oDoc=ThisComponent
oTab=oDoc.Sheets.getByName("Tabelle 1")
Ich weiß jetzt nicht, wo das "ThisDocument" herkommt, aber damit müßte die Version mit der Variablen doch
Code: Alles auswählen
oDoc=ThisDocument
oTab=oDoc.Sheets.getByName("Tabelle 1")
heißen?
Jedenfalls: mit der Zeile "oDoc= ThisComponent" läuft das Listing 379. Vielen Dank!
Sehr interessant, das mit dem mehrfachen Zugriff, der jedesmal Laufzeit benötigt. Das macht vielleicht bereits dann etwas aus, wenn da viele Suchen-Ersetzen-Paare drin stehen...
Vielen Dank für die Erklärungen!
Re: (gelöst) Suchen-Ersetzen-Makro
Verfasst: Mi 3. Jan 2024, 20:03
von mikele
Hallo,
So ein Quatsch, natürlich muss es ThisComponent heißen
Ich korrigiere meinen Post dahingehend.