Я не думаю, что можно «искать слова с двумя или более заглавными буквами в любом месте и находить слово целиком», кроме как в сочетании с макросом. Так как вы используете макрос, в любом случае, вот подход, который работал для меня, используя следующий пример текста
CoP, this That and AnoTher thing W3C, DVDs and CD-ROM
и эта комбинация подстановочных знаков (обратите внимание, что разделитель списка в моей конфигурации Windows равен ;
, для других регионов может потребоваться ,
).
<[A-Z][0-9A-Z\-a-z]{1;10}>
Следующая функция проверяет, является ли вторая или любая более поздняя буква в "найденном" диапазоне заглавными, и возвращает логическое значение вызывающей процедуре. Он перебирает символы в заданном 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