在Word VBA中找到一个而不是两个都找到

时间:2019-02-03 23:50:31

标签: vba ms-word

我正在寻找数字(使用格式,因此没有Regex),并且以下代码有效:

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,然后在它应该先找到10然后找到11时再返回0。

3 个答案:

答案 0 :(得分:1)

我要更改几件事:

  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

答案 1 :(得分:0)

更新:看起来您可以使用此功能:

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

但对其他答案感兴趣。

答案 2 :(得分:0)

尝试根据以下内容进行尝试:

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

由于您不清楚要如何处理找到的内容,因此我只在其中放置了一个消息框。