store. Найти результаты в массиве - PullRequest
0 голосов
/ 31 августа 2018

Как сохранить результаты .find в массиве?

Этот макрос использует подстановочные знаки для поиска каждой строки, которая находится между <sm&gt до <fin&gt

Selection.Find.ClearFormatting
With Selection.Find
    .Text = "<sm&gt?<fin&gt"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchKashida = False
    .MatchDiacritics = False
    .MatchAlefHamza = False
    .MatchControl = False
    .MatchWildcards = True
    .MatchSoundsLike = False
    .MatchAllWordForms = False

End With

и эта часть подсчитывает, сколько <sm&gt существует в тексте, чтобы определить длину массива:

    Dim I As Long
    Dim J As Long
    Dim NumSm As Long
    Dim TargetText As String
    TargetText = "<sm&gt"
    J = 1
    I = 1
    While I > 0
    I = InStr(J, ActiveDocument.Range.Text, TargetText)
    If I > 0 Then
    NumSm = NumSm + 1
    J = I + 1
    End If
    Wend

    Dim SmArr() As Variant
    ReDim SmArr(0 To NumSm)

Я хочу сохранить результаты поиска в массиве: SmArr().

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Попробуйте что-нибудь вроде:

Sub Demo()
Dim i As Long, SmArr()
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "<sm&gt*<fin&gt"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = False
    .MatchWildcards = True
    .Execute
  End With
  Do While .Find.Found
    i = i + 1
    ReDim Preserve SmArr(i)
    SmArr(i) = Split(Split(.Text, "<fin&gt")(0), "<sm&gt")(1)
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
For i = 1 To UBound(SmArr)
  MsgBox SmArr(i)
Next
End Sub
0 голосов
/ 31 августа 2018

Ваш вопрос было немного трудно понять, однако я постараюсь изо всех сил. Вы рассматривали возможность использования коллекции вместо? с коллекцией вам не придется беспокоиться об определении длины массива.

Dim newColl as new collection

Я бы добавил элементы в коллекцию с ключом, чтобы вы все равно могли выбирать данные для чтения, как если бы вы использовали массив.

newColl.add I, NumSm

NumSm - ваш ключ для получения предмета:

newColl.item X

или просто перебрать коллекцию

Dim collObj as object

for each collObj in newColl
'stuff
next collObj
...