我有一段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