在数组中存储多个选择,稍后再选择数组中的所有选择

时间:2019-02-26 08:24:54

标签: vba ms-word word-vba

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

我正在尝试这种方法,但是对它的了解却很少。我无法得到它。可以帮忙吗。

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

  

不幸的是,Microsoft省略了对“全部查找”的支持。   Word的VBA对象模型。换句话说,无法执行“查找全部”   从宏。

     

您可以遍历VBA中所有出现的搜索文本,但是   这与“查找全部”不同。

原因2:findall与不可能的不连续选择有着密切的联系

  

“查找全部”不在VBA中的原因可能是VBA也从未   有任何方法可以处理不连续的选择(您可以   使用Ctrl和鼠标进行修改),这就是“查找全部”结果。   此处的知识库文章介绍了可以完成的一些操作。每一个   自2002年以来(包括2010年)的版本在此方面未进行任何更改。

原因3:在处理和内存方面,计算量很大。如果由VBA完成

  

我怀疑这种疏忽是故意的并且经过了仔细的考虑。在   打开的文档窗口的视觉环境,“查找全部”是一个完美的选择   明智的概念。但是,在VBA的程序世界中,这有点   处理一组事情变得更加困难,而且通常   计算效率较低。

     

这并不是说它不能在VBA中完成,只是我可以   了解为什么没有完成。对于它的价值,这是真的   与Excel中的Find对象的关系更为紧密,并且   最近,经验。

     

要在VBA中支持“查找全部”,将需要Execute方法返回   Range对象的集合,可以通过计算   在处理和内存方面都很昂贵

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

如果您只想显示比赛内容,则只需要:

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

答案 2 :(得分:0)

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