Сохранить несколько выборок в массиве, а затем выбрать все выборки в массиве - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь найти слово и сохранить выбор в массиве, а затем найти снова и затем сохранить следующий выбор в массиве.И в конце попробуйте выбрать все выборки в массиве.

Я пытаюсь это сделать, но с половинным знанием.Я не могу получить это.Может ли кто-нибудь помочь.

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

Find All в VBA: https://forums.windowssecrets.com/showthread.php/124485-Find-All-in-VBA

Причина 1: в нем говорится о findall

К сожалению, Microsoft не добавила поддержку «Find All» в объектную модель VBA для Word.Другими словами, Find All нельзя выполнить из макроса.

Вы можете циклически просматривать все вхождения текста поиска в VBA, но это не то же самое, что Find All.

Причина 2: findall неразрывно связан с непрерывными выборками, что невозможно

Вероятно, причина, по которой Find All отсутствует в VBA, заключается в том, что VBA также никогда не имел никакого способа работать с непрерывными выборками (вид, который вы можете сделать с помощью Ctrl и мыши), что будет производить Find All.Статья КБ здесь объясняет несколько вещей, которые можно сделать.Каждая версия, начиная с 2002 года (включая 2010 год), не вносила изменений в этой области.

Причина 3: вычислительные затраты, как с точки зрения обработки, так и с точки зрения памяти.если сделано VBA

Я подозреваю, что это упущение было преднамеренным и тщательно продуманным.В визуальном контексте открытого окна документа Find All - совершенно разумная концепция.Однако в процедурном мире VBA труднее работать с множеством вещей, и зачастую вычислительно менее эффективно.

Нельзя сказать, что это невозможно сделать вVBA, только то, что я могу понять, почему это не было сделано.Что бы это ни стоило, то же самое верно и для объекта Find в Excel, с которым у меня гораздо более глубокий и недавний опыт.

Для поддержки Find All в VBA потребуется метод Execute для возврата коллекцииобъектов Range, которые могут быть вычислительно дорогими с точки зрения как обработки, так и памяти

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Если все, что вы хотите сделать, это показать совпадения, вам нужно только:

ActiveDocument.Range.Find.HitHighlight FindText:="PQXY"
0 голосов
/ 26 февраля 2019

Попробуйте с двумя простыми изменениями заменить Selection на Range объект:

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