VBA Word 非连续选择所有文本实例

VBA word non-contiguous selection of all text instances

提问人:Gen 提问时间:8/5/2023 最后编辑:Oscar SunGen 更新时间:8/6/2023 访问量:64

问:

该代码旨在搜索当前打开的 Word 文档并选择当前所选文本的所有实例。例如,我选择“Casted”运行宏,无论在出现“Casted”文本的哪个位置,都会同时选择所有实例 [例如单击多个选择的 ctr]

Sub SelectAllText()
    Dim searchText As String
    searchText = Selection.Text

    If searchText <> "" Then
        Dim foundRange As Range
        Set foundRange = ActiveDocument.Range

        With foundRange.Find
            .ClearFormatting
            .Text = searchText
            .Forward = True
            .Wrap = wdFindStop
            .MatchWholeWord = True
            .MatchCase = False
            .Execute

            Do While .found
                foundRange.Select 'what i needed to work
                foundRange.HighlightColorIndex = wdYellow 'This is just to highlight, not what i needed
                .Execute
            Loop
        End With
    End If
End Sub

因此,代码确实会选择文本,但是当选择下一个实例时,前一个实例将被取消选择。因此,归根结底,只有最后一个实例是文档保持选中状态,同时我希望所有内容都保持选中状态。

VBA MS-Word 文本选择

评论

2赞 Timothy Rylatt 8/5/2023
这是不可能的。
1赞 Gen 8/5/2023
我想的太多了,因为到目前为止没有任何效果。无论如何,谢谢
1赞 Red Hare 8/5/2023
您可以尝试使用 .HitHighlight from in Selection.Find,您可以在搜索对话框中找到它,例如德语中的“阅读器突出显示”(从搜索中左侧开始),该按钮被命名为 Lesehervorhebung。
0赞 Oscar Sun 8/5/2023
@RedHare 感谢您提供的信息,使我得到这个答案。我完全不知道这种方法以前可用。

答:

0赞 Oscar Sun 8/5/2023 #1

就像 Red Hare 说的,我尝试了 Find 对象的 HitHighlight 方法,它奏效了。

虽然这种方法不能真正像 Selection 对象或 Select 那样被选中,但它仍然像非连续多选的效果。并且在它运行后,范围(Find 对象的 Parent)不会更改,并且 Highlight 效果只是 Highlight,不会保存在 HighlightColorIndex 属性中,因此它根本不会更改原始文档,即。Document 的 Saved 属性不会更改为 false。此外,它不会改变插入位置。

Sub SelectAllText()
    Dim searchText As String
    searchText = Selection.Text

    If searchText <> "" Then
        Dim foundRange As Range
        Set foundRange = ActiveDocument.Range

        With foundRange.Find
'            .ClearFormatting
'            .Text = searchText
'            .Forward = True
'            .Wrap = wdFindStop
'            .MatchWholeWord = True
'            .MatchCase = False
'            .Execute
            
'            Do While .Found
'                foundRange.Select 'what i needed to work
'                foundRange.HighlightColorIndex = wdYellow 'This is just to highlight, not what i needed
'                .Execute
'            Loop

            .ClearHitHighlight
            .HitHighlight FindText:=searchText, TextColor:=RGB(255, 255, 255), HighlightColor:=RGB(0, 0, 0), MatchCase:=True, MatchWholeWord:=True
            
        End With
    End If
End Sub

这应该是Red Hare提到的框和按钮。非常感谢他!

enter image description here

为什么保持选中状态

我希望所有内容都保持选中状态。

你为什么希望他们被选中?我能猜到的是:

  1. 如果只是为了看起来像,那么 HitHighlight 方法可以实现。

  2. 如果您想为他们做点什么,只需将每个找到的范围存储在一个集合中以供进一步使用。就像我在这里的回答:

https://stackoverflow.com/a/76192899/8249058

https://stackoverflow.com/a/76260672/8249058

...

评论

2赞 Timothy Rylatt 8/6/2023
当然有效,但这与“非连续多选的效果”完全不同。它只是一种将突出显示应用于所有比赛的一步方法,而无需实际选择任何内容。HitHighlight
0赞 Oscar Sun 8/6/2023
我知道@TimothyRylatt.非常感谢。为什么我们希望他们被选中?我能猜到的是: 1.如果只是为了看起来像,那么 HitHighlight 方法可以实现。2. 如果我们想为他们做点什么,只需将每个找到的范围存储在一个集合中以备将来使用。不是吗?