Microsoft Word: Suche und ersetze Text in den Inhalten der VBA-Progammierung (gelöst)

  • Gerne.

    Ich habe nur $sSearch = "Tester" und $sReplace = "Master" gefüllt.

    Ich habe es auf einem anderen PC mit Office 2019 eben auch noch getestet mit demselben Resultat, dass das Wort Tester nicht ersetzt wurde. Im AV wird auch nichts verhindert. Da habe ich nachgeschaut.

  • Muss ich testen - morgen :)

  • Ich habe mir das nochmals angeschaut.
    Wenn "I-Brief.dotm" ident mit dem Dokument ist, das Du mir per PM gesendet hast, dann kann ich das Ergebnis nachvollziehen.

    Ich habe in meinem Beispielskript das Project "TemplateProject" und darin die Componente "AutoNew" verarbeitet. Es gibt dort kein "Tester" das ersetzt werden könnte.

    Aber in einem der Dialgn Forms habe ich "Tester" gefunden.

    Soll die Ersetzung daher in allen Projects und Components (Macro, GUI ...) des Dokumentes durchgeführt werden?

  • Habe das Skript aktualisiert. Nun werden alle Projects und Components eines Dokumentes verarbeitet und entsprechende Statistiken ausgegeben:

  • Soll die Ersetzung daher in allen Projects und Components (Macro, GUI ...) des Dokumentes durchgeführt werden?

    Ja. Bitte entschuldige dass ich das in den vorherigen Beiträgen nicht richtig rübergebracht hatte. Es wäre einfachen für Dich gewesen wenn ich von Anfang an geschrieben hätte was ich suchen und ersetzen möchte.

    Die Such- und Ersetzenfunktion soll am besten alles im Projekt abdecken.

    Habe das Skript aktualisiert. Nun werden alle Projects und Components eines Dokumentes verarbeitet und entsprechende Statistiken ausgegeben:

    :party: Es ist unglaublich was Du geschafft hast und wie aufmerksam Deine Arbeits- und Herangehensweise ist. Das hätte ich im Leben nicht ohne Dich hinbekommen. Herzlichen Dank dafür.

    Noch eine Frage:

    Du hattest geschrieben, dass für die Stapelverarbeitung nur noch mit _FileListToArray ein Array der zu verarbeitenden Dateien erstellt und für jede Datei dann die Funktion mit dem Dateinamen als Parameter aufgerufen werden muss.

    Ich habe mit dem Einlesen ein Versuch mit gestartet: Meinstest Du so?

    Code
    Global $aIndex = _FileListToArrayRec(@ScriptDir, $sExtension, $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH)

    Das Einlesen bekomme ich wahrscheinlich hin aber wie ich die Funktion mit dem Dateinamen als Parameter aufrufen kann ist mir nicht ganz klar. Würdest Du mir hierbei bitte hierbei noch eine Unterstützung geben?

  • AutoIt
    For $i = 1 to $aIndex[0]
        _VBAModify($aIndex[$i])
    Next
  • Gerne :)

  • Kleine Anpassung.
    Nun kannst Du in einem Durchlauf mehrere Strings ersetzen lassen.

  • Kleine Anpassung.
    Nun kannst Du in einem Durchlauf mehrere Strings ersetzen lassen.

    Das ist klasse! So mehrere Änderungen in einem Rutsch automatisiert erledigt werden. Es wird immer perfekter. Vielen Dank dafür.


    Ich habe noch zwei Fragen. Bitte melde Dich zu Wort wenn ich mit meinen Fragen zu weit gehe, weil ich nicht möchte dass es für Dich so aussieht als wollte ich selbst nicht arbeiten. Ich raffe es einfach nicht (hab heute Nacht gegen 04. -Uhr meine Versuche beendet) und Du hast schon mehr genug in dieser Sache getan.

    1. Unterhalb des TemplateProject befinden sich ja die Dialogboxen. In meiner Beispieldatei war das nach Aufruf des VB-Editors die Dialog 1 (UserForm) mit dem Text z. B. "Unterschrift Sachbearbeiter". Bisher haben wir zwar noch keine "Gender-Pflicht", allerdings wäre es ja theoretisch auch unschädlich, wenn dort "Unterschrift Sachbearbeitung" stehen würde. Wahrscheinlich ist das Vorhaben weniger sinnvoll da u. U. die Formen in Dialog 1 (UserForm) nicht mehr passen könnten. Würdest Du es für sinnvoll und möglich halten, dort auch den Text ersetzen?

    2. Und dann ist mir noch ein Punkt aufgefallen. Das Dokument verwendet ja in "Dialog 1 (Code)" z. B. ActiveDocument.Bookmarks("Amtsleiter") Wenn ich nun den Text von Amtsleiter" nach Amtsleitung" ändere, stimmt somit das Bookmark, also die Bezeichnung der "Textmarke", welche im Dokument gesetzt wurde nicht mehr. Damit hätte ich dann einen Fehler generiert. Ist es denn möglich bei der Zeile von "ActiveDocument.Bookmarks" eine Ausnahme der Textersetzung zu generieren?

  • Zu Punkt 1: Muss ich mir anschauen.

    Zu Punkt 2: Wäre vermutlich einfach umzusetzen. In einem zweiten Array könnte man die Ausnahmen festlegen.
    Da mache ich Dir einen Vorschlag.

  • Vielen Dank !

    Wo ich tatsächlich auch noch hängengeblieben bin, ist das _FileListToArrayRec. Ich habe das bereits in mehrerer Skripten bisher verwendet beim Test aber _Word_DocOpen der Fehler " Error 0" ausgegeben.

    Code
    Global $aIndex = _FileListToArrayRec(@ScriptDir, $sExtension, $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH)
    AutoIt
    For $i = 1 to $aIndex[0]
        _VBAModify($aIndex[$i])
    Next

    Bin mir ferner nicht ganz sicher ob oder wie ich eine recursive Stapelverarbeitung mehrerer *.dotm-Dateien mit dem neuen Skript aus Post 29 konkret mit "$aSearchReplace" in der Schleife verankern soll. Bin mir auch nicht sicher ob bei MS Word in dieser speziellen Geschichte mit dem VB-Editor das überhaupt möglich ist.

  • Zu Punkt 2:

    In Array $aIgnore die zu ignorierenden Strings erfassen. ACHTUNG: Wenn einer der Strings gefunden wird, dann wird keine Ersetzung in dieser Zeile durchgeführt!

  • Zu Punkt 1:

    Das sollte jetzt schon funktionieren, da die Components vom Type 1 und 3 bearbeitet werden (die rot markierten Zeilen).

  • Ich denke, dass das Statement

    Code
    Global $aIndex = _FileListToArrayRec(@ScriptDir, "*" & $sExtension, $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH)

    lauten sollte, da $sExtension auf ".dotm" gesetzt ist. Das allein ist noch kein gültiger Filter.

  • Hallo water,

    da $sExtension auf ".dotm" gesetzt ist. Das allein ist noch kein gültiger Filter.

    Tausend Dank für den bahnbrechenden Hinweis. Ich hatte mal wieder Tomaten auf den Augen und klar den Stern im Filter vor der Dateiendung vergessen. Als Stuttgarter ist das unverzeihlich ;(.

    Anbei das angepasste Script mit der rekursiven Dateiverarbeitung:

    Die rekursive Abarbeitung der Aufgaben funktioniert nun sehr gut.

    Hier die Konsolenausgabe bei drei Word-Dokumenten im rekursiven Durchlauf: Es sind inhaltlich drei Dokumente mit demselben Inhalt nur mit verscheidenen Dateinamen. Die Verarbeitung verlief fehlerfrei.

    Die $aSearchReplace hat fabelhaft funktioniert.

    Code
    Global $aSearchReplace[][] = [ _
                                 ["Tester","Master"], _
                                 ["True","False"], _
                                 ["Amtsleiter","Amtsleitung"] _
                                 ]
    ; For code with the following strings no replacement will be done at all
    Global $aIgnore[] = [ _
                        'ActiveDocument.Bookmarks("Amtsleiter")"', _
                        '.UpdateFieldsAtPrint = True' _
                        ]

    Hingegen wurde bei meinem Test unter $aIgnore das Wort "Amtsleiter" mit "Amtsleitung" trotz Eintrag in $aIgnore überschrieben.

    Zu Punkt 1:

    Das sollte jetzt schon funktionieren, da die Components vom Type 1 und 3 bearbeitet werden (die rot markierten Zeilen).

    Ich habe es mit dem Text ["Sachbearbeiter","Sachbearbeitung"] versucht und da hat es im Dialog 1 (UserForm) nicht geklappt. Das ist aber wie gesagt auch nicht so schlimm, da die Textboxen u. U. sowieso händisch wegen der Textersetzung angepasst werden müssen.

  • Hingegen wurde bei meinem Test unter $aIgnore das Wort "Amtsleiter" mit "Amtsleitung" trotz Eintrag in $aIgnore überschrieben.

    Mein Fehler.
    Das muss natürlich

    Code
    Global $aIgnore[] = [ _
                        'ActiveDocument.Bookmarks("Amtsleiter")' _
                        ]

    lauten. Das doppelte Anführungszeichen vor dem einfachen Anführungszeichen war zu viel.
    Nun sollte es funktionieren.
    Meine Testdaten aus beiden Tabellen kannst Du natürlich rauslöschen - verwirrt sonst irgendwann ;)

  • Besser geht es nicht !

    Ich bin wirklich mehr als sehr glücklich darüber, dass bei zukünftigen Dokumentanpassungen eine Automatisation der VBA Code-Inhalte stattfinden kann.

    Herzlichen Dank für Deinen und persönlichen Einsatz und für die kompetente und sachliche Hilfe. Die Art und Weise von Deinem Support und Anleitungsfähigkeit ist sehr vorbildhaft.

  • Gerne :) Seit 2009 (so lange bin ich schon im Forum) hat sch einiges Wissen angesammelt.

    Das gebe ich gerne weiter bzw. erarbeite ich mir gerne neues Wissen. Die grauen Zellen müssen in meinem Alter ja beschäftigtg werden :rofl:

  • Die grauen Zellen müssen in meinem Alter ja beschäftigtg werden

    Herausforderung angenommen :whistling:.

    Bitte entschuldige ich habe immer wieder eine letzte Frage :

    In unseren Vorlagenverzeichnissen befinden sich nach meinen Tests nun leider auch recht viele passwortgeschütze Vorlagen-Dokumente, die nicht geändert werden dürfen und auch keinen Änderungsbedarf haben. Ist es denn möglich, diese von der Suche oder Textersetzung "passwortgeschütze *.dotm-Dateien" auszugrenzen so dass die Stapelverarbeitung das Paket abarbeiten kann?