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

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

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

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

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

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

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!

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 :? :P :?
Ich korrigiere meinen Post dahingehend.