【问题标题】:Word 2010 VBA Replace within a highlighted rangeWord 2010 VBA 在突出显示的范围内替换
【发布时间】:2020-07-06 16:39:44
【问题描述】:

以下代码有效,但它执行整个文档上的所有操作。我想突出显示一段文本,然后当我运行宏时 only 让它在突出显示的文本上工作。我怎么做?谢谢...

Sub DoCodeNumberStyle(numchars As String)

    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "(^13)([0-9]{" + numchars + "}) "
        .Replacement.Text = "\1###\2$$$ "
        .Forward = True
        .Wrap = wdFindAsk
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Style = ActiveDocument.Styles("CodeNumber")
    With Selection.Find
        .Text = "###([0-9]{" + numchars + "})$$$"
        .Replacement.Text = "\1"
        .Forward = True
        .Wrap = wdFindAsk
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Sub CodeNumberStyle()
    DoCodeNumberStyle ("1")
    DoCodeNumberStyle ("2")
End Sub

后记:

我发现的另外一件事:如果您对一个选区进行多个查找,第一个查找会丢失/更改选区,因此其他选区不再受原始选区的限制(并且 wdReplaceAll 将继续文件结尾)。要解决此问题,请将选择捕获到范围中。这是我的方法的最终版本,它现在可以满足我的所有需求,仅限于原始突出显示的选择(即使有 3 个查找和替换),并且在代码方面也已最小化:

Sub AAACodeNumberStyleHighlightedSelection()

    With Selection.Range.Find
        .ClearFormatting
        .Style = ActiveDocument.Styles("Code")
        .Replacement.ClearFormatting
        .Forward = True
        .Wrap = wdFindStop
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False

        ' First line:
        .Text = "1   //"
        .Replacement.Text = "###1$$$   //"
        .MatchWildcards = False
        .Execute Replace:=wdReplaceAll

        ' Rest of lines:
        .Text = "(^13)([0-9]{1,2}) "
        .Replacement.Text = "\1###\2$$$ "
        .MatchWildcards = True
        .Execute Replace:=wdReplaceAll

        ' Now style the line numbers:
        .Text = "###([0-9]{1,2})$$$"
        .Replacement.Text = "\1"
        .Replacement.Style = ActiveDocument.Styles("CodeNumber")
        .MatchWildcards = True
        .Execute Replace:=wdReplaceAll

    End With

End Sub

【问题讨论】:

    标签: vba ms-word


    【解决方案1】:

    将 .Wrap 更改为 wdFindStop,这应该适合您。我认为这可能是一个小的 Word 错误;文档说 Wrap 值

    设置如果搜索开始于文档开头以外的某个点并到达文档结尾(如果 Forward 设置为 False,反之亦然)或搜索文本在指定的选择或范围。

    但它似乎迫使 Find 转到文档的末尾,而不是考虑选择。无论如何,如果您只打算在选择上运行它,则不需要 wdFindAsk。

    【讨论】:

    • 成功了——非常感谢。我在使用 VBA 时一直遇到的一个问题是,您似乎无法只是找出应该为特定字段分配哪些值——我只看到了 wd* 定义的整个列表,这没有帮助。我怎么知道 .Wrap 的选项是什么?非常感谢您的帮助。
    • 您是否在 Word 附带的 VBA 编辑器中编写代码?除了 Intellisense(小下拉菜单)之外,您还可以在突出显示关键字时单击 F1。这将为您的 Word 版本提供 VBA 参考。因此,您可以突出显示 Wrap,单击 F1,获取常量类型的名称(在本例中为 WdFindWrap),然后单击它或搜索它(有时它们是链接的,有时不是)。您需要 WdFindWrap 枚举。这将列出这些值及其含义。在这种情况下,“他们的意思”似乎不正确,但这是最好的起点。
    • 我刚刚发现,如果我右键单击分配的值(例如 wdFindStop)并选择“列出常量”,那么它只会给我适合 Wrap 的值!实际上,当没有赋值时,只要您右键单击“=”符号的右侧,这也可以。
    • @Christina 谢谢。它为我节省了很多时间。当我只需要在特定范围内查找/替换时,我遇到了类似的问题。
    【解决方案2】:

    我也发现,即使在某个范围上开始 FIND 循环,该范围也会由 FIND 重新定义,因此 .execute 上的连续循环超出了原始范围,直到文档末尾。 wdFindStop 仅在文档​​末尾停止,而不是在原始范围的末尾。

    所以,我插入了一个 IF 语句:

    在 .find.found 时执行 ... 如果 .find.parent.InRange(doc.Bookmarks("BODY").Range) = False 然后退出 Do ... 。执行 循环

    【讨论】:

      【解决方案3】:
      Set myRange = Selection.Range
       myRange.Select
          With Selection.Find
              .Text = "Apple"
              .Replacement.Text = "Banana"
              .Forward = True
              .Wrap = wdFindStop
              .Format = False
              .MatchCase = False
              .MatchWholeWord = False
              .MatchAllWordForms = False
              .MatchSoundsLike = False
              '.MatchWildcards = True
          End With
          Selection.Find.Execute Replace:=wdReplaceAll
      
         myRange.Select
              With Selection.Find
              .Text = "red"
              .Replacement.Text = "yellow"
              .Forward = True
              .Wrap = wdFindStop
              .Format = False
              .MatchCase = False
              .MatchWholeWord = False
              .MatchAllWordForms = False
              .MatchSoundsLike = False
              '.MatchWildcards = True
          End With
          Selection.Find.Execute Replace:=wdReplaceAll
      

      【讨论】:

        猜你喜欢
        • 2012-01-26
        • 2011-07-12
        • 2018-10-03
        • 1970-01-01
        • 2020-11-14
        • 2018-08-14
        • 2022-01-10
        • 2019-07-04
        • 1970-01-01
        相关资源
        最近更新 更多