我正在研究一个小的脚本来检查我的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部分中,因为我添加了该部分并且在它起作用之前。当我执行代码时,单词冻结,我不得不强制关闭它。
感谢您的帮助,因为这部分困扰了我很长时间
答案 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
,因为数据库表包含多个项。