Word VBA Range.Find始终从零开始,而不管Range.start中的谷值如何

时间:2018-11-19 08:04:51

标签: vba ms-word

我正在尝试使用“查找”逐步遍历所有出现的特定样式。该片段说明了问题。

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”。在第二个Execute之前,rng.start和rng.end分别为153和27219,并且rng.text的值反映了这一点。 在找到第二个Execute之后,开始和结束分别为152和153。

通过搜索文本和样式,我已经确定第二次搜索是从零开始,而不是搜索到末尾然后换行(尽管它仍然应该在范围内换行)。

将最终值视为给定值。如果我在第一个比赛之前设置了它,则Execute返回False。

我尝试为第二次搜索创建一个新的范围,但其行为方式相同。

我已尝试使用MS Office 2007和2016以及Execute和Execute2007方法进行此操作,因此,大概是有此行为的,但我应该如何搜索一个不以零开头的范围?

我刚刚意识到,我要找的样式的第一次出现是在表格的单元格中。当我在没有表的文档上运行测试代码时,它的行为符合我的预期,也就是说,第二个搜索结果在要搜索的范围内。这给了我新的攻击路线,但基本问题仍然存在。我想在文档的特定范围内搜索样式,而不管该范围是包含表还是表的一部分。

1 个答案:

答案 0 :(得分:0)

在为表中的格式查找查找时,您会遇到的一个问题是,您未指定文本是所找到的范围可能包含单元格结束标记和/或行末标记。在这种情况下,仅在执行下一个“查找”之前折叠找到的范围是不够的。尝试根据以下方法进行尝试:

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