Suchen in Word-Textfeldern
Hallo Forum,
ich habe folgendes Problem. In einer Word-Datei habe ich pro Seite normalen Text und jeweils ein Textfeld. Diese sehen immer gleich aus. Per Schleife gehe ich durch den Text und muss jeweils einzelne Stellen im normalen Text und im Textfeld durch andere Werte ersetzen. Ich habe im Text und im Textfeld die zu ersetzenden Stellen durch Platzhalter "AAAA", "BBBB", "CCCC" etc. markiert.
Wie muss der Code aussehen, bei dem ich beim Suchen und Ersetzen auch das Textfeld mit ansteuern und hinterher wieder verlassen kann? Kann mir jemand einen kurzen Beispielcode basteln?
Vielen Dank,
M. Born
ich habe folgendes Problem. In einer Word-Datei habe ich pro Seite normalen Text und jeweils ein Textfeld. Diese sehen immer gleich aus. Per Schleife gehe ich durch den Text und muss jeweils einzelne Stellen im normalen Text und im Textfeld durch andere Werte ersetzen. Ich habe im Text und im Textfeld die zu ersetzenden Stellen durch Platzhalter "AAAA", "BBBB", "CCCC" etc. markiert.
Wie muss der Code aussehen, bei dem ich beim Suchen und Ersetzen auch das Textfeld mit ansteuern und hinterher wieder verlassen kann? Kann mir jemand einen kurzen Beispielcode basteln?
Vielen Dank,
M. Born
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 302897
Url: https://administrator.de/contentid/302897
Ausgedruckt am: 21.11.2024 um 21:11 Uhr
17 Kommentare
Neuester Kommentar
Mit einer FOR EACH Schleife über die Collection aller Felder iterieren:
https://msdn.microsoft.com/de-de/library/microsoft.office.tools.word.doc ...
Die Result Eigenschaft enthält den Text.
Gruß jodel32
https://msdn.microsoft.com/de-de/library/microsoft.office.tools.word.doc ...
Die Result Eigenschaft enthält den Text.
Gruß jodel32
Leider funktioniert das mit For Each nicht
Quatsch, natürlich funktioniert das... Du kannst nur den Inhalt jeder einzelnen Seite markieren dann bekommst du einen Range in dem du nur die Felder bekommst die sich auf dieser Seite befinden.Die FormFields-Collection gibt es auch für das RANGE-Objekt:
https://msdn.microsoft.com/de-de/library/office/ff834816.aspx
Korrekt.
Hallo Marco,
hier ein kleines Beispiel:
Grüße Uwe
hier ein kleines Beispiel:
Sub ReplaceFormFieldTextOnPages()
Dim intPage As Integer, rngPage As Range, f As FormField
' Startseite
intPage = 1
' Gehe zur ersten Seite
Selection.GoTo wdGoToPage, wdGoToAbsolute, intPage
'setze Range initial auf den Anfang
Set rngPage = Selection.Range
'Loope so lange wir nicht am Ende angekommen sind
Do
' setze den Range auf die aktuelle Seite
Set rngPage = selectPageRange(intPage, intPage)
'Loope durch die Felder dieser Seite
For Each f In rngPage.FormFields
'je nach dem was das Feld enthält den Inhalt passend ersetzen
Select Case f.Result
Case "AAAA"
f.Result = "REPLACEMENT A"
Case "BBBB"
f.Result = "REPLACEMENT B"
'usw.
End Select
Next
'Nächste Seite
intPage = intPage + 1
Loop Until rngPage.End = ActiveDocument.Range.End - 1
End Sub
'Function: select specific page range and return Range-Object
Function selectPageRange(pageFrom As Integer, Optional pageTo As Integer = 0, Optional selectRange As Boolean = False) As Range
Dim rngPages As Range
Set rngPages = Selection.GoTo(wdGoToPage, wdGoToAbsolute, pageFrom)
If pageTo <> 0 Then
Selection.GoTo wdGoToPage, wdGoToAbsolute, pageTo
End If
rngPages.End = Selection.Bookmarks("\Page").Range.End
Set selectPageRange = rngPages
If selectRange Then
rngPages.Select
End If
End Function
Hi, der Code von @colinardo funktioniert hier testweise einwandfrei wenn es sich um die klassischen Formularfelder handelt. Es gibt in Word auch aber auch noch die normale Fields Collection. Dann wirst du damit arbeiten müssen.
Da gebe ich @114757 recht. Willst du alle Felder(Feldfunktionsfelder) und nicht nur die klassischen Formfelder durchsuchen änderst du die FOR-Schleife der Felder so ab:
und Wichtig: Oben in der Deklaration der Variablen den Typ der Variablen f ändern.
Es kann aber auch sein das deine Felder sich in Sub-Stories befinden, dann muss man weiter Rekursiv hinein tauchen. Dazu wäre es gut wenn du mal eine Seite des Dokuments zur Verfügung stellen könntest.
Grüße Uwe
For Each f In rngPage.Fields
'je nach dem was das Feld enthält den Inhalt passend ersetzen
Select Case f.Result
Case "AAAA"
f.Result.Text = "REPLACEMENT A"
Case "BBBB"
f.Result.Text = "REPLACEMENT B"
'usw.
End Select
Next
dim f As Field
Grüße Uwe
Zitat von @MarcoBorn:
Ich habe keine Formularfelder, sondern Textfelder. Ich werde mal sehen, ob ich Uwe's Code auf die Fields-Collection anwenden kann.
D.h. die neuartigen ContentControls? Dann muss der Code geändert werden , denn dieser bezieht sich momentan auf die Feldfunktionsfelder und nicht die "ContentControls", die werden anders angesprochen.Ich habe keine Formularfelder, sondern Textfelder. Ich werde mal sehen, ob ich Uwe's Code auf die Fields-Collection anwenden kann.
Mach doch einfach mal schnell einen Screenshot, dann reden wir hier nicht andauernd aneinander vorbei. Danke!
Wenn es die neuen "ContentControls" sind in denen dein Text steht - diese sehen so aus,
dann sieht der Code folgendermaßen aus:
Jetzt hast du alle Varianten für alle Arten von Feldern
dann sieht der Code folgendermaßen aus:
Sub ReplaceFormFieldText()
Dim intPage As Integer, rngPage As Range, f As ContentControl
' Startseite
intPage = 1
' Gehe zur ersten Seite
Selection.GoTo wdGoToPage, wdGoToAbsolute, intPage
'setze Range initial auf den Anfang
Set rngPage = Selection.Range
'Loope so lange wir nicht am Ende angekommen sind
Do
' setze den Range auf die aktuelle Seite
Set rngPage = selectPageRange(intPage, intPage)
'Loope durch die Felder dieser Seite
For Each f In rngPage.ContentControls
'je nach dem was das Feld enthält den Inhalt passend ersetzen
Select Case f.Range.Text
Case "AAAA"
f.Range.Text = "REPLACEMENT A"
Case "BBBB"
f.Range.Text = "REPLACEMENT B"
'usw.
End Select
Next
'Nächste Seite
intPage = intPage + 1
Loop Until rngPage.End = ActiveDocument.Range.End - 1
End Sub
'Function: select specific page range and return Range-Object
Function selectPageRange(pageFrom As Integer, Optional pageTo As Integer = 0, Optional selectRange As Boolean = False) As Range
Dim rngPages As Range
Set rngPages = Selection.GoTo(wdGoToPage, wdGoToAbsolute, pageFrom)
If pageTo <> 0 Then
Selection.GoTo wdGoToPage, wdGoToAbsolute, pageTo
End If
rngPages.End = Selection.Bookmarks("\Page").Range.End
Set selectPageRange = rngPages
If selectRange Then
rngPages.Select
End If
End Function