Find.Execute landet innerhalb eines Index-Eintrags von Word

  • Word

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Roland_Bell.

    Find.Execute landet innerhalb eines Index-Eintrags von Word

    Hallo,
    mein Code durchsucht einen Absatz (via Range) nach einem Wort (Z.B. "Farbe"). Nach dem Fund wird das Wort hervorgehoben, Range.Start wird hinter den Suchbegriff verschoben, Range.End wieder auf das Ende des Absatzes. Mit Do … Loop wird solange gesucht, bis nichts mehr gefunden wird (siehe Code).

    Zwei Probleme, wenn der gesuchte Begriff innerhalb eines Index-Eintrages steht (z.B. { XE "Farben" }):

    1. Hier soll der Begriff natürlich nicht hervorgehoben werden. Wie kann ich feststellen, dass mein Range innerhalb eines Feldes liegt? (Range.Fields.count ist null, weil das Feld nicht eingeschlossen ist. Range.Font.Hidden ist nicht True, da der Index-Eintrag nicht ausgeblendet ist im Sinne einer Zeichenformatierung.)

    2. Wie kann ich Range.Start hinter die letzte Klammer des Feldes "}" setzen? Tue ich das nicht, wird nicht nur der Teil des Feldes hinter meinem Suchauftrag als neuer Suchbereich gewählt, sondern automatisch das gesamte Feld. Die Suchroutine findet wieder denselben Begriff und das Programm läuft sich tod.

    Natürlich kann ich eine Funktion definieren, die alle Felder des Absatzes durchzählt und testen, ob mein Suchbegriff innerhalb steht. Aber ich hoffe, es gibt eine einfachere Lösung.

    Vielen Dank im Voraus.

    Visual Basic-Quellcode

    1. Dim Bereich as Range, Abschnitt(q) as Range, Farbe as Integer, Modus as Integer
    2. ...
    3. Do
    4. If Bereich.Find.Execute("farbe", , , , , , True, wdFindStop) = False Then Exit Do
    5. If Modus = 1 Then Bereich.Font.ColorIndex = Farbe
    6. Bereich.SetRange Bereich.End, Abschnitt(q).End
    7. Loop
    Ich habe eine Lösung gefunden und stelle sie für nachfolgende Generationen ein:

    Visual Basic-Quellcode

    1. Dim Bereich as Range, Abschnitt(q) as Range, Farbe as Integer, Modus as Integer
    2. Dim Temp as Range 'neues Range Objekt
    3. ...
    4. Do
    5. If Bereich.Find.Execute("Wort", , , , , , True, wdFindStop) = False Then Exit Do
    6. Set Temp = Bereich.Duplicate 'Das gefundene "Wort" wird dubliziert
    7. Temp.SetRange Abschnitt(q).Start, Temp.End
    8. 'Der Anfang des Ranges wird nach Vorne verschoben (kann auch der Anfang des Dokuments sein: Temp.SetRange 1, Temp.End)
    9. If Temp.Fields.Count > 0 Then 'befinden sich Felder im Bereich?
    10. Temp.End = Temp.Fields(Temp.Fields.Count).Code.End 'Schauen wir uns das letzte Feld an. Wie weit reicht der Code?
    11. End If
    12. If Temp.End > Bereich.End Then 'Geht der Code des Feldes über das Suchende hinaus, befindet sich "Bereich" innerhalb eines Feldes
    13. Bereich.SetRange Temp.End + 1, Abschnitt(q).End 'Bereich wird hinter das Feld gebogen
    14. Else 'Wenn nicht, wird markiert wie im ursprünglichen Code
    15. If Modus = 1 Then Bereich.Font.ColorIndex = Farbe
    16. Bereich.SetRange Bereich.End, Abschnitt(q).End
    17. End if
    18. Loop


    Damit sei das Thema beendet