Другие респонденты определили причину вашей проблемы, поэтому я не буду повторять это. Тем не менее, ваше требование является общим шаблоном в VBA / Word, а именно найти что-то, а затем сделать что-то в результате поиска (кроме замены). Обычно я заключаю этот шаблон в функцию или подпрограмму в зависимости от того, какое действие необходимо выполнить после того, как будет найден текст поиска.
Если вы не использовали файл scripting.dictionary раньше, чем я использовал бы раннее связывание (как в приведенном ниже коде), так что вы получите доступ к intellisense для методов и свойств. Это означает использование Tools.Reference для добавления библиотеки Microsoft Scripting.Runtime в VBIDE.
Вы увидите, что мы пересчитываем конец документа каждый раз, когда мы проходим через While l oop. Это хорошая практика, потому что мы заранее не знаем, какое влияние окажут действия поиска на длину документа.
DoEvents в while l oop гарантирует, что вы сможете быстро выйти из Я oop, если вещи go не так.
Приведенная ниже функция использует поиск по шаблону Word для поиска адресов электронной почты. Находка является точной, поэтому нет необходимости настраивать концы найденного диапазона, чтобы получить только адрес электронной почты.
Если действие в найденном до l oop было сложным, то я бы разбил это на отдельная функция, передающая найденный диапазон функции как .Duplicate. В этом конкретном случае это также означало бы, что я бы переместил словарь сценариев из локальной переменной в переменную области видимости модуля
Public Function GetEmailAddressesAsString(ByVal ipDoc As Word.Document) As String
Const EmailAddress As String = "<[0-9A-Za-z._]{1,}\@[0-9A-Za-z.\_]{1,}>"
With ipDoc.StoryRanges(wdMainTextStory)
With .Find
.ClearFormatting
.Wrap = wdFindStop
.MatchWildcards = True
.text = EmailAddress
End With
Dim myAddresses As Scripting.Dictionary
Set myAddresses = New Scripting.Dictionary
Do While .Find.Execute
DoEvents
myAddresses.Add myAddresses.Count, .text
.MoveStart Count:=.Characters.Count + 1
.End = ipDoc.StoryRanges(wdMainTextStory).End
Loop
End With
GetEmailAddressesAsString = Join(myAddresses.Items, ",")
End Function