1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. bazii

Beiträge von bazii

  • Wie informiert Ihr Eure User in einer Domain am PC-Arbeitsplatz über umgehend wichtige und zu beachtende Dinge?

    • bazii
    • 7. März 2023 um 21:19
    Zitat von water

    Hier mal ein grobe Skizze meiner Idee. Was hältst Du davon?

    :klatschen: Vielen lieben Dank für die kompetente Hilfe und für den herausragenden Lösungsansatz. Auch bei Peter S. Taler und bei Moombas möchte ich mich vielmals bedanken. Um ehrlich zu sein, kann der Vorschlag zum Vorhaben nicht besser aussehen, jedoch habe ich verschiedene Fragen zur Umsetzung. Ich versuche mich so gut wie möglich auszudrücken, was mir, wie Du weißt, nicht immer gelingt. Vor allem bei dem Versuch zur Umsetzung des Vorhabens, werde ich kläglich jammern. Jetzt aber erst mal meine Fragen zu Deinen Ausführungen.

    Zu meinem Arbeitgeber, weil ich das nicht so gut hier nennen darf versuche ich es zu umschreiben: Wir haben 18 dezentrale IuK- und IT-Einheiten mit jeweils eigenem Haushaltsplan. Ich leite die IuK von einer diesen dezentralen Einheiten. Meine Geschäftsführung ist also auch nur eine, von insgesamt 18 Stück. Also, was ich damit sagen möchte ist, dass meine Geschäftsleitung nicht die Unternehmensführungsspitze ist, wenn das ggf. so rüber kam. Das zentrale Server-Team (so nenne ich diese Einheit jetzt mal) macht uns Vorgaben, mit denen wir mehr oder weniger gut klarkommen. Die Vorgaben nennen sich *SL (strategische Leitlinien).

    Zitat von water

    Generell:

    Alle Dateien beginnen mit DM_ (das steht für Domain Messenger). Sollten Dir die engl. Abkürzungen und Namen nicht gefallen, kann ich das noch ändern.
    Es gibt zwei Typen von Konfigurationsdateien: DM_Config_Global.ini (für alle Benutzer gültige Einstellungen) und DM_Config_Local.ini (für einen einzelnen Benutzer gültige Einstellungen)

    Das hört sich perfekt an. Da gibt es nichts dran zu rütteln.

    Zitat von water

    Serverseitig:


    1. Verzeichnis: Das Logon-Skript weist dem Benutzer bestimmte Server-Laufwerke zu (das ist unabhängig vom DM). Auf einem dieser Laufwerke wird ein Verzeichnis angelegt in dem alle Dateien für DM abgelegt werden. Dieses Verzeichnis hat der Client im Lesezugriff.

    2. Hier werden alle Dateien abgelegt: exe, ini, txt.

    3. DM_Startup.exe: Das Logon-Skript kopiert/überschreibt die Datei DM_Startup.exe in ein lokales Verzeichnis jedes PCs der sich an der Domäne anmeldet. Dann wird vom Logon-Skript die lokale DM_Startup.exe gestartet.
    4. Damit gibt es auf dem Server nach dem Client-Login keine langlaufenden Programme.
    5. DM_Config_Global.ini: Hier werden globale Einstellungen gespeichert. Z.B.

    Lokales Verzeichnis in das DM installiert werden soll
    Zeiten für die Prüfung nach Meldungen mit Priorität normal und high
    Filter um PCs von DM auszuschließen oder zu inkludieren
    etc.

    Alles anzeigen

    Ich musste Deine Ausführungen zunächst nummerieren um damit klar zu kommen. Mein altes (eher iq-minimiertes) Hirn :Face: muss das erst mal aufdröseln.

    Zu 1. Es werden bei allen unseren Usern über ein zentrales Logon-Skript verschiedene Netzlaufweke für verschiedene Zwecke zugewiesen. Ein Laufwerk davon hat ein rießiges Informations-Verzeichnis für die User, auf dem ein zentrales Verzeichnis mit Lesezugriff für diesen Zweck und für alle User, eingerichtet werden kann. Das passt also.

    Zu 2. Perfekt.

    Zu 3. An das Client- und User-Logonskript komme ich als dezentraler Clientadmin nicht ran. Das ist manipulationssicher bei der zentralen Serveradministration angedockt. Die verhandeln i. d. R. auch nicht mir über Änderungen da die Leute von den *strategischen Leitlinien und die von der zentralen Security den Daumen drauf haben. Die von Dir vorgeschlagene Lösung ist natürlich zur Softwareverteilung der Idealfall (bei uns wird das "DigitalesServerManagement" kurz DSM genannt). Jedoch komme ich kaum ran. Ich wüßte aber ehrlich gesagt nicht, wie das anders gehen sollte.

    Von dem her möchte ich das morgen bei einem Kollegen bei dem Team anfragen, ob wir Pkt. 3 über das DSM einbringen könnten. Ich kann Dir dazu morgen Abend eine Rückmeldung geben.

    Zu 4. Perfekt.

    5. Verstanden. Das ist ebenfalls perfekt von Dir geplant.

    Zitat von water

    Clientseitig:

    1. DM_Startup.exe: Das vom Login-Skript gestartete Programm kopiert weitere notwendige Daten vom Server auf den Client und startet dann DM_Client.exe. Sollte DM_Startup bereits laufen, so wird DM_Client.exe erst gecancelt und dann gestartet.
    2. DM_Client.exe: Dieses Programm führt die Verarbeitung der Meldungen durch
    3. DM_Config_Local.ini: Damit kann die lokale Installation konfiguriert werden. Z.B.

    Einstellungen für das Logging wenn bei einem einzelnen PC Probleme auftreten
    etc.

    Zu 1. Dazu muss ich morgen ebenfalls bei einem Kollegen bei dem Server-Team anfragen, ob wir über DSM das Login-Skript gestartete Programm und weitere notwendige Daten vom Server auf den Client kopiert bekommen und dann DM_Client.exe starten können . Ich hoffe, ich kann Dir dazu morgen Abend eine Rückmeldung geben.

    Zu 2 & 3. Perfekt, es leuchtet bereits in meinen Augen. Genial!


    Zitat von water

    Befehle:

    Mit bestimmten Textdateien sollen Aktionen bei den Clients ausgeführt werden. Befehle werden wie Meldungen mit Prioriät high behandelt.

    Beispiele:

    Restart: Startet DM bei allen Clients neu. Dies wird verwendet um sofort eine neue Version von DM zu verteilen (also nicht auf den nächsten Login zu warten).
    Exit: Beendet DM bei allen Clients
    etc.

    Besser geht es kaum. Das hört sich nach einem sehr gut durchdachten Plan an.

    Allerdings benötige ich für das Vorhaben das zentrale DSM-Team, welches ich morgen anfragen werde. Ich hoffe sehr auf eine positive Antwort von den Verantwortlichen. Allerdings habe ich desöfteren schon bei sehr kleinen Wünschen das kurze Los gezogen. Ich gebe Bescheid, wenn nicht morgen dann übermorgen.

    Nochmals herzlichen Dank.

    Peter S. Taler Dir auch nochmal vielen Dank für die Recherchen und Beiträge. Zu den Links:

    1. Die msg.exe gibt es in der Tat auch in Win 10 21H2 welches wir im Konzern nutzen, allerdings ist die msg.exe per Policy-Group der Security deaktiviert und wird spät. nach unerlaubter eigenständiger Aktivierung beim nächsten Up- oder Upgrade wieder deaktiviert.

    2. RealPopUp ist vielversprechend aber auch eher so ein Messenger-Ding und für meine Zwecke zu überdimensioniert. Sicher ist das von mir zu kurz gedacht da bei uns auch mal irgendwann zentral, wenn mal alle Smartphones bekommen sollten, so eine Lösung für PC und mobile Endgeräte in die nähere Betrachtungsweise gezogen werden muss.

    3. OfficeScan: Das blicke ich im ersten Durchlauf nicht ganz, was damit gemeint ist. Das schaue ich mir morgen nochmal näher an, wobei gerade ehrlich gesagt, an dem Lösungsansatz von water fast kein Weg vorbeigeht, wenn das DSM-Team mitmacht. Dennoch sind mir alle Möglichkeiten wichtig, die, falls alle Stricke reißen, die zu einer Lösung, wenn auch auf anderem Wege beitragen können.

  • Wie informiert Ihr Eure User in einer Domain am PC-Arbeitsplatz über umgehend wichtige und zu beachtende Dinge?

    • bazii
    • 7. März 2023 um 13:44

    Hallo zusammen,

    Peter S. Taler hab' vielen Dank für die Lösungsansätze und die weiterführenden Links und Fragen. Die Links schaue ich mir gleich heute Abend durch.

    Zitat von Peter S. Taler

    Eine Frage hätte ich da tatsächlich nocht... wieviele Mitarbeiter arbeiten in "Deinem" Unternehmen?

    Aktuell haben wir ca. 400 User einen PC-Arbeitsplatz auf verschiedene Standorte verteilt.

    Zitat von Moombas

    Aber ich kenne natürlich nicht die Meldungen und deren Hintergrund in bazii 's Fall, mir würde keine einfallen, die von der Geschäftsleitung kommen könnte, die so dringend ist, das sie nicht 1 Tag warten kann.

    Ich gebe Dir ja soooo recht. Es ging die letzten 20 Jahre ohne Spontanmeldungen und wie auch bei Euch mit regulären Vorankündigungen, über das Intranet wichtige Hinweise zu bestimmten Themen abzusetzen. Jetzt möchte die Geschäftsführung spontane Nachrichten absetzen können.

    Zitat von water

    Hier mal meine Gedanken dazu:

    Vielen Dank für diesen Lösungsansatz. Die Vorstellung davon gefällt mir sehr gut. Aktuell ist es wegen der zentralen Serveradministration (ist nicht bei mir verankert) nicht vorstellbar, eine Software und zu verteilende Nachrichten auf einem Server selbst abzulegen. In einem freigegeben Netzlaufwerk, wo alle Zugriff haben, wäre das denkbar. Meinst du, dann könnte das auch funktionieren? Die Programmausführung sollte lokal erfolgen, wenn der AV bei den Clients nicht anschlägt :) . Die Protokollierung der bereits gesehenen Nachrichten ebenfalls.

  • Wie informiert Ihr Eure User in einer Domain am PC-Arbeitsplatz über umgehend wichtige und zu beachtende Dinge?

    • bazii
    • 6. März 2023 um 21:10

    Hallo Peter,

    danke für die Hinweise.

    1) Mail scheidet aus, da nur unplanbare Nachrichten (es geht immer um spontane Meldungen der Geschäftsleitung) auf dem PC-Bildschirm eingeblendet werden sollen.

    Planbare Nachrichten stehen im Intranet oder werden per Mail an diverse AD-Gruppen via Mail-Verteiler versendet.

    2) Threema ist ein sehr guter Hinweis, jedoch erfordert die Software ein moblies Endgerät wie ein Smart- oder iPhone oder ein Tablet. Das soll irgendwann später mal eingesetzt werden können. Bei meiner Anfrage geht es allerdings nur um die Möglichkeit, spontane PC-Nachrichten im Vordergrund bis zu einem "OKAY-Klick" zu visualisieren. Das kam bei meiner Erklärung nicht klar genug durch. Ich werde das korrigieren.

  • Wie informiert Ihr Eure User in einer Domain am PC-Arbeitsplatz über umgehend wichtige und zu beachtende Dinge?

    • bazii
    • 6. März 2023 um 20:37

    Hallo zusammen,

    vielleicht kennen noch einige von Euch die alten *XP-Zeiten, bei denen es anscheinend möglich war, eine Bildschirmnachricht allen Usern in der Domain als Startmitteilung zu generieren. Im Netz habe ich auf Anhieb nichts brauchbares dazu gefunden.

    Erfundene Beispiele für die Verwendung:
    a.)Die User melden sich irgendwann im Laufe des Tages an und sollten eine Systemwartungsnachricht erhalten; Bitte die PCs um spät. 17 Uhr abzumelden/herunterzufahren.

    b.)Warnhinweis: Es ist eine nicht autorisierte Person in Etage 5 unterwegs. Türen schließen und weitere Instruktionen abwarten.

    Die Anzeige sollte entweder apprupt oder nach der Anmeldung, für alle User oder für bestimmte Grupen in der Domain sichtbar sein und nur von einem Administrator generiert werden können.

    Mich würde noch viel mehr interessieren (unabhängig davon wie und ob das obige umsetzbar wäre), wie Ihr unplanbare Nachrichten (es geht immer um spontane Meldungen der Geschäftsleitung) an Eure User weitergebt.

    Edit: Der CMD Befehl: Net send = *XP / msg = Win7 & Win10: Hat jemand damit in einer Domain Erfahrungen gesammelt oder gibt es Euch bekannte luxuriösere Lösungen über AutoIt?

  • FTP, SFTP + SSH Probleme mit login oder 0Byte-Dateien

    • bazii
    • 3. März 2023 um 22:53
    Zitat von Andy

    Ich würde zuerst per CMD als Administrator versuchen per SFTP-Befehl eine Verbindung mit dem Host herzustellen, wenn das klappt, versuche die SFTP-UDF.

    Kannst Du zu diesem Hinweis etwas sagen autoit_dau ?

    Ergänzend zu den sachdienlichen Hinweisen von SOLVE-SMART zur "SFTPEx.au3" kann ich gerne versuchen Dir zu helfen, wenn es per SFTP-Befehl oder mit Hilfe einer Software wie FileZilla geklappt hat, eine Verbindung herzustellen. Vorher macht es meiner Meinung nach wenig Sinn, ein Beispielscript zu erstellen und zu posten. Gib' einfach Bescheid.

  • Umfrage: Tutorial zum WebDriver Projekt ("au3WebDriver" von Danp2)

    • bazii
    • 23. Dezember 2022 um 20:36

    Hallo SOLVE-SMART

    ich finde die Idee, ein Tutorial zum WebDriver Projekt zu schreiben, richtig klasse ! Vor allem wenn es in deutscher Sprache verfasst wird, bringt dies einen enormen Mehrwert. Anwendungsbeispiele dazu wären gut. Alle hier können davon profitieren.

    Zitat von SOLVE-SMART

    💡 Die Tutorial-Struktur steht.

    Fühlt sich wie ein Stück virtuelles Weihnachten an :saint:

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

    • bazii
    • 18. September 2022 um 20:36

    Werde ich machen. Herzlichen Dank für den Hinweis.

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

    • bazii
    • 18. September 2022 um 19:20

    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:

    Fehlermeldung.png

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

    C
    #include <File.au3>
    #include <FileConstants.au3>
    #include <MsgBoxConstants.au3>
    #include <StringConstants.au3>
    #include <Word.au3>
    #include <WordConstants.au3>
    
    ; https://autoit.de/thread/87817-microsoft-word-suche-und-ersetze-text-in-den-inhalten-der-vba-progammierung-gel%C3%B6/?postID=708429#post708429
    
    ; ********** Änderungen nur NACH dieser Zeile **********
    ; Table with search and replace strings to process
    Global $aSearchReplace[][] = [ _
                                 ["Text 1","Text 2"], _
                                 ["",""], _
                                 ["",""] _
                                 ]
    ; For code with the following strings no replacement will be done at all
    Global $aIgnore[] = [ _
                        'ActiveDocument.Bookmarks("Text")"', _
                        '.UpdateFieldsAtPrint = True' _
                        ]
    ; ********** Änderungen nur VOR dieser Zeile **********
    
    Global $sExtension = ".dotm" ; Verarbeite nur MS-Word Vorlagendatei mit Macros.
    Global $sTemplate = _FileListToArrayRec(@ScriptDir, "*" & $sExtension, $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH) ; Auflistung der rekursiv zu verarbeitenden MS-Word Vorlagedateien
    Global $iTotalProjectCount = 0, $iTotalComponentCount = 0, $iTotalReplacementCount = 0
    
    ; Set up debugging
    Global $__iWord_Debug = 0 ; Debug level. 0 = no debug information, 1 = Debug info to consWorde, 2 = Debug info to MsgBox, 3 = Debug Info to File
    Global $__sWord_DebugFile = @ScriptDir & "\Word_Debug.txt" ; Debug file when $__iWord_Debug is set to 3
    Global $__oWord_Error ; COM Error handler
    
    _ArrayDisplay($sTemplate, "");Ansicht der zu verarbeitenden Dateien anzeigen lassen (optional)
    
    ; Start the MS Word application
    Global $oWord = _Word_Create()
    If @error Then Exit MsgBox($MB_ICONERROR, "Error", "_Word_Create: @error=" & @error & ", @extended=" & @extended)
    
    _Word_ErrorNotify(2)
    
    ; Process the Template
    For $i = 1 to $sTemplate[0] ; rekursives Ermitteln der zu verarbeitenden Dateien
        _VBAModify($sTemplate[$i]) ; Start der Search & Replace Funktion in Word
    Next
    
    Exit
    
    Func _VBAModify($sTemplate)
    
        ; Open the Document
        Local $oDoc = _Word_DocOpen($oWord, $sTemplate)
        If @error Then Exit MsgBox($MB_ICONERROR, "Error", "_Word_DocOpen: @error=" & @error & ", @extended=" & @extended)
    
        ; Collect statistics and output them to the Console
        ConsoleWrite("PROCESSING: " & $sTemplate & $sExtension & @CRLF)
        ConsoleWrite("  STATISTICS" & @CRLF & "  ==========" & @CRLF)
        For $oVBProject In $oWord.VBE.VBProjects
            ConsoleWrite("  VBProject: " & $oVBProject.Name & ", Typ: " & $oVBProject.Type)
            Switch $oVBProject.Type
                Case 100
                    ConsoleWrite(" (vbext_pt_HostProject - Host project)" & @CRLF)
                Case 101
                    ConsoleWrite(" (vbext_pt_StandAlone - Standalone Project)" & @CRLF)
                Case Else
                    ConsoleWrite(" Unknown Project Type!" & @CRLF)
            EndSwitch
            For $oVBComponent In $oVBProject.VBComponents
                ConsoleWrite("    VBComponent: " & $oVBComponent.Name & ", Typ: " & $oVBComponent.Type)
                Switch $oVBComponent.Type
                    Case 1
                        ConsoleWrite(" (vbext_ct_StdModule - Standard module)" & @CRLF)
                    Case 2
                        ConsoleWrite(" (vbext_ct_ClassModule - Class module)" & @CRLF)
                    Case 3
                        ConsoleWrite(" (vbext_ct_MSForm - Microsoft Form)" & @CRLF)
                    Case 11
                        ConsoleWrite(" (vbext_ct_ActiveXDesigner - ActiveX Designer)" & @CRLF)
                    Case 100
                        ConsoleWrite(" (vbext_ct_Document - Document Module)" & @CRLF)
                    Case Else
                        ConsoleWrite(" Unknown Component Type!" & @CRLF)
                EndSwitch
            Next
        Next
    
        ; Process all VBProjects and VBComponents
        ConsoleWrite("  SEARCH & REPLACE" & @CRLF & "  ================" & @CRLF)
        For $oVBProject In $oWord.VBE.VBProjects
            ConsoleWrite("  VBProject: " & $oVBProject.Name & @CRLF)
            $iTotalProjectCount += 1
            For $oVBComponent In $oVBProject.VBComponents
                ConsoleWrite("    VBComponent: " & $oVBComponent.Name & @CRLF)
                $iTotalComponentCount += 1
                Switch $oVBComponent.Type
                    ; Only Standard Modules and Microsoft Forms will be processed
                    Case 1, 3
                        $oCodeModule = $oVBComponent.CodeModule
                        If @error Then Exit MsgBox($MB_ICONERROR, "Error", "CodeModule: @error=" & @error & ", @extended=" & @extended)
                        With $oCodeModule
                            $iReplaceCount = 0
                            For $i = 1 To .CountOfLines
                                $bIgnore = False
                                For $j = 0 To UBound($aIgnore, 1) - 1
                                    If StringInStr(.Lines($i, 1), $aIgnore[$j]) Then $bIgnore = True
                                Next
                                If $bIgnore = False Then
                                    For $j = 0 To UBound($aSearchReplace, 1) - 1
                                        If StringInStr(.Lines($i, 1), $aSearchReplace[$j][0]) Then
                                            .ReplaceLine($i, StringReplace(.Lines($i, 1), $aSearchReplace[$j][0], $aSearchReplace[$j][1]))
                                            $iReplaceCount = $iReplaceCount + 1
                                        EndIf
                                    Next
                                EndIf
                            Next
                            ConsoleWrite("      " & $iReplaceCount & " replacements" & @CRLF)
                            $iTotalReplacementCount = $iTotalReplacementCount + $iReplaceCount
                        EndWith
                    Case Else
                        ConsoleWrite("      Not processed!" & @CRLF)
                EndSwitch
            Next
        Next
    
        ; Send total Statistics for this document to the Console
        ConsoleWrite("  SEARCH & REPLACE - TOTAL STATISTICS" & @CRLF & "  ===================================" & @CRLF)
        ConsoleWrite("  VBProjects processed  : " & $iTotalProjectCount & @CRLF)
        ConsoleWrite("  VBComponents processed: " & $iTotalComponentCount & @CRLF)
        ConsoleWrite("  Replacements done     : " & $iTotalReplacementCount & @CRLF)
    
        ; Save as new Document
        _Word_DocSaveAs($oDoc, $sTemplate, $WdFormatXMLTemplateMacroEnabled)
        If @error Then Exit MsgBox($MB_ICONERROR, "Error", "_Word_DocSaveAs: @error=" & @error & ", @extended=" & Hex(@extended))
    
        ; Close Document
        _Word_DocClose($oDoc)
    
    EndFunc   ;==>_VBAModify
    
    Func _Word_ErrorNotify($iDebug, $sDebugFile = "")
        If $sDebugFile = Default Then $sDebugFile = ""
        If Not IsInt($iDebug) Or $iDebug < -1 Or $iDebug > 4 Then Return SetError(1, 0, 0)
        If $sDebugFile = "" Then $sDebugFile = @ScriptDir & "\Word_Debug.txt"
        Switch $iDebug
            Case -1
                Local $avDebug[4] = [3]
                $avDebug[1] = $__iWord_Debug
                $avDebug[2] = $__sWord_DebugFile
                $avDebug[3] = IsObj($__oWord_Error)
                Return $avDebug
            Case 0
                $__iWord_Debug = 0
                $__sWord_DebugFile = ""
                $__oWord_Error = 0
            Case Else
                $__iWord_Debug = $iDebug
                $__sWord_DebugFile = $sDebugFile
                ; A COM error handler will be initialized only if one does not exist
                If ObjEvent("AutoIt.Error") = "" Then
                    $__oWord_Error = ObjEvent("AutoIt.Error", "__Word_ErrorHandler") ; Creates a custom error handler
                    If @error <> 0 Then Return SetError(2, @error, 0)
                    Return SetError(0, 1, 1)
                ElseIf ObjEvent("AutoIt.Error") = "__Word_ErrorHandler" Then
                    Return SetError(0, 0, 1) ; COM error handler already set by a call to this function
                Else
                    Return SetError(3, 0, 0) ; COM error handler already set to another function
                EndIf
        EndSwitch
        Return 1
    EndFunc   ;==>_Word_ErrorNotify
    
    Func __Word_ErrorHandler()
        Local $sError = "COM Error Encountered in " & @ScriptName & @CRLF & _
                "@AutoItVersion = " & @AutoItVersion & @CRLF & _
                "@AutoItX64 = " & @AutoItX64 & @CRLF & _
                "@Compiled = " & @Compiled & @CRLF & _
                "@OSArch = " & @OSArch & @CRLF & _
                "@OSVersion = " & @OSVersion & @CRLF & _
                "Scriptline = " & $__oWord_Error.Scriptline & @CRLF & _
                "NumberHex = 0x" & Hex($__oWord_Error.Number, 8) & @CRLF & _
                "Number = " & $__oWord_Error.Number & @CRLF & _
                "WinDescription = " & StringStripWS($__oWord_Error.WinDescription, $STR_STRIPTRAILING) & @CRLF & _
                "Description = " & StringStripWS($__oWord_Error.Description, $STR_STRIPTRAILING) & @CRLF & _
                "Source = " & $__oWord_Error.Source & @CRLF & _
                "HelpFile = " & $__oWord_Error.HelpFile & @CRLF & _
                "HelpContext = " & $__oWord_Error.HelpContext & @CRLF & _
                "LastDllError = " & $__oWord_Error.LastDllError
        If $__iWord_Debug > 0 Then
            If $__iWord_Debug = 1 Then ConsoleWrite($sError & @CRLF & "========================================================" & @CRLF)
            If $__iWord_Debug = 2 Then MsgBox($MB_ICONERROR, "Word - Debug Info", $sError)
            If $__iWord_Debug = 3 Then FileWrite($__sWord_DebugFile, @YEAR & "." & @MON & "." & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @CRLF & _
                    "-------------------" & @CRLF & $sError & @CRLF & "========================================================" & @CRLF)
        EndIf
    EndFunc   ;==>__Word_ErrorHandler
    Alles anzeigen
  • Microsoft Word: Suche und ersetze Text in den Inhalten der VBA-Progammierung (gelöst)

    • bazii
    • 15. September 2022 um 13:01
    Zitat von water

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

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

    • bazii
    • 14. September 2022 um 21:00

    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?

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

    • bazii
    • 14. September 2022 um 14:08
    Zitat von water

    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?

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

    • bazii
    • 13. September 2022 um 10:18

    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.

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

    • bazii
    • 12. September 2022 um 22:42

    Hallo water,

    Zitat von 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:

    C
    #include <Array.au3>
    #include <File.au3>
    #include <FileConstants.au3>
    #include <MsgBoxConstants.au3>
    #include <Word.au3>
    #include <WordConstants.au3>
    #include <Word.au3>
    #include <MsgBoxConstants.au3>
    
    ; ********** Änderungen nur NACH dieser Zeile **********
    ; Table with search and replace strings to process
    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' _
                        ]
    ; ********** Änderungen nur VOR dieser Zeile **********
    Global $sExtension = ".dotm"
    Global $sTemplate = _FileListToArrayRec(@ScriptDir, "*" & $sExtension, $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH) ; Zu verarbeitende Word Vorlagedateien
    Global $iTotalProjectCount = 0, $iTotalComponentCount = 0, $iTotalReplacementCount = 0
    
    _ArrayDisplay($sTemplate, "");Ansicht der zu verarbeitenden Dateien anzeigen lassen (optional)
    
    ; Start the MS Word application
    Global $oWord = _Word_Create()
    If @error Then Exit MsgBox($MB_ICONERROR, "Error", "_Word_Create: @error=" & @error & ", @extended=" & @extended)
    
    ; Process the Template
    For $i = 1 to $sTemplate[0] ; rekursives Ermitteln der zu verarbeitenden Dateien
        _VBAModify($sTemplate[$i])
    Next
    
    Exit
    
    Func _VBAModify($sTemplate)
    
        ; Open the Document
        Local $oDoc = _Word_DocOpen($oWord, $sTemplate)
        If @error Then Exit MsgBox($MB_ICONERROR, "Error", "_Word_DocOpen: @error=" & @error & ", @extended=" & @extended)
    
        ; Collect statistics and output them to the Console
        ConsoleWrite("PROCESSING: " & $sTemplate & $sExtension & @CRLF)
        ConsoleWrite("  STATISTICS" & @CRLF & "  ==========" & @CRLF)
        For $oVBProject In $oWord.VBE.VBProjects
            ConsoleWrite("  VBProject: " & $oVBProject.Name & ", Typ: " & $oVBProject.Type)
            Switch $oVBProject.Type
                Case 100
                    ConsoleWrite(" (vbext_pt_HostProject - Host project)" & @CRLF)
                Case 101
                    ConsoleWrite(" (vbext_pt_StandAlone - Standalone Project)" & @CRLF)
                Case Else
                    ConsoleWrite(" Unknown Project Type!" & @CRLF)
            EndSwitch
            For $oVBComponent In $oVBProject.VBComponents
                ConsoleWrite("    VBComponent: " & $oVBComponent.Name & ", Typ: " & $oVBComponent.Type)
                Switch $oVBComponent.Type
                    Case 1
                        ConsoleWrite(" (vbext_ct_StdModule - Standard module)" & @CRLF)
                    Case 2
                        ConsoleWrite(" (vbext_ct_ClassModule - Class module)" & @CRLF)
                    Case 3
                        ConsoleWrite(" (vbext_ct_MSForm - Microsoft Form)" & @CRLF)
                    Case 11
                        ConsoleWrite(" (vbext_ct_ActiveXDesigner - ActiveX Designer)" & @CRLF)
                    Case 100
                        ConsoleWrite(" (vbext_ct_Document - Document Module)" & @CRLF)
                    Case Else
                        ConsoleWrite(" Unknown Component Type!" & @CRLF)
                EndSwitch
            Next
        Next
    
        ; Process all VBProjects and VBComponents
        ConsoleWrite("  SEARCH & REPLACE" & @CRLF & "  ================" & @CRLF)
        For $oVBProject In $oWord.VBE.VBProjects
            ConsoleWrite("  VBProject: " & $oVBProject.Name & @CRLF)
            $iTotalProjectCount += 1
            For $oVBComponent In $oVBProject.VBComponents
                ConsoleWrite("    VBComponent: " & $oVBComponent.Name & @CRLF)
                $iTotalComponentCount += 1
                Switch $oVBComponent.Type
                    ; Only Standard Modules and Microsoft Forms will be processed
                    Case 1, 3
                        $oCodeModule = $oVBComponent.CodeModule
                        If @error Then Exit MsgBox($MB_ICONERROR, "Error", "CodeModule: @error=" & @error & ", @extended=" & @extended)
                        With $oCodeModule
                            $iReplaceCount = 0
                            For $i = 1 To .CountOfLines
                                $bIgnore = False
                                For $j = 0 To UBound($aIgnore, 1) - 1
                                    If StringInStr(.Lines($i, 1), $aIgnore[$j]) Then $bIgnore = True
                                Next
                                If $bIgnore = False Then
                                    For $j = 0 To UBound($aSearchReplace, 1) - 1
                                        If StringInStr(.Lines($i, 1), $aSearchReplace[$j][0]) Then
                                            .ReplaceLine($i, StringReplace(.Lines($i, 1), $aSearchReplace[$j][0], $aSearchReplace[$j][1]))
                                            $iReplaceCount = $iReplaceCount + 1
                                        EndIf
                                    Next
                                EndIf
                            Next
                            ConsoleWrite("      " & $iReplaceCount & " replacements" & @CRLF)
                            $iTotalReplacementCount = $iTotalReplacementCount + $iReplaceCount
                        EndWith
                    Case Else
                        ConsoleWrite("      Not processed!" & @CRLF)
                EndSwitch
            Next
        Next
    
        ; Send total Statistics for this document to the Console
        ConsoleWrite("  SEARCH & REPLACE - TOTAL STATISTICS" & @CRLF & "  ===================================" & @CRLF)
        ConsoleWrite("  VBProjects processed  : " & $iTotalProjectCount & @CRLF)
        ConsoleWrite("  VBComponents processed: " & $iTotalComponentCount & @CRLF)
        ConsoleWrite("  Replacements done     : " & $iTotalReplacementCount & @CRLF)
    
        ; Save as new Document
        _Word_DocSaveAs($oDoc, $sTemplate & "-NEW" & $sExtension, $WdFormatXMLTemplateMacroEnabled)
        If @error Then Exit MsgBox($MB_ICONERROR, "Error", "_Word_DocSaveAs: @error=" & @error & ", @extended=" & Hex(@extended))
    
        ; Close Document
        _Word_DocClose($oDoc)
    
    EndFunc   ;==>_VBAModify
    Alles anzeigen

    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.

    Code
    PROCESSING: F:\Test\Word\I-BRIEF.dotm
      STATISTICS
      ==========
      VBProject: TemplateProject, Typ: 100 (vbext_pt_HostProject - Host project)
        VBComponent: ThisDocument, Typ: 100 (vbext_ct_Document - Document Module)
        VBComponent: AutoNew, Typ: 1 (vbext_ct_StdModule - Standard module)
        VBComponent: Dialog1, Typ: 3 (vbext_ct_MSForm - Microsoft Form)
        VBComponent: Dialog2, Typ: 3 (vbext_ct_MSForm - Microsoft Form)
        VBComponent: Drucken, Typ: 1 (vbext_ct_StdModule - Standard module)
        VBComponent: Dialog3, Typ: 3 (vbext_ct_MSForm - Microsoft Form)
        VBComponent: NewMacros, Typ: 1 (vbext_ct_StdModule - Standard module)
      VBProject: Normal, Typ: 100 (vbext_pt_HostProject - Host project)
        VBComponent: ThisDocument, Typ: 100 (vbext_ct_Document - Document Module)
      SEARCH & REPLACE
      ================
      VBProject: TemplateProject
        VBComponent: ThisDocument
          Not processed!
        VBComponent: AutoNew
          8 replacements
        VBComponent: Dialog1
          19 replacements
        VBComponent: Dialog2
          1 replacements
        VBComponent: Drucken
          0 replacements
        VBComponent: Dialog3
          8 replacements
        VBComponent: NewMacros
          0 replacements
      VBProject: Normal
        VBComponent: ThisDocument
          Not processed!
      SEARCH & REPLACE - TOTAL STATISTICS
      ===================================
      VBProjects processed  : 2
      VBComponents processed: 8
      Replacements done     : 36
    PROCESSING: F:\Test\Word\I-BRIEF_2.dotm
      STATISTICS
      ==========
      VBProject: Normal, Typ: 100 (vbext_pt_HostProject - Host project)
        VBComponent: ThisDocument, Typ: 100 (vbext_ct_Document - Document Module)
      VBProject: TemplateProject, Typ: 100 (vbext_pt_HostProject - Host project)
        VBComponent: ThisDocument, Typ: 100 (vbext_ct_Document - Document Module)
        VBComponent: AutoNew, Typ: 1 (vbext_ct_StdModule - Standard module)
        VBComponent: Dialog1, Typ: 3 (vbext_ct_MSForm - Microsoft Form)
        VBComponent: Dialog2, Typ: 3 (vbext_ct_MSForm - Microsoft Form)
        VBComponent: Drucken, Typ: 1 (vbext_ct_StdModule - Standard module)
        VBComponent: Dialog3, Typ: 3 (vbext_ct_MSForm - Microsoft Form)
        VBComponent: NewMacros, Typ: 1 (vbext_ct_StdModule - Standard module)
      SEARCH & REPLACE
      ================
      VBProject: Normal
        VBComponent: ThisDocument
          Not processed!
      VBProject: TemplateProject
        VBComponent: ThisDocument
          Not processed!
        VBComponent: AutoNew
          8 replacements
        VBComponent: Dialog1
          19 replacements
        VBComponent: Dialog2
          1 replacements
        VBComponent: Drucken
          0 replacements
        VBComponent: Dialog3
          8 replacements
        VBComponent: NewMacros
          0 replacements
      SEARCH & REPLACE - TOTAL STATISTICS
      ===================================
      VBProjects processed  : 4
      VBComponents processed: 16
      Replacements done     : 72
    PROCESSING: F:\Test\Word\I-BRIEF_3.dotm
      STATISTICS
      ==========
      VBProject: Normal, Typ: 100 (vbext_pt_HostProject - Host project)
        VBComponent: ThisDocument, Typ: 100 (vbext_ct_Document - Document Module)
      VBProject: TemplateProject, Typ: 100 (vbext_pt_HostProject - Host project)
        VBComponent: ThisDocument, Typ: 100 (vbext_ct_Document - Document Module)
        VBComponent: AutoNew, Typ: 1 (vbext_ct_StdModule - Standard module)
        VBComponent: Dialog1, Typ: 3 (vbext_ct_MSForm - Microsoft Form)
        VBComponent: Dialog2, Typ: 3 (vbext_ct_MSForm - Microsoft Form)
        VBComponent: Drucken, Typ: 1 (vbext_ct_StdModule - Standard module)
        VBComponent: Dialog3, Typ: 3 (vbext_ct_MSForm - Microsoft Form)
        VBComponent: NewMacros, Typ: 1 (vbext_ct_StdModule - Standard module)
      SEARCH & REPLACE
      ================
      VBProject: Normal
        VBComponent: ThisDocument
          Not processed!
      VBProject: TemplateProject
        VBComponent: ThisDocument
          Not processed!
        VBComponent: AutoNew
          8 replacements
        VBComponent: Dialog1
          19 replacements
        VBComponent: Dialog2
          1 replacements
        VBComponent: Drucken
          0 replacements
        VBComponent: Dialog3
          8 replacements
        VBComponent: NewMacros
          0 replacements
      SEARCH & REPLACE - TOTAL STATISTICS
      ===================================
      VBProjects processed  : 6
      VBComponents processed: 24
      Replacements done     : 108
    +>22:19:40 AutoIt3.exe ended.rc:0
    +>22:19:40 AutoIt3Wrapper Finished.
    >Exit code: 0    Time: 39.78
    Alles anzeigen

    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.

    Zitat von water

    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.

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

    • bazii
    • 12. September 2022 um 10:49

    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)
    Zitat von water
    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.

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

    • bazii
    • 11. September 2022 um 13:16
    Zitat von water

    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?

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

    • bazii
    • 10. September 2022 um 23:46

    Herzlichen Dank für Deine Unterstützung.

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

    • bazii
    • 10. September 2022 um 22:42
    Zitat von water

    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.

    Zitat von water

    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?

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

    • bazii
    • 9. September 2022 um 23:31

    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.

    C
    #include <Word.au3>
    #include <MsgBoxConstants.au3>
    
    ; ********** Änderungen nur NACH dieser Zeile **********
    Global $sSearch = "Tester"                     ; Wonach soll gesucht werden?
    Global $sReplace = "Master"                   ; Wodurch soll es ersetzt werden?
    Global $sTemplate = @ScriptDir & "\I-Brief"  ; Zu verarbeitende Word Vorlagedatei
    ; ********** Änderungen nur VOR dieser Zeile **********
    Global $sExtension = ".dotm"
    
    ; Start the MS Word application
    Global $oWord = _Word_Create()
    If @error Then Exit MsgBox($MB_ICONERROR, "Error", "_Word_Create: @error=" & @error & ", @extended=" & @extended)
    
    ; Process the Template
    _VBAModify($sTemplate)
    
    Exit
    
    Func _VBAModify($sTemplate)
        ; Open the Document
        Global $oDoc = _Word_DocOpen($oWord, $sTemplate & $sExtension)
        If @error Then Exit MsgBox($MB_ICONERROR, "Error", "_Word_DocOpen: @error=" & @error & ", @extended=" & @extended)
    
        ; Open TemplateProject
        $oVBProject = $oWord.VBE.VBProjects("TemplateProject")
        If @error Then Exit MsgBox($MB_ICONERROR, "Error", "VBProjects: @error=" & @error & ", @extended=" & @extended)
    
        ; Open AutoNew VBComponent
        $oVBComponent = $oVBProject.VBComponents("AutoNew")
        If @error Then Exit MsgBox($MB_ICONERROR, "Error", "VBComponents: @error=" & @error & ", @extended=" & @extended)
    
        ; Modify line by line
        $oCodeModule = $oVBComponent.CodeModule
        If @error Then Exit MsgBox($MB_ICONERROR, "Error", "CodeModule: @error=" & @error & ", @extended=" & @extended)
        With $oCodeModule
            For $i = 1 To .CountOfLines
                If StringInStr(.Lines($i, 1), $sSearch) Then .ReplaceLine($i, StringReplace(.Lines($i, 1), $sSearch, $sReplace))
            Next
        EndWith
    
        ; Save as new Document
        _Word_DocSaveAs($oDoc, $sTemplate & "-NEW" & $sExtension, $WdFormatXMLTemplateMacroEnabled)
        If @error Then Exit MsgBox($MB_ICONERROR, "Error", "_Word_DocSaveAs: @error=" & @error & ", @extended=" & Hex(@extended))
    
        ; Close Document
        _Word_DocClose($oDoc)
    EndFunc   ;==>_VBAModify
    Alles anzeigen
  • Microsoft Word: Suche und ersetze Text in den Inhalten der VBA-Progammierung (gelöst)

    • bazii
    • 9. September 2022 um 22:16
    Zitat von water

    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?

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

    • bazii
    • 9. September 2022 um 20:34

    Hallo water,

    vielen Dank für das Script.

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

    Hier meine Konsolenausgabe:

    Code
    >"C:\Program Files (x86)\AutoIt3\SciTE\..\AutoIt3.exe" "C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.au3" /run /prod /ErrorStdOut /in "D:\Documents\Autoit_Software\Word\Vorlagen.au3" /UserParams    
    +>20:26:54 Starting AutoIt3Wrapper (19.1127.1402.0} from:SciTE.exe (4.2.0.0)  Keyboard:00000407  OS:WIN_10/  CPU:X64 OS:X64  Environment(Language:0407)  CodePage:0  utf8.auto.check:4
    +>         SciTEDir => C:\Program Files (x86)\AutoIt3\SciTE   UserDir => C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper   SCITE_USERHOME => C:\Users\juerg\AppData\Local\AutoIt v3\SciTE 
    >Running AU3Check (3.3.16.0)  from:C:\Program Files (x86)\AutoIt3  input:D:\Documents\Autoit_Software\Word\Vorlagen.au3
    +>20:26:54 AU3Check ended.rc:0
    >Running:(3.3.16.0):C:\Program Files (x86)\AutoIt3\autoit3.exe "D:\Documents\Autoit_Software\Word\Vorlagen.au3"    
    +>Setting Hotkeys...--> Press Ctrl+Alt+Break to Restart or Ctrl+BREAK to Stop.
    "D:\Documents\Autoit_Software\Word\Vorlagen.au3" (26) : ==> The requested action with this object has failed.:
    $oVBProject = $oWord.VBE.VBProjects("TemplateProject")
    $oVBProject = $oWord^ ERROR
    ->20:26:58 AutoIt3.exe ended.rc:1
    +>20:26:58 AutoIt3Wrapper Finished.
    >Exit code: 1    Time: 4.484
    Alles anzeigen

    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?

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™