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

  • Einen solchen Check gibt es für Excel.
    Ob das auch für Word funktioniert, müsstest Du testen.

  • 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?

  • 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.

  • 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 :-)).

  • 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.

  • Vor Zeile 68 könntest Du noch die Fehlerprüfung einbauen. Damit wird die Verarbeitung für die aktuelle Component beendet und die nächste verarbeitet.

    Code
    If @error Then ContinueLoop
  • Hallo zusammen!

    ich bin eben auf diesen grandiosen Post gestoßen, der mein Problem fast, aber eben nur fast zu lösen vermag.

    Mein Anliegen ist eigentlich etwas simpler, der hier angebotene Code allerdings so komplex, dass ich nicht daran herumschrauben (ver)mag.

    Hier mein Anliegen:

    Ich benötige die gleiche Funktionalität - allerdings nicht im VBA-Modul eines dotm sondern im Body eines docx.

    Mein Versuch den Code einfach umzuschreiben scheiterte an meinem mangelhaften Verständnis auf der Objektebene der Word-Dokumente.

    Nachdem der Text ersetzt wurde, soll das Dokument als PDF gespeichert werden - das bekäme ich noch hin :)

    Vielleicht kann mir jemand helfen?

  • Body ist der Text des Dokumentes ohne Kopf- und Fußzeilen.

  • MiX-MoX
    Wenn Du nur im Body suchen/ersetzen willst, dann verwende die im AutoIt-Standard enthaltene Word UDF, Funktion _Word_DocFindReplace

  • Die Ausswahl der Programmierumgebung bzw. -sprache hängt von vielen Faktoren ab.

    Und da der OP im AutoIt-Forum gepostet hat, nehme ich an, dass dies seine bevorzugte Sprache ist.

  • M.E. würde dafür VBA reichen. AutoIt wäre dafür überdimensioniert.

    Grundsätzlich ist jede Excel- / Word- etc. Programmierung in der direkt von Haus aus vorhandenen VBA-Umgebung lösbar. Teilweise auch viel direkter. Auch wenn VBA nicht schwierig ist, müsste man sich trotzdem erstmal intensiv damit befassen um eine vernünftige Lösung zu erstellen. Da bleibt zu überlegen, ob man diese Zeit aufwenden möchte oder in der vertrauten (AutoIt) Umgebung das Projekt umsetzt.

    Das Gute ist ja, dass beide Varianten innerhalb von AutoIt genutzt werden können. Somit bleibt die freie Wahl nach eigenem Gusto.

  • Habe da ja ganz schön was losgetreten :)

    Ich benötige eine EXE um aus SAP bzw. der CoreSuite heraus einen bestimmten Prozess anzustoßen, den die bei SAP nicht hinbekommen.

    Möglicherweise könnte ich in der SAP CoreSuite direkt VBA-Code einbetten - ich finde die Möglichkeit das via AutoIT zu machen "bequemer" und potenter,

    denn im Gegensatz zu VB in der SAP - Umgebung weiß ich, dass ich über AutoIT Word-Objekte ansprechen kann.

    Mein Anliegen hat sich schon wieder fast erledigt, die Lösung über das hier vorgestellte Skript wäre die Deluxe-Lösung.

    Ich habe auf die Schnelle eines in diesem Post der erstgenannten Skripte - das für Excel gedacht war - auf Word-Objekte umgeschrieben.

    Dass passt jetzt weitestgehend, wenn auch ohne die ganze Fehlerbetrachtung und statistischen Auswertungen.

    Mein Skript wird- wenn es fertig ist - folgendes machen:

    Das Skript wird über Parameter aufgerufen.

    Die Parameter enthalten Informationen über die eine bestimmte Text-Datei und eine bestimmte Word-Datei geöffnet werden können.

    In dieser Textdatei wird ein mehrzeiliger Datensatz bereitgestellt.

    Das Skript liest die Textdatei in ein Array, und führt innerhalb des Word-Dokumentes eine Suchen und Ersetzen-Prozedur aus - mit Daten aus dem Array.
    Anschließend wird das Word-Dokument unter einem bestimmten Namen als PDF gespeichert.

    Das ganze steht im Zusammenhang mit REACH und der Verpflichtung der Hersteller, dem Handel Sicherheitsdatenblätter mit Händlerinformationen bereitzustellen.

    Serienbriefe oder ähnliches sind kein Lösungsansatz, denn es geht um ca. 8.000 Word -Dokumente (SDB) und einige hundert Händler.

    Sowohl die Händlerdaten als auch die Daten in den SDB unterliegen ständigen Änderungen.

    Ich stelle das Skript hier rein, wenn es fertig ist.

  • Hallo zusammen,

    hier mein Code:

    Mit SAP hat das nur insofern zu tun, als das die beschriebene Routine über CC aufgerufen wird.
    Sie funktioniert aber auch über jede anderen Programmaufruf z.B. aus der Kommandozeile.

    Einmal editiert, zuletzt von MiX-MoX (4. Juli 2023 um 12:31)

  • Mir ist aufgefallen, dass Du

    • zwar FileOpen aufrufst, dann aber das Handle nicht verwendest und somit bei jedem Lesezugriff die Datei geöffnet und geschlossen wird. Abgesehen davon verlangt FileOpen auch ein FileClose.
    • $aTags als 2D array definierst, aus dem Skript aber nicht ersichtlich ist, warum. Genügt nicht ein 1D Array?
    • Du $col zwar definierst aber keinen Wert setzt, daher lässt sich damit dann auch ReDim $aTags nicht fehlerfrei ausführen. In der nächsten Zeile steht nur der Buchstabe "W", was auf jeden Fall einen Syntaxfehler bringt
    • Keine Fehlerprüfungen in Deinem Skript hast, das macht Debugging natürlich mehr als mühsam

    Ich vermute, dass das gepostete Skript nicht der komplette Code ist.