单词VBA字符串的Instr()实际起始位置之间的差异

单词VBA字符串的Instr()实际起始位置之间的差异,vba,ms-word,Vba,Ms Word,我正在使用正则表达式查找Word文档中的所有模式匹配,然后对其进行操作 我正在搜索的文件约330页长,包括复制/粘贴的电子邮件。我的问题是,当我使用InStr(startPos,objRange.Text,match.submatches(0))查找每个匹配的起始位置时,结果实际上会偏移一定量。对于处于原始状态的文档,偏移量恰好为324个字符 凭直觉,我决定删除文档中的所有超链接,看看会有什么效果。RemoveHyperlinks子项找到并删除了24个超链接,之后Instr()返回值仅关闭了20

我正在使用正则表达式查找Word文档中的所有模式匹配,然后对其进行操作

我正在搜索的文件约330页长,包括复制/粘贴的电子邮件。我的问题是,当我使用
InStr(startPos,objRange.Text,match.submatches(0))
查找每个匹配的起始位置时,结果实际上会偏移一定量。对于处于原始状态的文档,偏移量恰好为324个字符

凭直觉,我决定删除文档中的所有超链接,看看会有什么效果。RemoveHyperlinks子项找到并删除了24个超链接,之后
Instr()
返回值仅关闭了20个字符(因此减去幻数
matchStart=matchStart-1-20
可以得到正确的起始位置)。显然,我想避开所有的魔法数字,但我不知道最后20个字符是从哪里来的

我尝试取消所有字段的链接,但删除超链接后没有任何字段可以取消链接

有什么想法吗

matchStart = InStr(startPos, objRange.Text, match.submatches(0))
matchEnd = matchStart + Len(match.submatches(0))
Set subRange0 = objDoc.Range(matchStart, matchEnd)
给我
子范围0.Text
不同于
匹配。子匹配(0)
?或者在哪里可以找到其他隐藏字符(要删除)


我最终在这个问题的选定答案中找到了答案的提示:

本质上,
Instr()
不能很好地利用Word的WYSIWYG功能,但是
Find
方法将提供具有适当范围的选择。不需要删除超链接,也不用担心其他神秘的隐藏文本

代码如下所示:

Sub FixHighlightedText()
    Dim objDoc As Document
    Dim objRange As Range
    Dim startPos As Long
    Dim regex As Object
    Dim matches

    Set objDoc = ActiveDocument
    Set objRange = objDoc.Range
    startPos = 1
    Set regex = CreateObject("VBScript.RegExp")

    With regex
        .Pattern = "((\([a-zA-Z]*?[-]?Time:.*?\})[a-zA-Z0-9]{0,3})"
        .Global = True
    End With

    If regex.test(objRange.Text) Then
        Set matches = regex.Execute(objRange.Text)

        Debug.Print "Document has " & matches.Count & " matches"
        Debug.Print "Document range is " & objRange.Start & " to " & objRange.End
        Debug.Print "FirstIndex = " & matches(0).FirstIndex

        For Each match In matches
            Set objRange = objDoc.Range(startPos, objDoc.Content.End)
            With objRange.Find
                .Text = match.submatches(0)
                .MatchWholeWord = True
                .MatchCase = True
                .Wrap = wdFindStop
                .Execute
            End With
            startPos = objRange.End
            Debug.Print "Match starts at " & objRange.Start & " and ends at " & objRange.End
            Debug.Print "   match0 text = " & match.submatches(0)
            Debug.Print "   subrange text = " & objRange.Text
        Next match
    Else
        Debug.Print "No regex matches"
    End If
End Sub
Sub FixHighlightedText()
    Dim objDoc As Document
    Dim objRange As Range
    Dim startPos As Long
    Dim regex As Object
    Dim matches

    Set objDoc = ActiveDocument
    Set objRange = objDoc.Range
    startPos = 1
    Set regex = CreateObject("VBScript.RegExp")

    With regex
        .Pattern = "((\([a-zA-Z]*?[-]?Time:.*?\})[a-zA-Z0-9]{0,3})"
        .Global = True
    End With

    If regex.test(objRange.Text) Then
        Set matches = regex.Execute(objRange.Text)

        Debug.Print "Document has " & matches.Count & " matches"
        Debug.Print "Document range is " & objRange.Start & " to " & objRange.End
        Debug.Print "FirstIndex = " & matches(0).FirstIndex

        For Each match In matches
            Set objRange = objDoc.Range(startPos, objDoc.Content.End)
            With objRange.Find
                .Text = match.submatches(0)
                .MatchWholeWord = True
                .MatchCase = True
                .Wrap = wdFindStop
                .Execute
            End With
            startPos = objRange.End
            Debug.Print "Match starts at " & objRange.Start & " and ends at " & objRange.End
            Debug.Print "   match0 text = " & match.submatches(0)
            Debug.Print "   subrange text = " & objRange.Text
        Next match
    Else
        Debug.Print "No regex matches"
    End If
End Sub