🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

(gelöst) Suchen-Ersetzen-Makro

WRITER hat alles, was Sie von einer modernen, voll ausgestatteten Textverarbeitung erwarten.
Antworten
Freischreiber
* LO-Experte *
Beiträge: 834
Registriert: Fr 28. Mär 2014, 10:41

(gelöst) Suchen-Ersetzen-Makro

Beitrag von Freischreiber » Di 2. Jan 2024, 16:28

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
Zuletzt geändert von Freischreiber am Mi 3. Jan 2024, 16:52, insgesamt 1-mal geändert.
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

mikele
* LO-Experte *
Beiträge: 1932
Registriert: Mo 1. Aug 2011, 20:51

Re: Suchen-Ersetzen-Makro

Beitrag von mikele » Di 2. Jan 2024, 19:47

Hallo,
das Listing 379 ist etwas unvollständig und auch inkonsistent gegenüber dem vorangegangenen.
Knackpunkt ist die Zeile

Code: Alles auswählen

oDescriptor = oDoc.createReplaceDescriptor()
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
Gruß,
mikele

Freischreiber
* LO-Experte *
Beiträge: 834
Registriert: Fr 28. Mär 2014, 10:41

Re: Suchen-Ersetzen-Makro

Beitrag von Freischreiber » Mi 3. Jan 2024, 11:03

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. :D

Kann man sagen, der "Umweg" über die Variable ist nur, damit der Code kürzer wird, wenn das Objekt öfter angesprochen werden soll?
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

mikele
* LO-Experte *
Beiträge: 1932
Registriert: Mo 1. Aug 2011, 20:51

Re: Suchen-Ersetzen-Makro

Beitrag von mikele » Mi 3. Jan 2024, 13:33

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

Code: Alles auswählen

ThisComponent.Sheets.getByName("Tabelle 1")
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

Code: Alles auswählen

oTab=ThisComponent.Sheets.geByname("Tabelle 1")
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
Zuletzt geändert von mikele am Mi 3. Jan 2024, 20:06, insgesamt 1-mal geändert.
Gruß,
mikele

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2539
Registriert: Fr 10. Dez 2010, 10:01

Re: Suchen-Ersetzen-Makro

Beitrag von karolus » Mi 3. Jan 2024, 13:48

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.
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

Freischreiber
* LO-Experte *
Beiträge: 834
Registriert: Fr 28. Mär 2014, 10:41

Re: Suchen-Ersetzen-Makro

Beitrag von Freischreiber » Mi 3. Jan 2024, 16:51

mikele hat geschrieben:
Mi 3. Jan 2024, 13:33
...
Mit

Code: Alles auswählen

oTab=ThisDocument.Sheets.geByname("Tabelle 1")
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!
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

mikele
* LO-Experte *
Beiträge: 1932
Registriert: Mo 1. Aug 2011, 20:51

Re: (gelöst) Suchen-Ersetzen-Makro

Beitrag von mikele » Mi 3. Jan 2024, 20:03

Hallo,
So ein Quatsch, natürlich muss es ThisComponent heißen :? :P :?
Ich korrigiere meinen Post dahingehend.
Gruß,
mikele


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten