将引号内的字符串与Word中的引号字符串匹配

时间:2015-05-18 19:58:48

标签: vba replace find wildcard defined

我有一个文档,其中包含已定义术语的索引。每个定义的术语都可以在引号内找到。无论在文档中实际使用该术语,它都不在引号内。如果在文档中使用每个术语,我想更改其格式(使文本浅灰色)。通过这种方式,我可以很容易地看到我的文档中还有哪些单词尚未定义(如果它们已被定义,它们会变得苍白,我不会注意到它们......暗文本突出)例如:

“猫”指猫科动物。 “帽子”意味着头盔。

猫戴着帽子。

一旦运行宏,我会转向此(我使用斜体代替灰色字体,因为我无法弄清楚如何更改字体颜色):

Cat ”表示猫科动物。 “帽子”意味着头盔。

Cat 戴着 Hat

我知道如何在Word中使用通配符来搜索引号中的所有单词,但是如何立即查找和替换所有这些单词用不同的字体躲过我。我一直在使用Find&替换每个定义的术语,使用所有术语时需要数小时才能显示灰色...

1 个答案:

答案 0 :(得分:2)

好吧,现在我对Word中的Find()了解得比以往更多......

这对我来说是光测试,但只会处理单字术语的简单用例,其中没有术语是另一个术语的子串。

Sub Tester()

    Dim col As New Collection
    Dim wd, l
    Dim rng As Range, doc As Document

    Set doc = ThisDocument
    Set rng = doc.Content

    'collect all quoted terms
    With rng.Find
        .MatchWildcards = True
        .MatchCase = False
        .Forward = True
        'matching straight or curly quotes...
        Do While .Execute(FindText:="[""" & Chr(147) & "][a-zA-Z]{1,}[""" & Chr(148) & "]")
            wd = Mid(rng.Text, 2, Len(rng.Text) - 2)
            'skip error if already added
            On Error Resume Next
            col.Add wd, wd
            If Err.Number = 0 Then Debug.Print "Quoted:", wd
            On Error GoTo 0
        Loop
    End With

    'search for each quoted term
    For Each wd In col
        Debug.Print "Searching:", wd

        Set rng = doc.Content
        With rng.Find

            .MatchCase = False
            .MatchWildcards = True
            .MatchWholeWord = True
            .Forward = True

            'the only issue here is that the Find is case-sensitive...
            'which is why we need to check for both the init-cap and lower-case versions
            l = Left(wd, 1)
            wd = "[" & LCase(l) & UCase(l) & "]" & Right(wd, Len(wd) - 1)
            Do While .Execute(FindText:="[!""" & Chr(147) & "]" & wd & "[!""" & Chr(147) & "]")

                Debug.Print "  Found:", wd
                rng.Font.ColorIndex = wdGray25

            Loop
        End With
    Next

End Sub