Подсчет частичных совпадений в массиве с использованием Application.Find или VBA.Filter - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь Count количество partial matches в 1D-массиве, не прибегая к зацикливанию массива. STerm содержит строку Ключ для поиска. Я попытался использовать следующие функции:

Sterm - это Dictionary, который я зацикливаю и поэтому меняется каждый раз. Элементы словаря, соответствующие этому ключу, являются двумерным массивом различных строковых значений. Я перебираю 1-е измерение, и оно представляет собой одномерный массив значений, в котором может присутствовать Sterm.

Например, если Sterm равно TC, тогда массив может содержать TC, TC 1, TC A ... и т. Д., И функция должна найти и посчитать эти частичные совпадения.

With Application
bCount = .Count(.Find(.Index(oVarDict(Key), i), sTerm, 1))
bCount = .Count(.Find(.Index(oVarDict(Key), i), sTerm & "*", 1))
...

Теперь комбинация Application.Count & Application.Find работает хорошо (так как Count исключает любые значения ошибок), но Application.Find приводит к совпадению EXACT. Я хочу PARTIAL матчей. This looked very promising until it started returning 0 counts for partial matches i.e. it was not able to detect partial matches.

Кроме того, на MSDN или в Интернете нет документации по Application.Find синтаксису.

Затем я попытался использовать VBA.Filter, как известновозврат Partial matches. Но Application.Count не умеет считать textual values. Поэтому я использовал Application.CountA, но это приводит к ошибке несоответствия типов по неизвестной причине.

Также я не знаю, что возвращает VBA.Filter, если не найдено совпадений.

Так что я подумал о том, чтобы сделать VBA.Replace всех частичных совпадений с 1, а затем скормить его Count. Это также приводит к ошибке - Expression not in expected context.

Application.Count(CLng(VBA.Replace(Join(VBA.Filter(Application.Index(oVarDict(Key), i), sterm, True, vbTextCompare), ","), sterm, 1)))

Я пытался использовать Application.Countif, но не уверен, как записать его в VBA.

Application.CountIf(Application.Index(oVarDict(Key), i), sterm & "*")

Но выдает Error 2015.

Мне не хватает некоторого синтаксиса ИЛИ есть ли лучшая функция для поиска и подсчета частичных совпадений без зацикливания?

1 Ответ

2 голосов
/ 16 октября 2019

Вот пример использования Filter, который я выбил, без каких-либо ошибок. Так что это может сводиться к тому, как вы объявляете переменные или аналогичные.

Sub y()

Dim s(1 To 5) As String, v As Variant

s(1) = "Fred"      'includes "Fred"
s(2) = "Fred"      'includes "Fred"
s(3) = "Freddie"   'includes "Fred"
s(4) = "Harry"
s(5) = "Frederick" 'includes "Fred"

'v = Filter(s, "Fred", True) 'returns an array with 4 elements
'MsgBox UBound(v) + 1        'returns 4
'MsgBox Application.Index(Range("A1:A10"), UBound(v) + 1)

v = Filter(s, "Bill", True) 'returns an array with 0 elements (actually treated as -1)
MsgBox UBound(v) + 1        'returns 0

'to avoid error below
If UBound(v) > -1 Then
    MsgBox Application.Index(Range("A1:A10"), UBound(v) + 1)
Else
    MsgBox "Output array is empty"
End If

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...