Word Seitenzahlen für Suchstring ermitteln
Hallo,
Mittels vba möchte ich ein ganzes Word-Dokument nach einem bestimmten String durchsuchen und alle Seitenzahlen wo dieser String auftaucht in eine Variable (Array) schreiben.
Diese Variable nutze ich dann für die weitere Verarbeitung.
Wie bekomme ich an dieser Stelle die Seitenzahl?
Torsten
Mittels vba möchte ich ein ganzes Word-Dokument nach einem bestimmten String durchsuchen und alle Seitenzahlen wo dieser String auftaucht in eine Variable (Array) schreiben.
Diese Variable nutze ich dann für die weitere Verarbeitung.
With ActiveDocument.Content.Find
.Text = "MeinSuchString"
Do While .Execute
[Seitenzahl in Array]
Loop
End With
Wie bekomme ich an dieser Stelle die Seitenzahl?
Torsten
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 299460
Url: https://administrator.de/contentid/299460
Ausgedruckt am: 22.11.2024 um 04:11 Uhr
22 Kommentare
Neuester Kommentar
Mit einer Collection so
oder auch mit Plain-Array so:
Gruß jodel32
Dim col As New Collection
Selection.GoTo wdGoToPage, wdGoToFirst
ActiveDocument.Content.Select
With Selection.Find
.ClearFormatting
.Text = "MeinSuchString"
.Forward = True
Do While .Execute
col.Add Selection.Information(wdActiveEndPageNumber)
Loop
End With
for each item in col
msgbox "Gefunden auf Seite : " & item
Next
Dim arr(), cnt As Long
cnt = 1
Selection.GoTo wdGoToPage, wdGoToFirst
ActiveDocument.Content.Select
With Selection.Find
.ClearFormatting
.Text = "MeinSuchString"
.Forward = True
Do While .Execute
ReDim Preserve arr(1 To cnt)
arr(cnt) = Selection.Information(wdActiveEndPageNumber)
cnt = cnt + 1
Loop
End With
For i = 1 To UBound(arr)
MsgBox "Gefunden auf Seite: " & arr(i)
Next
Zitat von @goodbytes:
Was mir noch einfällt, ist aber nur so ein Gedanke, wie könnte ich beim Auffinden des Suchstrings eigentlich eine feste Anzahl der nachfolgenden Zeichen (in dem Fall steht die Dokumentennummer immer hinter dem Suchstring) in ein zweites Array schreiben?
Geht einfach, deklariere am Anfang ein zweites ArrayWas mir noch einfällt, ist aber nur so ein Gedanke, wie könnte ich beim Auffinden des Suchstrings eigentlich eine feste Anzahl der nachfolgenden Zeichen (in dem Fall steht die Dokumentennummer immer hinter dem Suchstring) in ein zweites Array schreiben?
dim arr2()
ReDim Preserve arr2(1 To cnt)
arr2(cnt) = Range(Selection.End, Selection.End + 4).Text
Dann steht dein Code in einem Modul und nicht im ActiveDocument Abschnitt, dann musst du stattdessen vorne noch das Dokument mit angeben...ActiveDocument.Content.Range(.......)
Geht ansonsten einwandfrei, hier getestet.
Geht ansonsten einwandfrei, hier getestet.
Muss ich dafür eine extra Schleife drumherum machen
Jupp, wenn er nur noch in den Headern steckt ja.Wenn du komplett alles durchsuchen willst kannst du auch die StoryRanges Auflistung hernehmen:
dim rng as Range
for each rng in ActiveDocument.StoryRanges
'...
Next
nicht im Objekt der Story suchen sondern wie ich es oben gemacht habe den Range der Story selektieren und dann mit dem Selection-Objekt arbeiten.
Es gibt auch noch wdHeaderFooterPrimary für die Kopfzeilen, deine verwendete Kopfzeile existiert nur wenn die erste Seite eine andere Kopfzeile hat wie die folgenden, Seiten der Section, deswegen musst du beide durchsuchen wenn du jeweils beide verwendest.
sec.Headers(wdHeaderFooterPrimary).Range.Select
Sorry, dafür habe ich im Moment keine Lösung. Die Info gibt, wenn sich die Selection innerhalb des Headers befindet dort immer die erste Seite der jeweiligen Section aus, egal auf welcher Seite der Section das Suchwort gefunden wurde. Ich habe es auch mit Goto-Sprüngen in die Main-Story der Seite versucht, leider ergebnislos.
Du könntest alternativ ein nicht unsichtbares Seitenzahlenfeld in den Header einbauen, das könnte man dann auslesen und verwenden.
Du könntest alternativ ein nicht unsichtbares Seitenzahlenfeld in den Header einbauen, das könnte man dann auslesen und verwenden.
Naja das listet ja nur alle Sections hintereinander auf. Aber wenn dir das reicht...
Den aktuellen Section-Bereich für die aktuelle Selection bekommst du so
Den aktuellen Section-Bereich für die aktuelle Selection bekommst du so
Sub ShowSelectionSectionRange()
With ActiveDocument
start_section_index = Selection.Sections(1).Index
If start_section_index > 1 Then
sel_page_start = CInt(.Sections(start_section_index - 1).Range.Information(wdActiveEndPageNumber)) + 1
sel_page_end = .Sections(start_section_index).Range.Information(wdActiveEndPageNumber)
Else
sel_page_start = 1
sel_page_end = Selection.Sections(1).Range.Information(wdActiveEndPageNumber)
End If
msgbox "Selektion befindet sich in Section " & start_section_index & " mit den Seiten: " & sel_page_start & "-" & sel_page_end
End With
End Sub