Word - Inhalt der Kopfzeile bearbeiten

  • Nabend

    Ich hab zu meiner Frage bereits Tante Google bemüht, aber keine wirkliche Antwort gefunden.

    In einem Word-Dokument nutze ich _Word_DocFindReplace bzw. _Word_DocFind, um vorhandenen Text zu ändern, ergänzen etc.
    Das gleiche möchte ich nun mit dem Inhalt der Kopfzeile tun, darin befindet sich zum Bsp. eine Empfängeranschrift, habe jedoch keine Idee, wie ich auf die Kopfzeile zugreife bzw. sie zum bearbeiten öffne und schließe. ?(
    Vermutlich ist das wieder eine leichte Kleinigkeit, hoffe die fällt jemanden von Euch ganz spontan ein. ;)

    Schonmal Danke für eure Hilfe

  • Suchen/ersetzen in der Kopf- und Fußzeile könntest Du durch auslesen, ersetzen, neu schreiben erreichen.
    Dazu hatte Bugfix ein Beispiel zur Bearbeitung der Kopf-Fußzeile erstellt.

    Beispiel ist in den ersten drei Zeilen auf die Fußzeile ausgelegt (hier auskommentiert). Dazu ist dann die Funktion nutzbar.
    Im folgenden Beispiel wird die Kopf- und Fußzeile neu bestimmt.

    Spoiler anzeigen
    [autoit]


    ;$dpfad= "C:\AutoIt3\WordEx\test.docx"
    ;$neuFuss="Diese ist eine neue Fusszeile"
    ;_WordDoc_FooterChange($dpfad,$neuFuss)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local Const $wdHeaderFooterPrimary = 1

    [/autoit] [autoit][/autoit] [autoit]

    $oWord = ObjCreate("Word.Application")
    $oWord.Visible = False ; bleibt unsichtbar
    $oWord.Documents.Open ('C:\AutoIt3\WordEx\test.docx') ; eine bestehende Datei aufrufen

    [/autoit] [autoit][/autoit] [autoit]

    ; aktuelle Fußzeile auslesen
    ConsoleWrite('Fußzeile aktuell:' & @CRLF & $oWord.ActiveDocument.Sections(1).Footers($wdHeaderFooterPrimary).Range.Text & @CRLF)
    ConsoleWrite('Kopfzeile aktuell:' & @CRLF & $oWord.ActiveDocument.Sections(1).Headers($wdHeaderFooterPrimary).Range.Text & @CRLF)
    ; neue Fußzeile zuweisen
    $sFooterNew = 'neue Fußzeile eingetragen'
    $oWord.ActiveDocument.Sections(1).Footers($wdHeaderFooterPrimary).Range.Text = $sFooterNew

    [/autoit] [autoit][/autoit] [autoit]

    $sHeaderNew = 'neue Kopfzeile eingetragen'
    $oWord.ActiveDocument.Sections(1).Headers($wdHeaderFooterPrimary).Range.Text = $sHeaderNew

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $oWord.Application.DisplayAlerts = False
    $oWord.ActiveDocument.Save
    $oWord.Quit
    ;===============================================================================
    ; Function Name....: _WordDoc_FooterChange
    ; Description......: Ändert in einem Worddokument die Fußzeile
    ; Parameter(s).....: $sPath Pfad zum Word Dokument
    ; $sFooterNew Die neue Fußzeile
    ; optional $fVisible Wordfenster sichtbar, Standard=0 (Nein)
    ; optional $fSave Speichern der Änderung? Standard=1 (Ja)
    ; optional $fQuit Word beenden? Standard=0 (Nein), mit "1" wird auch $fSave=1 gesetzt
    ; Return Value(s)..: Erfolg Den alten Inhalt der Fußzeile
    ; Fehler @error = 1 - Dateipfad existiert nicht
    ; Note.............: Falls Word bereits geöffnet ist, wird in dieser Instanz gearbeitet, anderenfalls wird eine neue Instanz erstellt.
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _WordDoc_FooterChange($sPath, $sFooterNew, $fVisible=False, $fSave=1, $fQuit=0)
    If not FileExists($sPath) Then Return SetError(1,0,0)
    If $fQuit = 1 Then $fSave = 1
    Local Const $wdHeaderFooterPrimary = 1
    Local $sFooterOld, $oWord, $fCreated = 0
    $oWord = ObjGet($sPath, "Word.Application")
    If @error Then
    $oWord = ObjCreate("Word.Application")
    $fCreated = 1
    EndIf
    $oWord.Visible = $fVisible
    If $fCreated Then $oWord.Documents.Open($sPath)
    $sFooterOld = $oWord.ActiveDocument.Sections(1).Footers($wdHeaderFooterPrimary).Range.Text
    $oWord.ActiveDocument.Sections(1).Footers($wdHeaderFooterPrimary).Range.Text = $sFooterNew
    $oWord.Application.DisplayAlerts = False
    If $fSave Then $oWord.ActiveDocument.Save
    If $fQuit Then $oWord.Quit
    Return $sFooterOld
    EndFunc ;==>_WordDoc_FooterChange

    [/autoit]
  • Hm... damit ersetze ich aber die komplette Kopfzeile.
    Ich möchte nur ein Teil in der Kopfzeile ersetzen/ergänzen, da diese entsprechend eines Briefkopfs bereits weitere Details wie den Absender enthält.

    Es würde also genügen, wenn man entweder die Kopfzeile aktivieren kann oder definieren kann, wo _Word_DocFind sucht.
    Die Word-Suche findet den gesuchten Inhalt in der Kopfzeile, es sollte meiner Meinung nach also auch mit _Word_DocFind funktionieren - hoffe ich jedenfalls.^^

  • Ja klar ersetzt du die kpl. Kopfzeile, ist doch der einfachste Weg:
    - Kopfzeile alt auslesen
    - wie gewollt zu neuer Kopfzeile ändern
    - Kopfzeile neu schreiben

    Mir scheint das dann noch nicht klar genug zu sein.

    Wie suche/ersetze ich innerhalb von

    [autoit]

    $oWord.ActiveDocument.Sections(1).Headers($wdHeaderFooterPrimary).Range.Text

    [/autoit]

    mit der von mir genannten Funktion _Word_DocFindReplace ? ?(

    Soweit ich dem Folgen kann, steckt in

    [autoit]

    $oWord.ActiveDocument.Sections(1).Headers($wdHeaderFooterPrimary).Range

    [/autoit]

    ein Range, vergleichbar mit dem Ergebnis von Word_DocFind.
    Und mit dem Zusatz .Text = $sHeaderNew wird dieses Range - und damit der komplette Header inklusive Formatierungen etc - sofort mit dem Wert der angegebenen Variable überschrieben.

  • Soweit ich weiss, sind die von Dir genannten Funktionen nicht in der Kopf- und Fußzeile anwendbar.
    Deshalb auslesen, neu zusammensetzen, schreiben.

    In Word greift manuelles "suchen/ersetzen" auch nicht in der Kopf- und Fußzeile.
    StringReplace könnte ein Losungsansatz für Dich sein.

    Zeige bitte ein Beispiel der Kopfzeile und wie soll diese dann nach der Änderung aussehen.

    • Offizieller Beitrag

    Suchen & Ersetzen geht mit Standardfunktion ausschließlich im Body.
    Um im gesamten Dokument (Header, Footer, Textfeld, etc. pp.) zu Suchen & Ersetzen mußt du durch alle Bestandteile des Dokuments iterieren und darauf Suchen&Ersetzen anwenden.
    Wie es geht, ist hier beschrieben.

    Der Einfachheit halber würde ich das auch als Makro erstellen und nur das Makro aus AutoIt heraus aufrufen (mit Übergabe Such-/ Ersetztext). Denn dieser VBA-Code enthält in der Sub "SearchAndReplaceInStory" die Zeile
    .Execute Replace:=wdReplaceAll
    Das blaue ist der Problemteil. Die MSDN-Beschreibung zu Range.Find.Execute läßt offen, welches die Defaultwerte sind. Wenn ich in AutoIt diese Methode aufrufe, muß ich alle Parameter übergeben (VBA braucht nur den/die gewünschten angeben). Deshalb brauche ich die Standardwerte.
    Aber das könnte man sicher auch hinfrickeln. Probier einfach mal.