Aktuelle Seite:
/vba/vbafindreplace.htm
Letzte Änderung: 24.06.2006

Getestet unter Word2000Getestet unter WordXP  
Makro/Datei speichern
Print

Die Suchen-Funktion bzw. Suchen-und-Ersetzen-Funktion ist auch in VBA eine mächtige Funktion, die eine Vielzahl von Möglichkeiten mit sich bringt.
Das folgende Beispiel befasst sich mit der Suche nach Texten, die zwischen zwei Tags (Start- und End-Tag) eingeschlossen sind. Beispieltext:

Dieses ist ein <|Beispieltext|> für die Suche nach <|Tags|>

In diesem Beispielsatz soll nach dem Text zwischen den Tags <| und |> gesucht werden; dabei sollen die Tags mitberücksichtigt werden.

Als Ergebnis sollte der hervorgehobene Text entweder nur markiert oder ggf. auch gelöscht werden:

Dieses ist ein <|Beispieltext|> für die Suche nach <|Tags|>

Die nachfolgende Funktion verwendet nur das Range-Objekt, um im Text bestimmte Bereiche zu markieren und zu bearbeiten.
Bevor im Range-Objekt gesucht werden kann, muss dieses Range-Objekt (rng) zuerst einmal angelegt werden. Dazu wird der gesamte Dokumenten-Textbereich verwendet, der den zu durchsuchenden Bereich darstellt. Der gefundene Text wird im Range-Objekt rngText abgelegt; dazu wird dieses Objekt als Duplikat des Dokument-Range-Objektes festgelegt; es kann aber auch jeder andere Range-Bereich verwendet werden, z.B.

Set rngText = ActiveDocument.Range(0,0)

Anschließend wird der Range-Bereich reduziert, indem der Anfang hinter das gefunden Start-Tag verschoben wird (rng.SetRange)

Danach wird im neuen Range-Bereich nach dem End-Tag gesucht. Wenn der End-Tag nicht gefunden wird, wird die Funktion beendet. Wird das End-Tag gefunden, wird der Range-Bereich rngText bis zum Ende des End-Tags erweitert. Über die Zusatzoption wird dann gesteuert, was mit dem gefundenen Text geschehen soll: nur farblich hervorheben oder löschen.
Damit die Suche erst hinter dem gefundenen End-Tag weitergeführt wird, wird der Range-Bereich rng wieder auf die Endposition reduziert.

Anschließend wird erneut nach dem Start-Tag gesucht. Und sofern ein weiteres Start-Tag gefunden wird (.Found = True), greift die Do...Loop-Schleife und es erfolgt ein erneuter Suchlauf nach dem End-Tag.

Function fkt_Search(strStart As String, strEnd As String, bDelete As Boolean)
Dim rng As Range 
Dim rngText As Range 
' Range festlegen  
Set rng = ActiveDocument.Range
' Range festlegen  
Set rngText = ActiveDocument.Range(0, 0)
rngText.Collapse wdCollapseStart 
' Such-Schleife  
With rng.Find
 .Format = False 
 .Text = strStart
 ' Suche nach Start-Tag  
 .Execute
 Do While .Found = True 
   ' Fundstelle mit Start-Tag anlegen  
   rngText.SetRange rng.Start, rng.End
   ' Suchtextbereich reduzieren  
   rng.SetRange rng.End, ActiveDocument.Range.End
   ' Suche nach End-Tag  
   .Execute FindText:=strEnd, Forward:=True 
   ' Abbruch wenn kein End-Tag  
   If .Found = False Then Exit Function 
   ' Fundstelle bis End-Tag erweitern  
   rngText.SetRange rngText.Start, rng.End
   If bDelete = False Then 
   ' fablich hervorheben  
     rngText.Select
     rngText.Font.Color = wdColorAqua
   Else 
   ' löschen  
     rngText.Delete
   End If 
   ' Suchtextbereich zur Endposition reduzieren  
   rng.Collapse wdCollapseEnd 
   ' Start-Tag suchen  
   .Execute FindText:=strStart, Forward:=True 
 Loop 
 rng.Collapse wdCollapseEnd 
End With 
End Function 

Der Aufruf erfolgt aus einer Prozedur heraus, wobei als Parameter die Zeichenkette für das Start- und End-Tag angegeben werden muss sowie die Angabe, ob der Text nur markiert oder gelöscht werden soll.

Sub SearchAndReplace()  
fkt_Search "<|", "|>", False 
End Sub 

 www.chf-online.de/vba/vbafindreplace.htm © 2001-11 Christian Freßdorf (Zaphod-Systems)