Недавняя проблема, которую я заметил при запуске макрокоманд слова (в данном случае, в частности, операций поиска и замены), заключается в том, что они не имеют ожидаемого поведения при активации отслеживания изменений (для меня имеет смысл активировать его, поэтому я могу более легко отслеживать изменения, произошедшие в документе из-за макроса, что облегчает определение его производительности). У меня есть следующий код (это просто пример, чтобы продемонстрировать проблему):
Sub test()
ActiveDocument.TrackRevisions = Not ActiveDocument.TrackRevisions
With Selection.Find
.Text = "(B)([0-9]{6})"
.Replacement.Text = "\1 \2"
.Wrap = wdFindContinue
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
With Selection.Find
.Text = "(organised)( )(under)"
.Replacement.Text = "\1 \3"
.Wrap = wdFindContinue
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Что делает первый selection.find, так это найти числа, подобные этим
B666666
и заменить их
B 666666
что делает второй поиск и замена, так это найти очень специфическую часть текста, где есть двойной пробел, и заменяет ее одним пробелом
organised under
изменено на
organised under
оба эти кода работают. Но если я активирую отслеживание изменений перед запуском кода
ActiveDocument.TrackRevisions = Not ActiveDocument.TrackRevisions
тогда первая часть кода приводит к
"B666666 " 'thus it does nothing except for putting a space in front of the string
и второй код делает следующее
"organisedunder " 'thus it merges the two strings and puts a space in front of them.
Может кто-нибудь объяснить это изменение в поведении и есть ли способ предотвратить это, кроме как не активировать отслеживание изменений?
Решение? :
Sub EvenMoreTesting()
Selection.HomeKey Unit:=wdStory
With Selection
.Find.Text = "Stocks"
Do
Selection.HomeKey Unit:=wdStory
Found = .Find.Execute
If Found Then Selection.Range.HighlightColorIndex = wdYellow
If Found Then Selection.TypeText Text:="Sto"
Loop While Found
End With
End Sub