Поиск одного, а не обоих результатов в Word VBA - PullRequest
0 голосов
/ 04 февраля 2019

Я ищу, чтобы найти числа (с форматированием, поэтому нет регулярных выражений) и следующий код работает:

Sub FindSuperscript()

    Application.ScreenUpdating = False

    Dim contentRange As Range
    Set contentRange = ActiveDocument.Content

    contentRange.Find.ClearFormatting

    With contentRange.Find.Font
        .Bold = False
        .Italic = False
        .StrikeThrough = False
        .DoubleStrikeThrough = False
        .Outline = False
        .Shadow = False
        .Hidden = False
        .SmallCaps = False
        .AllCaps = False
        .Superscript = True
        .Subscript = False
    End With

    With contentRange.Find
        .Text = "[0-9]*>"
        .MatchWildcards = True
    End With

    contentRange.Find.Execute
    While contentRange.Find.Found
        contentRange.Find.Execute
    Wend

    Application.ScreenUpdating = True

End Sub

, но он найдет 10, а затем 0, а затем просто найти 10 изатем найдите 11.

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Я бы изменил пару вещей:

  1. Убедитесь, что .Wrap установлен на wdFindStop во время цикла.В противном случае он может зайти в бесконечный цикл (по умолчанию wdFindContinue).
  2. While...Wend долгое время "устарел";предпочтительным является Do While/Until...Loop While/Until, что обеспечивает большую гибкость в настройке.
  3. При успешном выполнении Find объект Range, в котором выполняется поиск, будет переустановлен на найденный элемент.Поэтому необходимо переместить поиск Range за эту точку.Я предпочитаю Range.Collapse wdCollapseEnd переместить начальную точку поиска за пределы ранее найденной Range.(Я не уверен, почему использование Selection.MoveRight действительно работает при поиске Range, так как выбор не должен изменяться после «найдено» ...)

Пример кода:

With contentRange.Find
  .Text = "[0-9]*>"
  .Wrap = wdFindStop
  .MatchWildcards = True
End With

contentRange.Find.Execute
Do While contentRange.Find.Found
  contentRange.Collapse wdCollapseEnd
  contentRange.Find.Execute
Loop
0 голосов
/ 04 февраля 2019

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

Sub Demo()
Application.ScreenUpdating = False
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    With .Font
      .Bold = False
      .Italic = False
      .StrikeThrough = False
      .DoubleStrikeThrough = False
      .Outline = False
      .Shadow = False
      .Hidden = False
      .SmallCaps = False
      .AllCaps = False
      .Superscript = True
    End With
    .Text = "<[0-9]@>"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = True
    .MatchWildcards = True
    .Execute
  End With
  Do While .Find.Found
    MsgBox .Text
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
Application.ScreenUpdating = True
End Sub

Поскольку неясно, что вы хотите сделать с найденным контентом, все, что я положил, - это окно сообщения.

0 голосов
/ 04 февраля 2019

Обновление: похоже, вы можете использовать это:

Selection.MoveRight Unit:=wdCharacter, Count:=Len(contentRange.Text)

Итак:

contentRange.Find.Execute
While contentRange.Find.Found
    Selection.MoveRight Unit:=wdCharacter, Count:=Len(contentRange.Text)
    contentRange.Find.Execute
Wend

Но заинтересованы в других ответах.

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