【问题标题】:Count replacements made by "Replace All" in VBA计算 VBA 中“全部替换”所做的替换
【发布时间】:2018-10-16 16:35:06
【问题描述】:

我正在开发一个可以解析文档并在需要时修改样式的宏。到目前为止,我的一个子使用FindExecute 和一个循环来遍历具有定义Style 的所有段落。它工作得很好,并且很容易知道修改了多少次。 但是,.Execute Replace:=wdReplaceAll 似乎效率更高,但不会在 VBA 中返回后面的信息,即使它在 Word 中直接使用时显示(使用 Ctrl + H)。

如何绕过这个问题来计算替换的数量?

非常感谢。

【问题讨论】:

    标签: vba ms-word


    【解决方案1】:

    您可以结合使用 Word 的内置查找和替换以及使用正则表达式库(Microsoft VBScript 正则表达式 5.5)进行搜索和替换。

    VBScript 正则表达式不能搜索样式,只能搜索文本,但可以提供找到的匹配数。

    因此,您首先搜索并替换您感兴趣的样式的段落标记(^p + 样式)。您将段落标记替换为修改后的段落标记,例如“###^p”,小心替换为相同的样式。

    然后您使用正则表达式搜索和替换来查找段落标记修饰符并将其替换为空,从而恢复原始文本。正则表达式有一个 .Matches.Count 方法,它将为您提供 ### 的替换次数。

    你可以找到以下帮助的堆栈溢出链接

    How to Use/Enable (RegExp object) Regular Expression using VBA (MACRO) in word

    【讨论】:

    • 谢谢;我会看看这个解决方案。但是,我的宏应该可以在任何地方工作。因此,我希望所有内容都适合一个模块,因为我的用户不应该做很多事情(比如启用正则表达式等)来使用它。到目前为止,我只是提供了一个包含代码的 .txt 文档,这对他们来说很容易复制/粘贴。我喜欢使用临时模式作为标记来计算替换的想法。我可以在 vba 中使用 ReplaceAll 和文本来这样做吗(如果需要,我将单独处理 Style)?
    • 如果他们正在剪切和粘贴代码,那么他们已经在 IDE 中。转到 Tools.References 然后向下滚动到“Microsoft VBScript Regular Expressions 5.5”并确保选中该复选框是一项简单的工作。必要的 dll 是 office 或 windows 安装的一部分。
    • "必要的 dll 是 office 或 windows 安装的一部分。" 哦,这很有趣!我读了你的链接,发现我可以在模块中使用这个RegExp 作为其他对象。我会在我的代码中尝试这个并让你知道。再次感谢您的帮助
    【解决方案2】:

    尝试基于:

    Sub Demo()
    Application.ScreenUpdating = False
    Dim i As Long
    With ActiveDocument.Range
      With .Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Text = InputBox("What is the Text to Find")
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindStop
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        .Execute
      End With
      Do While .Find.Found
        i = i + 1
        .Collapse wdCollapseEnd
        .Find.Execute
      Loop
    End With
    Application.ScreenUpdating = True
    MsgBox i & " instances found."
    End Sub
    

    上面的代码实际上并没有替换任何东西 - 它只是计算找到的实例。

    【讨论】:

    • 实际上,我试图不使用循环,因为它比replaceAll 慢。但也许没有任何修改的计数器可以工作。
    • 可以在没有循环的情况下完成,但不能在不修改文档的情况下完成。基本上,你会得到字符数,用不同长度的 Find & Replace 表达式执行 Find/Replace,从前一个中减去当前获取的字符数,然后将结果除以 Find & Replace 表达式长度的差异以获得所需的计数。如果需要,您可以撤消查找/替换。
    • @macropod 你知道如何在替换文本中包含计数器吗?即如果存在 5 个“name”实例,则将它们替换为 name_1、name_2 等。
    • 是的。这几乎不是火箭科学——发布的代码甚至有计数器。您需要做的只是投入一点点努力......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多