Beiträge von MiX-MoX
-
-
-
Moin!
vielen Dank für die Erläuterungen und Codeanpassungen.
Ihr habt den Code aber nicht getestet, oder? - da stecken noch drei kleine Fehler drin:
in Zeile 24 muss die Variable $aTags als Array definiert sein, also Global $aTags [1]
in Zeile 46 muss Next durch WEnd ersetzt werden.
Außerdem habe ich festgestellt, dass das Array $aTags leer bleibt - muss noch prüfen, woran das liegt.
-
Hallo Water,
vielen Dank für Deine kritische Betrachtung.
Tatsächlich kann ich auf FileOpen verzichten, da ich die Files nur auslese, aber nicht manipuliere.
$col wird mit Funktionsaufruf von _read_file definiert.
Beim ersten Funktionsaufruf von _read_file ist das Array von $aTags noch 1D,
Beim zweiten Funktionsaufruf von _rad_file ist es 2D.
$file_s und $file_r müssen so belegt sein, dass die Zeilen entsprechend korrespondieren.
In jeder Zeile von $aTags steht dann in der ersten Spalte der Such-String und in der zweiten Spalte der entsprechende Ersetzen-String.
Sonst würde der Aufruf von $aTags in Word_DocFindReplace auch nicht funktionieren.Buchstabe "W" hatte ich eigentlich schon herauseditiert - keine Ahnung, weshalb Du den noch sehen konntest.
Der Code ist nur um sehr spezifische Datails gekürzt, dennoch voll funktionsfähig, so wie er da steht.
-
Hallo zusammen,
hier mein Code:
C
Alles anzeigen#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 ;~ #DIESE ROUTINE WIRD ÜBER PARAMETER AUFGERUFEN Opt("MustDeclareVars", 1) Local $sSearch_1 = $CmdLine[1] Local $sSearch_2 = $CmdLine[2] global $aTags [1] global $col ;~ File mit den Suchkriterien global $file_s = "f_search.txt" _read_file($file_s,1) ;~ File mit den Replace-Strings global $file_r = $sSearch_2 & ".txt" _read_file($file_r,2) Global $sExtension = ".docx" ; Verarbeite nur MS-Word Dokument ohne Macros. Global $sTemplate = _FileListToArrayRec(@ScriptDir, $sSearch_1 & $sExtension, $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH) ; Auflistung der rekursiv zu verarbeitenden MS-Word Dateien Global $iTotalProjectCount = 0, $iTotalComponentCount = 0, $iTotalReplacementCount = 0 For $i = 1 To $sTemplate[0] ; rekursives Ermitteln der zu verarbeitenden Dateien _Main($sTemplate[$i]) Next ;Funktion zum Einlesen der Textefiles in Arrays Func _read_file($file_x,$col ) FileOpen($file_x, 0) ReDim $aTags[_FileCountLines($file_x) + 1] [$col] For $i = 1 To _FileCountLines($file_x) $aTags [$i-1][$col-1] = FileReadLine($file_x, $i) Next return $aTags FileClose($file_x) EndFunc Func _Main($sTemplate) Local $oWord = _Word_Create() If @error Then Return SetError(1, 0, MsgBox(16, '_Word_Open', '@error: ' & @error) * 0) If Not IsObj($oWord) Then Return SetError(1, 1, MsgBox(16, '_Word_DocOpen', '$oWord is not an Obj') * 0) Local $oWordDoc = _Word_DocOpen($oWord, $sTemplate) If @error Then Return SetError(2, 0, MsgBox(16, '_Word_DocOpen', '@error: ' & @error) * 0) If Not IsObj($oWordDoc) Then Return SetError(2, 0, MsgBox(16, '_Word_DocOpen', '$oWordDoc is not an Obj') * 0) For $j = 0 To UBound($aTags, 1) - 1 _Word_DocFindReplace($oWordDoc, $aTags[$j][0], $aTags[$j][1], Default, -1) Next consolewrite(@ScriptDir&@CRLF) Local $sFileName = @ScriptDir & "\"&$sSearch_1&"-"&$sSearch_2 &".pdf" _Word_DocExport($oWordDoc, $sFileName, Default, $wdExportCurrentPage) _Word_DocClose($oWordDoc, false) ; speichern nicht vergessen If @error Then Return SetError(3, 0, MsgBox(16, '_Word_DocClose', '@error: ' & @error) * 0) _Word_Quit($oWord) If @error Then Return SetError(4, 0, MsgBox(16, '_Word_Quit', '@error: ' & @error) * 0) Return SetError(0, 0, 1) EndFunc ;==>_Main
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. -
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!
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?