【问题标题】:Remove highlighting in a specified range移除指定范围内的高亮显示
【发布时间】:2018-03-21 01:36:40
【问题描述】:

我在 Word 文档中突出显示了段落,我必须从中删除每个段落的第 3 到第 5 个字符的突出显示。

通过在 VBA 中的 Set r = ActiveDocument.Range 中搜索突出显示的范围,可以完美地找到文本段。

错误出现在r(Start:=r_start, End:=r_end).HighlightColorIndex = wdNoHighlight 行。

编译错误:参数数量错误或属性分配无效。

如何正确指定r 范围内从第 3 到第 5 个字符的子范围?感谢您的帮助。

Dim r as Range
Dim r_start As Integer
Dim r_end As Integer
r_start = 2
r_end = 5
Set r = ActiveDocument.Range
With r.Find
  .Highlight = True
  Do While .Execute(FindText:="", Forward:=True) = True
    if r.Characters.Count > 7 Then
       r(Start:=r_start, End:=r_end).HighlightColorIndex = wdNoHighlight
    End If
    r.Collapse 0
  Loop
End With

【问题讨论】:

    标签: vba ms-word


    【解决方案1】:

    导致错误消息的问题是只有Range 方法(如Document.Range)需要参数。 Range 对象,因为它不是一个方法,所以不能接受任何参数。为了设置 Range 对象的开始和结束,您需要这些名称的属性。所以:

       r.Start = r.Start + r_start
       r.End = r.Start + r_end
    

    您的代码在测试时遇到了许多其他问题。例如,如果您将开始位置设置为r_start 并将结束位置设置为r_end,则r 的范围将是从第二个到第五个字符整个文档,而不是第二个到范围r 的第五个字符。这就是为什么上面的两行代码与原来的代码不同。

    下一个问题是代码,就目前而言,会进入无限循环,因为搜索总是从“找到”突出显示中开始。出于这个原因,我添加了一个变量来捕获最初 Found 范围的终点,并将其用作要在每个循环中搜索的 Range 的起点。要搜索的 Range 的末尾设置为文档的末尾。

    这是我的示例代码:

    Sub FindRemoveHighlighting()
        Dim r As Range, rDoc As Range
        Dim r_foundEnd As Long
        Dim r_start As Long
        Dim r_end As Long
        r_start = 2
        r_end = 5
        Set rDoc = ActiveDocument.content
        Set r = rDoc.Duplicate
        With r.Find
          .Highlight = True
          .Text = ""
          .Format = True
          .Format = True
          Do While .Execute() = True
            If r.Characters.Count > 7 Then
               rFoundEnd = r.End
               r.Start = r.Start + r_start
               r.End = r.Start + r_end
               r.HighlightColorIndex = wdNoHighlight
            End If
            r.Start = rFoundEnd
            r.End = rDoc.End
          Loop
        End With
    End Sub
    

    【讨论】:

    • 我只是在等你回答这个问题。我试了一下,遇到了整个文档问题。感谢伟大的答案。 +1
    • :-) Ibo 的方法也有效。只是为了展示使用 Word Ranges 的通用性(和令人困惑)可以......
    • 文字是一场噩梦。不久前有人发布了一个问题,关于为什么设置左上角位置然后读回来给出不同的位置,我没有看到给出的答案,但可能与边距或添加的对象如何与现有对象相关.希望我能记住问题是什么。
    • 可能与作为 Shape 对象的图形有关。是的,那是一场噩梦!
    【解决方案2】:

    你快到了,我修改了代码并对其进行了测试,它在我的最终运行良好。它将在文档中找到任何突出显示的范围,并将从字符 2 到字符 5 删除突出显示:

    Sub GetHighlights()
        Dim rng1 As Range
        Dim rng2 As Range
        Dim r_start As Integer
        Dim r_end As Integer
        r_start = 2
        r_end = 5
    
        Set rng1 = ActiveDocument.Range
        With rng1.Find
          .Highlight = True
          Do While .Execute(FindText:="", Forward:=True) = True
            If rng1.Characters.Count > 7 Then
                Set rng2 = ActiveDocument.Range(Start:=rng1.Start + r_start, End:=rng1.Start + r_end)
                rng2.HighlightColorIndex = wdNoHighlight
            End If
            rng1.Collapse 0
          Loop
        End With
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 2017-04-13
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多