我有一段VBA代码使用
Find来查找文档中的所有首字母缩略词.它通过搜索包含2个或更多字符的大写字母组成的所有单词来完成此操作…
<[A-Z]{2,}>
这个问题是它没有拿起所有的首字母缩略词,如CoP,W3C,DVD和CD-ROM.它在两个部分中拾取带连字符的首字母缩略词,这些部分不理想但允许由用户检查列表.我也可以选择以“s”或其他字符结尾的单词,而不是使用…来搜索单词的结尾.
<[A-Z]{2,}
但是这不会将任何非大写字符视为它找到的单词的一部分.
是否有表达式允许我在任何位置搜索具有两个或更多大写字母的单词并找到整个单词?
最佳答案 我认为不可能“在任何位置搜索带有两个或更多大写字母的单词并找到整个单词”,除非与宏代码结合使用.既然你正在使用宏,无论如何,这是一种使用以下示例文本对我有用的方法
CoP, this That and AnoTher thing W3C, DVDs and CD-ROM
和这个通配符组合(请注意,我的Windows配置中的列表分隔符是;,对于其他区域a,可能是必需的).
<[A-Z][0-9A-Z\-a-z]{1;10}>
以下函数检查“found”范围中的第二个或任何后面的字母是否大写,并向调用过程返回一个布尔值.它循环遍历给定Range中的字符,检查ASCII值.一旦找到,循环就会退出.
Function ContainsMoreThanOneUpperCase(rng As Word.Range) As Boolean
Dim nrChars As Long, i As Long
Dim char As String
Dim HasUpperCase
HasUpperCase = False
nrChars = rng.Characters.Count
For i = 2 To nrChars
char = rng.Characters(i).text
If Asc(char) >= 65 And Asc(char) <= 90 Then
'It's an uppercase letter
HasUpperCase = True
Exit For
End If
Next
ContainsMoreThanOneUpperCase = HasUpperCase
End Function
使用它的一个例子:
Sub FindAcronyms()
Dim rngFind As Word.Range
Dim bFound As Boolean
Set rngFind = ActiveDocument.content
With rngFind.Find
.text = "<[A-Z][0-9A-Z\-a-z]{1;10}>"
.MatchWildcards = True
.Forward = True
.wrap = wdFindStop
bFound = .Execute
Do While bFound
If bFound And ContainsMoreThanOneUpperCase(rngFind) Then
Debug.Print rngFind.text
rngFind.HighlightColorIndex = wdBrightGreen
End If
rngFind.Collapse wdCollapseEnd
bFound = .Execute
Loop
End With
End Sub