Word VBA Problem mit TextFrame.TextRange.Find

  • Word

    Word VBA Problem mit TextFrame.TextRange.Find

    Gelöst.

    Hallo Leute,

    unten im Spoiler der Original Thread.

    Der Fehler war mal wieder ich.
    Mit dem gestellten Code, hätte gar keiner auf eine Lösung kommen können, da dort alles richtig läuft.

    Ich habe fälschlicherweise ein ArrayList Objekt übergeben, statt des darin gespeicherten Range Objektes.

    Hier der Code der den Fehler verursacht hat:

    Visual Basic-Quellcode

    1. Set wdRange = getShapeRanges(wdDoc)
    2. For Each rng In wdRange
    3. executeReplacement wdRange, oldKeys.ToArray, newKeys.ToArray
    4. Next rng


    und hier in richtig:

    Visual Basic-Quellcode

    1. Set wdRange = getShapeRanges(wdDoc)
    2. For Each rng In wdRange
    3. executeReplacement rng, oldKeys.ToArray, newKeys.ToArray
    4. Next rng


    Spoiler anzeigen
    Hallo Leute,

    ich muss in verschiedenen Shapes nach Werten suchen und diese ersetzen.

    Ich habe mir eine kleine Prozedur geschrieben, welche das Suchen und Ersetzen übernimmt.
    mit einer normalen Range funktioniert es wunderbar, bei TextRanges bricht er ab und sagt mir,
    dass das Object diese Funktion nicht unterstützt... was nicht stimmt.
    Eine TextRange hat ebenso die .Find Methode implementiert.
    (ganz unten noch eine Funktion um zu zeigen was ich mit normaler Range meine)

    Kennt jemand das Problem oder erkennt es an meinem Code?
    Ich komm nicht drauf.
    Alternativ kann ich natürlich eine Replace Methode schreiben extra für die TextRanges aber das würde ich
    falls möglich vermeiden wollen.

    Kleiner Nachtrag:
    Bei Word VBA erhält man tatsächlich ein Range Objekt und kein TextRange Objekt.
    Das TextRange Objekt gibt es bei PowerPoint.

    Um die TextRanges der Shapes zu erhalten, verwende ich folgende Funktion:

    Visual Basic-Quellcode

    1. Private Function getShapeRanges(ByRef wdDoc As Object) As Object
    2. Dim list As Object
    3. Dim rng As Object
    4. Dim shape As Object
    5. Set list = CreateObject("System.Collections.ArrayList")
    6. For Each shape In wdDoc.Shapes
    7. Set rng = shape.TextFrame.TextRange
    8. list.Add rng
    9. Next shape
    10. Set getShapeRanges = list
    11. End Function


    Für das Suchen und Ersetzen verwende ich folgenden Sub:

    Visual Basic-Quellcode

    1. Private Sub executeReplacement(ByRef myRange As Object, ByRef keyList As Variant, ByRef valueList As Variant)
    2. Dim i As Long
    3. If myRange Is Nothing Then Exit Sub
    4. If LBound(keyList) <> LBound(valueList) Then Exit Sub
    5. If UBound(keyList) <> UBound(valueList) Then Exit Sub
    6. On Error Resume Next
    7. For i = LBound(keyList) To UBound(keyList)
    8. With myRange.Find
    9. .Text = keyList(i)
    10. .MatchCase = True
    11. .MatchSoundsLike = False
    12. .MatchWholeWord = True
    13. .replacement.Text = valueList(i)
    14. .Execute Replace:=wdReplaceAll, _
    15. Forward:=True, _
    16. Wrap:=wdFindContinue
    17. End With
    18. Next i
    19. End Sub


    gibt ein Word.Range Objekt zurück

    Visual Basic-Quellcode

    1. Private Function getDocumentRange(ByRef wdDoc As Object) As Object
    2. Dim rng As Object
    3. Set rng = wdDoc.Range(wdDoc.Paragraphs(1).Range.start, _
    4. wdDoc.Paragraphs( _
    5. wdDoc.Paragraphs.Count _
    6. ).Range.End)
    7. Set getDocumentRange = rng
    8. End Function


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Petersilie“ ()