Поиск вхождений строки в документе Word — проблема, если строка найдена в таблице

#vba

#vba

Вопрос:

Был бы признателен за помощь в решении этой проблемы. Мне нужно найти все вхождения строки в документе Word. Когда строка найдена, над ней выполняется некоторое сложное редактирование. Иногда редактирование не требуется, и строка остается нетронутой. Когда со всем этим покончено, я продолжаю искать следующее вхождение строки. До конца документа.

Я написал процедуру для этого :

  • Это начинается с определения диапазона (MyRange), который охватывает весь документ.
  • Затем поиск.Выполняется выполнение.
  • Когда вхождение найдено, я выполняю работу по редактированию.
  • Между тем, MyRange был автоматически переопределен, чтобы охватить только найденную область (это хорошо задокументировано в документации VBA WORD> НАЙТИ объект).
  • Затем я переопределяю MyRange, чтобы охватить часть текста от конца предыдущей найденной области до конца текста.
  • Я повторяю это до конца документа.

Эта процедура работает хорошо, ЗА исключением случаев, когда в ТАБЛИЦЕ найдено вхождение строки. Тогда невозможно переопределить Myr, чтобы охватить область от конца предыдущего найденного до конца текста. При переопределении VBA настаивает на включении предыдущей найденной области (фактически всей ТАБЛИЦЫ). Поэтому, когда я повторяю итерацию, она продолжает находить одно и то же событие снова и снова и повторяется вечно.

Далее следует упрощенная версия моей рутины. Он ничего не делает, он просто иллюстрирует проблему. Если вы запустите его в документе, где появляется строка «abc», вы увидите, что он успешно завершается. Но если в вашем документе есть вхождение «abc» в ТАБЛИЦУ, процедура повторяется вечно.

 Sub moreTests()

Dim myRange As Range
Dim lastCharPos As Integer

Set myRange = ActiveDocument.Range
lastCharPos = myRange.End

myRange.Find.ClearFormatting

With myRange.Find
    .Text = "abc"
End With

While myRange.Find.Execute = True
    'An occurrence of "abc" has been found
    MsgBox (myRange.Text)
    MsgBox ("Range starts at : " amp; myRange.Start amp; "; Range ends at : " amp; myRange.End)
    'myRange has been redefined to encompass only the found region (the "abc" string)
    'Perform whatever editing work is needed on the string myRange.Text ("abc")
    'Now redefine myRange to cover the remainder of the document
    myRange.Start = myRange.End
    myRange.End = lastCharPos
    MsgBox ("Range starts at : " amp; myRange.Start amp; "; Range ends at : " amp; myRange.End)
Wend


End Sub 'moreTests
 

У меня есть несколько способов обойти эту проблему. Но ни один из них не является простым, не говоря уже об «элегантном». Кто-нибудь знает, существует ли «стандартный» / «проверенный» способ избежать этой проблемы?

Большое, большое спасибо заранее.

Комментарии:

1. Используя ‘Set MyRange = Document. Диапазон ([Начало], [Конец])’ вы можете легко сбросить диапазон после каждого использования, где Start = [текущий диапазон. End] и End = [Документ. Range.End]

2. Вы можете найти . Метод дублирования объекта Word.Range полезен в этом контексте.

3. Спасибо за предложения. Я не смог заставить работать ни то, ни другое. Проблема в том, что найти. Execute не принимает диапазон, который начинается на полпути через строку таблицы. Он всегда автоматически расширяет диапазон, включив в него всю строку. Итак, моя процедура находит вхождение строки «abc» где-то в ячейке таблицы и, как бы я ни уменьшал диапазон для следующего поиска, Find . Execute всегда включает в себя полную строку, в которой была найдена строка. Одно и то же событие постоянно обнаруживается, рутинные циклы повторяются вечно.