【问题标题】:Store multiple selections in Array and later do select all the selections in the Array将多个选择存储在 Array 中,然后选择 Array 中的所有选择
【发布时间】:2019-02-26 08:24:54
【问题描述】:

我正在尝试查找一个单词并将所选内容保存在数组中,然后再次查找,然后将下一个选项保存在数组中。最后尝试选择数组中的所有选择。

我正在尝试这个,但它只知道一半。我无法得到它。有人可以帮忙吗?

Sub Macro6()
'
' Macro6 Macro
'
'
Selection.HomeKey Unit:=wdStory
Dim selecttest(2) As Selection
For I = 1 To 2
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "PQXY"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
    End With
    Selection.Find.Execute
    Set selecttest(I) = Selection
    Selection.MoveRight Unit:=wdCharacter, Count:=1
Next I
For I = 1 To 2
  selecttest(I).Select
Next I
End Sub

我想将选择保持在循环中并在最后显示它们。

我试过的解决方案:

Sub Macro61()
'
' Macro6 Macro
'
'
Selection.HomeKey Unit:=wdStory
Dim selecttest(2) As Range
For i = 1 To 2
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "PQXY"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
    End With
    Selection.Find.Execute
    Set selecttest(i) = Selection.Range
    Selection.MoveRight Unit:=wdCharacter, Count:=1
Next i

For i = 1 To 2
selecttest(i).Select
Next i
End Sub

上面的问题是 selecttest(2) 只被选中。我想要同时选择 selecttest(1) 和 selecttest(2) 的最终结果

我也试过

Dim totalselect as Range
For i = 1 to 2
set totalselect = totalselect + selectest(i)
Next i

totalselect.select

显示“+”(加号)操作不存在的错误

解决方案:不可能

发现一些关于不连续范围选择的文章 VBA 不可能,而 FindAll 可能

在 VBA 中查找所有内容:https://forums.windowssecrets.com/showthread.php/124485-Find-All-in-VBA

原因 1:它谈到了 findall

不幸的是,微软忽略了在 Word 的 VBA 对象模型。也就是说,Find All 无法执行 来自宏。

您可以遍历 VBA 中所有出现的搜索文本,但是 这与 Find All 不同。

原因 2:findall 与不连续的选择不直接相关,这是不可能的

查找全部不在 VBA 中的原因可能是 VBA 也从来没有 有任何方法来处理不连续的选择(你可以 make 使用 Ctrl 和鼠标),这是 Find All 会产生的。 这里的知识库文章解释了可以做的几件事。每一个 自 2002 年以来的版本(包括 2010 年)在这方面没有任何变化。

原因 3:在处理和内存方面的计算成本很高。如果由 VBA 完成

我怀疑这种遗漏是故意的并经过仔细考虑。在 一个打开的文档窗口的视觉上下文,Find All 是一个完美的 明智的概念。但是,在 VBA 的程序世界中,它有点 更难处理一组事物,而且,通常, 计算效率较低。

这并不是说它不能在 VBA 中完成,只是我可以 明白为什么没有完成。对于它的价值,同样如此 Excel 中的 Find 对象,我对它有更多的了解,以及 最近的,经验。

要在 VBA 中支持 Find All 需要 Execute 方法返回 Range 对象的集合,可以计算 就处理和内存而言,价格昂贵

【问题讨论】:

    标签: vba ms-word


    【解决方案1】:

    尝试通过两个简单的更改将Selection 替换为Range 对象:

    Sub Macro6()
        ...
        ...
        Dim selecttest(2) As Range 'not Selection
        ...
        ...
        Set selecttest(i) = Selection.Range 'not just a Selection
        ...
    End sub
    

    【讨论】:

    • 我试过这个。但我无法一次显示所有选择。
    • @SanthoshYedidi,默认情况下你不能这样做。对象模型不支持这种操作。
    【解决方案2】:

    如果您只想显示匹配项,您只需要:

    ActiveDocument.Range.Find.HitHighlight FindText:="PQXY"
    

    【讨论】:

    • 不,我的目标是通过 VBA 显示。因为我有 6000 多次 PQXY 出现,而​​且它挂了很多次。
    • VBA 无法选择不连续的范围 - 一次只能选择一个范围。您需要更好地解释您想要实现的目标。
    • 在我的情况下,我有 6000 个 PQXY,当我执行 Findin(主文档)时,word 会显示它的发现。由于这需要很多时间,而且我想停止搜索,所以我点击了 esc(退出)按钮。然后它将显示选择了一些 2000 PQXY。所以 word 正在寻找 PQXY 并添加到选择集中,这也应该可以通过 vba 宏实现
    • Findall 在这么大的情况下的主要问题是它没有显示任何进展。有时我们不知道发生了什么
    • 您想要选择所有这些项目的原因是什么。如果我们知道这个原因,我们或许可以提出更好的方法来实现您的目标。
    【解决方案3】:
    Dim oRng As Word.Range
    Set oRng = Selection.Range
    oRng.Find.ClearFormatting
    With oRng.Find
            .ClearFormatting
            .Replacement.ClearFormatting
            .Text = "shhada"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindStop
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchKashida = False
            .MatchDiacritics = False
            .MatchAlefHamza = False
            .MatchControl = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
             While .Execute
                   oRng.Editors.Add wdEditorEveryone
             Wend
             ActiveDocument.SelectAllEditableRanges wdEditorEveryone
             ActiveDocument.DeleteAllEditableRanges wdEditorEveryone
        End With 
    End Sub
    

    【讨论】:

    • codes only 不质疑请补充说明
    • 此代码会将搜索文本限制在当前文档中的所有位置
    猜你喜欢
    • 1970-01-01
    • 2020-11-26
    • 2015-10-05
    • 2020-01-09
    • 2018-11-08
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多