Слово VBA Range.Find всегда начинается с нуля, независимо от значения в Range.start - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь использовать Find, чтобы пройти через все вхождения определенного стиля.Этот фрагмент иллюстрирует проблему.

Public Sub test()
    Dim rng As Range
    Dim found As Boolean

    Set rng = ActiveDocument.Range()
    rng.Find.Style = "prod_code"
    found = rng.Find.Execute()
    rng.Start = rng.End
    rng.End = ActiveDocument.Range().End
    found = rng.Find.Execute()
End Sub

После первого выполнения found - True, rng.start - 152, rng.end - 153, а rng.text - «1».Непосредственно перед вторым выполнением rng.start и rng.end равны 153 и 27219, и значение rng.text отражает это.После того, как найденное второе выполнение выполнено, истина и начало и конец снова равны 152 и 153.

Путем поиска текста и стиля я установил, что второй поиск начинается с нуля, а не до концаи затем перенос (хотя он все еще должен переноситься в пределах диапазона).

Конечное значение принимается как данное.Если я установлю его перед первым соответствием, то Execute вернет False.

Я попытался создать новый диапазон для второго поиска, но он ведет себя так же.

Я пробовал это с MS Office2007 и 2016, и с методами Execute и Execute2007, так что, предположительно, это поведение предназначено, но как мне искать диапазон, который не начинается с нуля?

Я только что понял, что первое появление стиляЯ искал это в клетке стола.Когда я запускаю свой тестовый код в документе без таблиц, он ведет себя так, как я ожидал, то есть второй результат поиска находился в пределах диапазона поиска.Это дает мне новую линию атаки, но фундаментальная проблема остается.Я хочу найти стиль в пределах определенного диапазона документа, независимо от того, включает ли этот диапазон таблицу или часть таблицы.

1 Ответ

0 голосов
/ 19 ноября 2018

Проблема, с которой вы столкнетесь при поиске Find для форматирования в таблицах и если вы не укажете текст, заключается в том, что найденный диапазон может включать маркеры конца ячейки и / или конца строки.В этом случае простого свертывания найденного диапазона перед выполнением следующего «поиска» будет недостаточно.Попробуйте что-нибудь на основе:

Sub Demo()
Application.ScreenUpdating = False
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = ""
    .Replacement.Text = ""
    .Forward = True
    .Format = True
    .Wrap = wdFindStop
    .Style = "prod_code"
    .Execute
  End With
  Do While .Find.Found
    If .Information(wdWithInTable) = True Then
      MsgBox .Text
      If .End = .Cells(1).Range.End - 1 Then
        .End = .Cells(1).Range.End
        .Collapse wdCollapseEnd
        If .Information(wdAtEndOfRowMarker) = True Then
          .End = .End + 1
        End If
      End If
    End If
    If .End = ActiveDocument.Range.End Then Exit Do
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
Application.ScreenUpdating = True
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...