Функция VBA InSTR - Как использовать звездочку (как и любой другой символ) в искомой фразе? - PullRequest
0 голосов
/ 26 ноября 2018

В Excel, когда мы пытаемся найти какую-то фразу, мы можем поставить звездочку * внутри, как любой другой символ.Но как это сделать внутри макроса VBA?Например, ниже;Я хочу найти secName путем поиска значения firName со звездочкой, но id не работает.Я предполагаю, что проблема в том, что VBA думает, что я хочу найти именно «*» как обычный символ вместо чего-либо.

Dim firName, secName As String

firName = "Da*"
secName = "Daniel"

search = InStr(1, secName, firName, vbTextCompare)

MsgBox (search)

Можно ли использовать звездочку «*» так, как я описал?Привет

1 Ответ

0 голосов
/ 27 ноября 2018

Вы можете выполнить FuzzySearch, например: Соответствие одинаковых, но не точных текстовых строк в проектах Excel VBA ,…

… или вы можете использовать Расстояние Левенштейна чтобы выяснить, насколько похожи 2 строки, которые, вероятно, более точны, но требуют O(n*m) времени для расчета.Так что не используйте его для очень длинных строк.

Function Levenshtein(str1 As String, str2 As String) As Long
    Dim arrLev As Variant, intLen1 As Long, intLen2 As Long, i As Long
    Dim j As Long, arrStr1 As Variant, arrStr2 As Variant, intMini As Long

    intLen1 = Len(str1)
    ReDim arrStr1(intLen1 + 1)
    intLen2 = Len(str2)
    ReDim arrStr2(intLen2 + 1)
    ReDim arrLev(intLen1 + 1, intLen2 + 1)

    arrLev(0, 0) = 0
    For i = 1 To intLen1
        arrLev(i, 0) = i
        arrStr1(i) = Mid(str1, i, 1)
    Next i

    For j = 1 To intLen2
        arrLev(0, j) = j
        arrStr2(j) = Mid(str2, j, 1)
    Next j

    For j = 1 To intLen2
        For i = 1 To intLen1
            If arrStr1(i) = arrStr2(j) Then
                arrLev(i, j) = arrLev(i - 1, j - 1)
            Else
                intMini = arrLev(i - 1, j) 'deletion
                If intMini > arrLev(i, j - 1) Then intMini = arrLev(i, j - 1) 'insertion
                If intMini > arrLev(i - 1, j - 1) Then intMini = arrLev(i - 1, j - 1) 'deletion

                arrLev(i, j) = intMini + 1
            End If
        Next i
    Next j

    Levenshtein = arrLev(intLen1, intLen2)
End Function

Чем меньше возвращаемое число, тем больше похожи строки.Например:

Debug.Print Levenshtein("OFFICE CLUB, S.A.", "OFFICE CLUB SA")   'returns 3
Debug.Print Levenshtein("OFFICE CLUB, S.A.", "OFFICE CLUB S.A.") 'returns 1

Вторые строки более похожи на первые.

...