Как остановить цикл, когда найден конец документа Word?

У меня есть макрос, который проверяет активный документ слово за словом. Если слово в Активном документе указано в "Библии терминов", то макрос добавляет к Активному документу комментарий с предложением заменить это слово на более подходящее. Пример: Термин = «Он есть», Предложение = «Он». Библия содержит таблицу с 600 терминами, по одному термину в строке. Столбец 1=термин, столбец 2=предложение). Мой код перебирает 600 библейских терминов. Это неэффективно, потому что если документ, который я проверяю, содержит только одно слово, цикл все равно выполняется 600 раз. Как я могу остановить код, когда документ, который я проверяю, достигает своего конца? Или даже не запускайте процесс, если в документе ничего нет.

Dim BibleCounter as Integer
Dim MaxWordsInBible as Integer
MaxWordsToValidate = (ActiveDocument.Words.Count - 1)  'Count words in doc to validate
MaxWordsInBible = Documents(MatrixDocNum).Tables(1).Rows.Count  'Count rows in bible
For BibleCounter = 2 To MaxWordsInBible  'Currently loops 600 times 
   Set findRange = ActiveDocument.range  'Activedocument I'm validating against Bible 
   With findRange.Find
                     .Text = BibleFile.Tables(1).Rows(BibleCounter).Cells(1).range.Text                       
                     .MatchWholeWord = False
                     .Wrap = wdFindStop  'stops find at the end of the document
'Loop to find the suggestion to replace a word in the activedocument with a term in the Bible
                     Do While .Execute(Forward:=True) = True
                        suggestion =  BibleFile.Tables(1).Rows(BibleCounter).Cells(2).range.Text
                        ActiveDocument.Comments.Add findRange, Text:=suggestion
                        findRange.Collapse wdCollapseEnd    'to avoid endless loop
                     Loop   'do while
   End With 'findRange.Find
Next BibleCounter

На это действительно нет простого ответа. Вы можете проверить количество слов в документе и, если оно очень низкое, изменить логику вашего кода и использовать слова в документе для поиска в Библии, хотя вы, похоже, заменяете фразы, а не слова. этот подход вряд ли сработает для вас.

Timothy Rylatt 23.04.2022 19:23

@TimothyRylatt Основываясь на вашем предложении, я возьму количество слов в документе и сравним его с количеством терминов в библейском файле. В зависимости от того, что меньше, я буду основывать код на документе или библейском файле в качестве основы. Спасибо

Dafne 25.04.2022 16:17
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
2
41
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я уверен, что есть несколько решений. Мое решение - использовать inrange (песудокод);

dim searchRange as Range = activeDocument.content
Dim findRange as range = searchRange.duplicate 

findRange.find.execute

Do

     If findRange.find.found andalso findRange.inrange(searchRange) then

           ‘ do processing

       End if

       findrange.collapse (end)
 
       findRange.find.execute
  
While  findrange.find.found
  

Я не думаю, что это то, о чем спрашивает ОП. Насколько я понимаю, ОП хочет, чтобы цикл выполнялся менее 600 раз при обстоятельствах, которые четко не указаны.

Timothy Rylatt 23.04.2022 11:48

ты прав Тимофей. Таким образом, первоначальный вопрос о проверке 600 терминов в документе требует 600 циклов, и это может быть неэффективно, если в документе всего несколько слов. В конце концов, логика по-прежнему такова: «для каждого слова в 1 наборе проверьте, существует ли оно в другом». набор Библии 600 (дано), но документ может состоять из 10 слов или 1000 слов (или что-то еще). Я не уверен, что есть простой ответ

Boeryepes 23.04.2022 11:57

@Boeryepes Это правильно, если в документе 3 слова, ему все равно нужно проверять каждое слово на соответствие 600 терминам в файле Библии.

Dafne 25.04.2022 16:19

вы могли бы рассмотреть переменную логику: если в документе есть несколько слов, то сравните каждое слово с 600 терминами вместо 600 библейских терминов в документе. Например. если в документе 10 слов, сделайте 10x600 вместо 600x10. Во всем этом я предполагаю, что вы уже загрузили в память 600 терминов.

Boeryepes 25.04.2022 18:59
Ответ принят как подходящий

Вы можете немного ускорить процесс, отключив ScreenUpdating. Код также можно несколько улучшить, особенно в отношении того, как вы извлекаете текст таблицы:

Application.ScreenUpdating = False
Dim BibleFile As Document, Tbl As Table
Set BibleFile = "some document"
Set Tbl = BibleFile.Tables(1)
For BibleCounter = 2 To Tbl.Rows.Count  'Currently loops 600 times
  With ActiveDocument.Range  'Activedocument I'm validating against Bible
    With .Find
      .Text = Split(Tbl.Cell(BibleCounter, 1).Range.Text, vbCr)(0)
      .MatchWholeWord = False
      .Forward = True
      .Wrap = wdFindStop  'stops find at the end of the document
      'Loop to find the suggestion to replace a word in the activedocument with a term in the Bible
      .Execute
    End With
    Do While .Find.Found = True
      .Comments.Add Range:=.Duplicate, Text:=Split(Tbl.Cell(BibleCounter, 2).Range.Text, vbCr)(0)
      .Collapse wdCollapseEnd    'to avoid endless loop
      .Find.Execute
    Loop
   End With
Next
Application.ScreenUpdating = True

Циклический обход всей таблицы вряд ли добавит много времени для ненайденных выражений — он обрабатывает все найденные, что, вероятно, займет большую часть времени.

Конечно, если в документе всего несколько слов, вам следует подумать об обратном процессе и использовать этот документ в качестве источника для сверки с вашим файлом Библии.

Application.ScreenUpdating = False и True экономят время. Основываясь на ваших комментариях, я изменю свой код, чтобы использовать документ в качестве источника для проверки библейского файла. Спасибо

Dafne 25.04.2022 16:14

Другие вопросы по теме