【问题标题】:Word VBA highlighting textWord VBA 突出显示文本
【发布时间】:2018-10-03 14:28:22
【问题描述】:

我正在 Microsoft Word 中生成一些安全报告 - 导入 SOAP xml 请求和响应...

我想尽可能地自动化这个过程,并且我需要在这些请求/响应中突出显示一些文本。怎么做?一般来说,我需要突出显示请求中的非标准输入(每次都不同 - 错误的数据类型等)和响应中的错误字符串(大多数看起来像这样<faultstring>some error</faultstring>)。

这是我正在尝试的代码:

    Sub BoldBetweenQuotes()
' base for a quotes finding macro
    Dim blnSearchAgain As Boolean
    ' move to start of doc
    Selection.HomeKey Unit:=wdStory
     ' start of loop
    Do
        ' set up find of first of quote pair
        With Selection.Find
            .ClearFormatting
            .Text = "<faultstring>"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindStop
            .Execute
        End With
        If Selection.Find.Found Then
            Selection.MoveRight Unit:=wdCharacter, Count:=1
            ' switch on selection extend mode
            Selection.Extend
            ' find second quote of this pair
            Selection.Find.Text = "</faultstring>"
            Selection.Find.Execute
            If Selection.Find.Found Then
                Selection.MoveLeft Unit:=wdCharacter, Count:=Len(Selection.Find.Text)
                ' make it bold
                Selection.Font.Bold = True
                Selection.Collapse Direction:=wdCollapseEnd
                Selection.MoveRight Unit:=wdCharacter, Count:=1
                blnSearchAgain = True
            Else
                blnSearchAgain = False
            End If
        Else
            blnSearchAgain = False
        End If
    Loop While blnSearchAgain = True
End Sub

它仅突出显示第一个故障字符串,但其他外观保持未格式化我不知道为什么....感谢您的回复。

【问题讨论】:

    标签: vba ms-word highlighting


    【解决方案1】:

    最有效的方法是使用多个Range 对象。将Range 视为一个不可见的选择,重要的区别在于,虽然您的代码中只能有一个Selection 对象,但可以有多个Range 对象。

    我已经修改了您的代码,添加了三个 Range 对象:一个用于整个文档;一个用于查找起始标签;一个用于查找结束标签。 Duplicate 属性用于从另一个“复制”一个 Range(这是由于 Word 中的一个奇怪之处,如果您将 Set 一个 Range 链接到另一个 Range)。

    为清楚起见,我还为您的Ifcomparisons 添加了几个布尔测试值。根据我的经验,直接从Execute 获得“成功”比事后依赖Find.Found 更可靠。

    Sub BoldBetweenQuotes()
        ' base for a quotes finding macro
        Dim blnSearchAgain As Boolean
        Dim blnFindStart As Boolean
        Dim blnFindEnd As Boolean
        Dim rngFind As word.Range
        Dim rngFindStart As word.Range
        Dim rngFindEnd As word.Range
    
        Set rngFind = ActiveDocument.content
        Set rngFindStart = rngFind.Duplicate
        Do
            ' set up find of first of quote pair
            With rngFindStart.Find
                .ClearFormatting
                .Text = "<faultstring>"
                .Replacement.Text = ""
                .Forward = True
                .wrap = wdFindStop
                blnFindStart = .Execute
            End With
            If blnFindStart Then
                rngFindStart.Collapse wdCollapseEnd
                Set rngFindEnd = rngFindStart.Duplicate
                rngFindEnd.Find.Text = "</faultstring>"
                blnFindEnd = rngFindEnd.Find.Execute
                If blnFindEnd Then
                    rngFindStart.End = rngFindEnd.Start
                    ' make it bold
                    rngFindStart.Font.Bold = True
                    rngFindStart.Start = rngFindEnd.End
                    rngFindStart.End = rngFind.End
                    blnSearchAgain = True
                Else
                    blnSearchAgain = False
                End If
            Else
                blnSearchAgain = False
            End If
        Loop While blnSearchAgain = True
    End Sub
    

    【讨论】:

    • 非常感谢您的代码,您描述了一些我不知道的东西,学到了一些新东西... :) 循环中可能有错误吗?每次我启动宏时,即使是我编辑的代码也会不断循环,Word 会冻结一段时间......
    • @MichalJanošec 你可以调试你的代码并通过在你的宏中点击“F8”来检查它在哪里循环,或者只是设置一个断点。
    • @BrunoBieri 谢谢,现在这样做了,它不断循环并在故障字符串标签之间第一次出现文本时加粗......我认为我在出现后移动搜索开始时出错,但我有点迷失在所有那些 findStart.End findEnd.Start 事情中:D
    • @MichalJanošec 在发布之前,我使用多个 标签对对此进行了测试。您应该能够复制/粘贴我的代码并且它应该运行。你有什么改变吗?如果是,为什么?
    • @MichalJanošec 鉴于您可以在评论中提供的信息很少,我很难说清楚。我的建议是打开一个新问题,专注于这个问题。例如,我不知道您所说的“新工作表”或“主工作表”是什么意思。还提供有关“将 xmls 导入为字段”的信息。并包含 AutoOpen 代码(这应该不是问题,但是...)
    猜你喜欢
    • 2013-08-20
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 2015-09-08
    • 2011-07-12
    • 1970-01-01
    • 2019-07-04
    • 2015-07-29
    相关资源
    最近更新 更多