2016-07-13 15 views
-2

Ich verwende RegEx mit VBA-Makros, um Übereinstimmungen in einer Word-Datei zu finden, da die Suchfunktion in einigen Fällen nicht ausreicht. Übereinstimmungen sollten markiert werden (funktioniert) und ein Kommentar sollte angebracht werden. Wenn ich jedoch Kommentare (oder Kommentare bereits vorhanden) hinzufüge, wird der Match.FirstIndex für jeden vorherigen Kommentar um eins überschrieben. Kommentare mit demselben Text zählen wie eins.Word VBA mit RegEx und Kommentare

Warum ist das? Wie man es repariert?

Vereinfachtes Beispiel:

Sub Mark_QuestionAndExpressionMarks() 
    Dim Match As Match 
    Dim Matches 
    Dim regEx As New regExp 

    regEx.Pattern = "\?|!" 'regex for questionmark or expressionmark 
    regEx.IgnoreCase = False 
    regEx.Global = True 

    Set Matches = regEx.Execute(ActiveDocument.Content.Text) ' or ActiveDocument.Content.Text 

    For Each Match In Matches 
     Call HighlightAndComment(ActiveDocument.range(Match.FirstIndex, Match.FirstIndex + Len(Match.Value)), "Question or Expressionmark") 
// problem here as Match is realized correctly but the FirstIndex is off 
    Next 
End Sub 

Sub HighlightAndComment(WordOrSentence As Object, comment As String) 
     WordOrSentence.HighlightColorIndex = wdYellow 
     Call ActiveDocument.range.Comments.Add(WordOrSentence, comment) 
End Sub 
+0

Ist es Word oder Excel? Wenn es beides ist, wie ist jeder involviert? – Deduplicator

+0

Nur Word, kein Excel – Nandmp

+0

Also, das Problem ist, dass das Highlight auf den Charakter vor '?' Oder '!' Mit dem 2. und folgenden Übereinstimmungen gesetzt ist, oder? Das ist wirklich seltsam, weil die Übereinstimmung FirstIndex korrekt berechnet wird. –

Antwort

0

nicht tief in regex so habe ich versucht, einen anderen Ansatz, dieses Problem zu lösen. Ich hoffe es hilft.

Sub Mark_QuestionAndExpressionMarks() 

    Dim charsToSearch As String 

    charsToSearch = "?!" 

    Dim doc As Document 
    Set doc = ActiveDocument 

    Dim j As Integer 
    For j = 1 To doc.Range.characters.Count 
     'Check if character is one of the searched ones 
     If (InStr(charsToSearch, doc.Range.characters(j)) > 0) Then 
      Call HighlightAndComment(doc.Range.characters(j), "Question or Expressionmark") 
     End If 
    Next 
End Sub 
Verwandte Themen