Я видел несколько других сообщений StackOverflow, таких как этот: Как использовать / Включить (объект RegExp) Регулярное выражение с использованием VBA (MACRO) в слове при использовании регулярных выражений в Microsoft Word с VBA с использованиемСценарий Microsoft VB Регулярные выражения 5.5 Справочник.
Это помогло мне подготовить следующее, которое я использую в Word для выделения сумм в долларах США:
Sub dollarHighlighter()
Set regExp = New regExp
Dim objMatch As Match
Dim colMatches As MatchCollection
Dim offsetStart As Long
offsetStart = Selection.Start
regExp.Pattern = "\$([\,\d{1,3}]*(?:\.\d{2})?)"
regExp.Global = True
Set colMatches = regExp.Execute(Selection.Text) ' Execute search.
For Each objMatch In colMatches ' Iterate Matches collection.
Set myRange = ActiveDocument.Range(objMatch.FirstIndex + offsetStart,
End:=offsetStart + objMatch.FirstIndex + objMatch.Length)
myRange.FormattedText.HighlightColorIndex = wdYellow
Next
End Sub
Хотя это работает, как ожидается, в спискедолларовые суммы в тексте (по большей части - среди своих недостатков, регулярное выражение намеренно немного ослаблено ), оно не работает, как ожидалось, когда в документе Word присутствуют гиперссылки.
Вв этом случае, по-видимому, происходит смещение смещенных выделенных символов несколько непредсказуемым образом.Я предполагаю, что это связано с тем, что в исходном файле document.xml много нового xml / css.
В конечном счете, мои общие вопросы: могу ли я использовать регулярные выражения для выделения содержимого документа Word, даже если он содержит гиперссылки?Это вопрос смещения или я должен запустить регулярное выражение для сжатого XML, повторно сжать и снова открыть для лучших результатов?Как и при тестировании различных вариантов регулярных выражений в исходном коде, я получаю ожидаемые результаты, но не при форматировании того, что было бы диапазоном Word.
Я также спрашивал это здесь: https://social.msdn.microsoft.com/Forums/en-US/3a95c5e4-9e0c-4da9-970f-e0bf801c3170/macro-for-a-regexp-search-replace?forum=isvvba&prof=required, но понимаюэто был древний пост ...
По вопросу ниже, вот некоторые, возможно, полезные ссылки: пример документа http://www.smithany.com/test.docx шаг 1 http://www.smithany.com/wordusd1.jpg шаг 2 http://www.smithany.com/wordhighlighterrun.jpgи что происходит http://www.smithany.com/whatactuallyhappens.jpg
Временное решение: Как указано ниже, подстановочный знак Word быстро находит, если вы не сложите циклы.попробуйте это:
Sub Macro2()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.highlight = True
With Selection.Find
.Text = "$[0-9,]{1,}"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.highlight = True
With Selection.Find
.Text = "$[0-9,]{1,}.[0-9]{2,3}"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
, который в основном подсвечивает все суммы в долларах.Тем не менее, сложные выражения, такие как сопоставление различных форматов дат, могут стать грязными, но я полагаю, что все это возможно, если выполнять их по одному шагу за раз.