Beiträge von bazii

    Hallo water


    Die Fehler werden jetzt Dank Deines "COM error handler" abgefangen und das Skript crashed nicht mehr, sondern läuft nach Bestätigen der Debug-Info weiter bis zum Ende durch.


    Ich kann mit dem Skript sehr gut arbeiten und sogar die wenigen geschützten von den ungeschützen Dokumenten aufgrund der Consolenausgabe des Errorhandlings prima separieren.

    Zusätzlich werde ich noch den Vorschlag von BugFix aufnehmen und möchte die eh schon vorhandene .txt-Datei (quasi die Datenbank welche alle ca. 400 Benutzer beinhaltet) so aufbereiten, dass die zu suchenden Strings bei zukünftigen Namensänderungen aus der .txt-Datei ausgelesen werden können.


    Anbei noch beide Debug Info-Meldungen welche (vom COM error handler) jeweils bei den kennwortgeschützten MS-Word-Vorlagen abgefangen wurden:



    Hier das gesamte Skript (mit Stapelverarbeitung). Wenn es noch jemmand nutzen möchte.


    Dann braucht es einen COM error handler. Damit wird der Fehler abgefangen und das Skript crashed nicht mehr. Der Fehlercode kann dann im Skript abgefragt werden und die Funktion _VBAModify mit Return beenet werden.


    Herzlichen Dank für die kompetente und freundliche Hilfe.

    Das ist für mich ein mächtig kompliziertes Konstrukt. Das hätte ich niemals alleine geschafft.

    Ich teste das ganze am Wochenende in Ruhe und hoffe, dass ich Dich mit meinen immerzu "letzten" Fragen nicht mehr weiter belästige (wobei versprechen kann ich das nicht :-)).

    Vielen Dank für den Hinweis. Ich habe das getestet, doch es hat nicht funktioniert, da nicht die Datei selbst, sondern der VB-Inhalt mit einem Kennwort geschützt wurde.


    Code
        ; Open the Document
        Local $oDoc = _Word_DocOpen($oWord, $sTemplate)
        If @error Then
           If @extended = -2147352567 Then
              ConsoleWrite(" Schreibgeschützt!" & @CRLF)
             _Word_DocClose($oDoc)
           EndIf
        EndIf


    Das ist die Consolenausgabe bei dem Fehler:

    Code
    "D:\Documents\VBA\Vorlagen\Vorlagenscript_5.au3" (63) : ==> The requested action with this object has failed.:
    For $oVBComponent In $oVBProject.VBComponents
    For $oVBComponent In $oVBProject^ ERROR
    ->20:46:04 AutoIt3.exe ended.rc:1
    +>20:46:04 AutoIt3Wrapper Finished.
    >Exit code: 1    Time: 653.8

    Das hat auch nicht funktioniert:


    Code
        ; Open the Document
        Local $oDoc = _Word_DocOpen($oWord, $sTemplate)
            If @error Then _Word_DocClose($oDoc)

    Was könnte ich noch versuchen, damit ein kennwortgeschütztes Dokument einfach nach dem öffnen wieder schließt und es anschließend mit der Stapelverarbeitung weitergeht?

    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?

    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.

    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.

    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?

    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?

    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.


    In MS Word: Datei > Optionen > Trust Center > Einstellungen für das Trust Center > Makroeinstellungen für Entwickler > Zugriff auf das VBA-Projektmodell vertrauen > aktivieren


    Das hat geklappt. Vielen Dank. Dazu habe ich noch alle Macros erlaubt.


    Die Vorlagen-Datei wird nun ordnungsgemäß geöffnet und eine neue Datei wird erstellt. Die Konsole bringt keine Fehler mehr. >Exit code: 0 Time: 6.602 Allerdings wurde der gewünschte Text in der neuen Datei nicht ersetzt. Ich habe das ganze Trust-Center durchgeschaut aber nichts mehr gefunden, was das Textersetzen verhindern könnte.


    Hast Du noch einen Tip für mich?

    Hallo water,


    vielen Dank für das Script.


    Das Script öffnet bei mir die Word-Datei doch dann bricht es ab.


    Hier meine Konsolenausgabe:

    Meine Änderungen im anpassbaren Skriptbereich waren:



    Code
    ; ********** Änderungen nur NACH dieser Zeile **********
    Global $sSearch = "Sachgebietsleiter"                     ; Wonach soll gesucht werden?
    Global $sReplace = "Sachgebietsleitung"                   ; Wodurch soll es ersetzt werden?
    Global $sTemplate = @ScriptDir & "\I-Brief"  ; Zu verarbeitende Word Vorlagedatei
    ; ********** Änderungen nur VOR dieser Zeile **********

    Kann mir die Officeversion (Word 2016) oder die neue Autoitversion einen Streich spielen?

    Hallo water


    Die Umsetzung ist einfach klasse.


    Herzlichen Dank für die kompetente Hilfe und für die Bereitstellung des Scriptes jedoch vor allem für die viele Zeit, die Du investiert hast um zu helfen.

    Ich hoffe sehr dass es noch weitere Leute da draußen gibt, die davon noch provitieren können.


    @BugFix und allen Beteiligten natürlich auch ein herzliches Danke für die vielen Denkanstöße und Hilfen.

    Hallo zusammen,


    anbei eine Beispieldatei die recht unkompliziert (im Gegensatz der Masse von dem was ich zu bearbeiten habe) ist aber hoffentlich deutlich macht, was ich meine.

    Ich konnte die Datei ins Forum als *.zip hochladen. Ich hoffe das ist ok.


    Ich wollte nur klarmachen:

    Wenn ich sowieso ersetze, dann doch lieber mit Variablen statt Fixwerten.

    Das stimmt in der Tat auch genau so. Da per VBA eh eine *.txt Datei angesteuert wird, um wenige Sachbearbeiter-Informationen automatisiert in den Inhalt zu übernehmen, kann diese auch wie BugFix schrieb mit wenig Aufwand geändert werden, wenn eine Stapelverarbeitung an der richtigen Stelle eingesetzt werden kann.


    Edit bazii am 08.09.2022, 20.17 Uhr: Den Dateianhang habe ich aufgrund der enthaltenen Macros sicherheitshalber wieder entfernt. Wenn der Dateianhang für experimentielle Zwecke benötigt werden sollte bitte ich um eine PN.

    Hallo zusammen,


    vielen Dank für die vielen Hinweise und für die Ansätze.


    @water: Deine Sichtweise ist zu 100 % korrekt. DIe Aufgabe besteht darin, Teile des VBA Codes (am besten in Stapelverarbeitung) zu ersetzen (Name von Vorgesetzten, Orgeinheiten usw.) welche aus dieser(n) Vorlage(n) ausgeführt werden. Ich kann morgen versuchen, eine modifizierte Beispiel-Vorlagendatei als Spielwiese zu verlinken. Ich darf nur nicht vergessen, wirklich alles zu finden, was anonymisiert werden muss. Vielen Dank auch für die Hilfe in Beitrag Nr. 4. Am Wochenende kann ich versuchen, mich in die Links einzulesen.

    Edit: Ich denke dass die von Dir zitierten Links dem Nagel auf den Kopf treffen und mir helfen werden eine gute Lösung zu finden.


    @Alina: Deine Ansätze verfolgen die Textsuche und die Textersetzung im Dokument. Das ist nicht das was ich brauche aber dennoch vielen Dank dafür.


    @BananaJoe: Ich muss Dein Beispiel testen ob es für mich ausbaufähig ist. Vielen Dank dafür.

    Zum Suchen & Ersetzen kann ich im Moment nichts sagen.

    Aber ein Tipp: Verwende für sich evtl. ändernde Daten Variablen, die du z. B. aus einer INI oder Datenbank liest. Geht mit VBA ebenso einfach, wie in AutoIt.

    Da hast Du 100%ig Recht. Die Word-Vorlagen wurden damals von extern erstellt. Den Aufwand zu betreiben, die teilweise sehr aufwendigen Vorlagen neu aufzusetzen kann ich derzeit nicht leisten. Daher hoffe ich auf einen guten Rat.

    Hallo zusammen,


    wir nutzen in unserer Firma Dokumentvorlagen in Word mit Macros und VBA-Progammierung. Soweit so gut.

    In allen Dokumentvorlagen die mit VBA programmiert wurden, sind diverse Namen von Chefs oder Organisationseinheiten enthalten, welche dann entsprechend nach einer Abfrage beim Anwender, zur Signatur in das Dokument eingefügt werden.


    Jetzt ändern sich nun mal ab und an ein Name eines Chefs oder Organisationseinheiten und die Vorlagen müssen mit "Alt+F11" im Visual-Basic-Editor geöffnet die gesuchte Stelle gefunden und editiert werden. Das macht bei ca. 80 Dokumentvorlagen mit vielen Anwenderabfragen keinen Spass.

    Also ganz wichtig: Das Problem besteht nicht im suchen und ersetzen von Inhalten einer Textpassage im Dokument sondern im suchen und ersetzen von Texten in der von der Office-Vorlage verwendeten Texte der VBA-Dialogboxen und im VBA Code.

    Daher meine Frage:

    Kennt jemand von Euch ein Tool oder eine Möglichkeit, Textinhalte automatisch (ohne das jedesmal manuell im Visual-Basic-Editor machen zu müssen) zu suchen und zu ersetzen und das am besten noch in Stapelverarbeitung.


    Ich hoffe ich konnte mich gut genug ausdrücken damit ihr versteht wobei ich Hilfe benötige. Ich bin im formulieren nicht der Beste.


    Freue mich über jeden Rat.