Почему VBA запускает мои строки кода не в порядке? - PullRequest
0 голосов
/ 08 мая 2019

Я написал «простой» код для поиска цитат определенной длины в файле Word (который я в конечном итоге хочу отформатировать с использованием другого подпрограммы). Все части работали нормально по отдельности, но теперь поиск в основном пропускает строки, которые он должен найти в тексте, и, по-видимому, работает строки кода не по порядку.

Я пробовал режим прерывания и наблюдал за значением Selection, и вот где он становится странным: он продолжает находить следующий экземпляр параметров поиска (выбирает в документе и изменяет значение Selection) при запуске каждая строка кода, в том числе в пределах With Selection.Find, до .Execute!

Sub FindQuotesTest()

Dim quotevar As String, loopvar As Boolean

Findquote:
loopvar = False 'Doesn't seem necessary, added to try debugging
Selection.Collapse 'Not sure if this is necessary
Selection.Find.ClearFormatting
With Selection.Find
        .MatchWildcards = True
        .Text = ChrW(8220) & "*" & ChrW(8221) 'Any amount of text between an opening and a closing curly double quotation marks.
        .Forward = True
        .Wrap = wdFindStop 'To avoid a crash when reaching the end of the document
        End With
Selection.Find.Execute

loopvar = Selection.Find.Execute

With Selection
    .MoveStartWhile Cset:=ChrW(8220) 'Removes the opening quotation mark from selection
    .MoveEndWhile Cset:=ChrW(8221), Count:=wdBackward 'Removes the closing quotation mark from selection
End With 'I need this for the further formatting and to count the text string

quotevar = Selection.Range

If Len(quotevar) < 157 Then 'Repeats the search if the quote isn't long enough.
If loopvar = True Then GoTo Findquote 'Prevents infinite loop when reaching the end of the document by relying on wdFindstop
End If

End Sub

В режиме разбиения это должно найти одну строку текста в двойных кавычках за раз, и переходить к следующему, только когда он достигает цикла GoTo, и делать это, пока не достигнет строки с указанной длиной (следует перебрать .Find несколько раз). Когда я снова запускаю макрос, он должен найти следующий экземпляр длинной цитаты (кажется, он находит каждую вторую вместо этого. В моих предыдущих попытках макрос запускался только один раз и не находил следующий экземпляр при повторном запуске, что не происходит с этим кодом).

Причудливое поведение режима перерыва во времени отталкивает меня отсюда, так что я в растерянности. Любая помощь будет принята с благодарностью! Приветствия.

1 Ответ

0 голосов
/ 08 мая 2019

Попробуйте что-нибудь вроде:

Sub Demo()
Application.ScreenUpdating = False
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "“*”"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = False
    .MatchWildcards = True
    .Execute
  End With
  Do While .Find.Found
    If .End - .Start > 159 Then
      With .Duplicate
        .Start = .Start + 1
        .End = .End - 1
        'Process string here
      End With
    End If
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
Application.ScreenUpdating = True
End Sub

Вы найдете такой код намного быстрее, чем ваш собственный. FWIW, открывающие и закрывающие кавычки в «*» соответствуют ASCII 147 и 148 соответственно - нет необходимости в эквивалентах ChrW.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...