某些单词的单词VBA搜索语句

时间:2018-12-22 13:21:50

标签: vba ms-word find wildcard

我正在研究一个小的脚本来检查我的Word文档。检查过程的一部分是检查我是否使用了禁止使用的单词。我在MS Access中建立了一个数据库,然后将该数据库加载到Word中。

不起作用的部分实际上检查是否使用了数据库中的单词之一。我在循环每个句子并执行以下检查:

“ RS”是已加载的数据库表,“选择” =活动语句,“ Cword”是禁止的单词的变量,并在遍历数据库表时被更改

        'Word check
        RS.MoveFirst
        While Not RS.EOF
            Cword = LCase(RS!Woord)
            PCword = LCase(RS!Pre)

            With Selection.Range.Find
            .ClearFormatting
            .MatchWildcards = True
                While .Execute(FindText:=" " & Cword & " ", Forward:=True)
                    If .Found = True Then
                        Oms = RS!Omschrijving
                        ActiveDocument.Comments.Add(Selection.Range, Oms).Author = ComAut
                        VB_count = VB_count + 1
                        RS.MoveLast
                    End If
                Wend
            End With
        Wend

        'number check
        With Selection.Range.Find
            .ClearFormatting
            .MatchWildcards = True
            While .Execute(FindText:=" [0-9] ", Forward:=True)
                If .Found = True Then
                    SingleNumber = Selection.Range
                    Tientallen = SingleNumber Mod 10
                    Hondertallen = SingleNumber Mod 100
                    Duizendtallen = SingleNumber Mod 1000
                    If SingleNumber <= 0 Or Tientallen = 0 And SingleNumber <= 100 Or Hondertallen = 0 And SingleNumber <= 1000 Or Duizendtallen = 0 And SingleNumber <= 12000 Then
                        ActiveDocument.Comments.Add(Selection.Range, "dit getal bij voorkeur voluit schrijven. Uitgezonderd van bijvoorbeeld leeftijden, exacte waarden, maten, temperaturen en percentages").Author = ComAut
                    End If
                End If
            Wend
        End With

我希望它能找到句子中每个禁止的单词,如果找到,请添加带有简短描述的注释。问题是在with find部分中,因为我添加了该部分并且在它起作用之前。当我执行代码时,单词冻结,我不得​​不强制关闭它。

感谢您的帮助,因为这部分困扰了我很长时间

3 个答案:

答案 0 :(得分:1)

问题可能是由于没有删除或更改正在搜索的术语。因此,在每个循环中,被搜索的术语 Selection,因此它不断地寻找相同的事物。词没有冻结,而是处于“无限循环”中。如果您按Ctrl + Break,则宏将最终停止执行,并且您可能会看到数百甚至数千条注释指向文档中的相同位置...

避免这种情况的方法是在下一个循环开始之前将选择移到“找到”项之外,例如按键盘上的右箭头。像这样:

        With Selection.Range.Find
          .ClearFormatting
          .MatchWildcards = True
          .Wrap = wdFindStop  'Prevent Word from starting again at the beginning of the document
            While .Execute(FindText:=" " & Cword & " ", Forward:=True)
                If .Found = True Then 'Not really necessary since the "While" already checks this...
                    Oms = RS!Omschrijving
                    ActiveDocument.Comments.Add(Selection.Range, Oms).Author = ComAut
                    VB_count = VB_count + 1
                    RS.MoveLast
                    Selection.Collapse wdCollapseEnd 'like pressing right-arrow key
                End If
            Wend
        End With

答案 1 :(得分:1)

您无需遍历句子和进行选择,而可以在整个文档上使用“查找/替换”,而无需选择任何内容:

Cword = LCase(RS!Woord)
Oms = RS!Omschrijving
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "<" & Cword & ">"
    .Replacement.Text = ""
    .Forward = True
    .Format = False
    .Wrap = wdFindStop
    .MatchWildcards = True
    .Execute
  End With
  Do While .Find.Found
    .Comments.Add(Range:=.Range, Text:=Oms).Author = ComAut
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
RS.MoveLast

也请注意,通配符查找表达式中的区别;我会找到在制表符,段落分隔符或换行符之后以行开头的字符串,以及随后的任何字符串或标点符号,以及在空格之前/之后的字符串。

答案 2 :(得分:0)

我发现了问题。我忘记添加RS.MoveNext。没有这个,代码将无法在第一个while循环中到达End of Field,因为数据库表包含多个项。