VBA函数InSTR-如何在搜索的短语中使用星号(和其他字符一样)?

时间:2018-11-25 22:49:17

标签: excel vba excel-vba asterisk

在Excel中,当我们尝试查找某些短语时,可以将星号*和其他任何字符放在其中。但是如何在VBA宏中执行此操作?例如下面; 我想通过用星号搜索firName的值来找到secName,但id不起作用。我想问题是VBA认为我想准确地找到“ *”作为普通字符而不是其他任何字符。

const hat = require('b/hat');

是否可以按照我所描述的方式使用星号“ *”? 问候

1 个答案:

答案 0 :(得分:0)

您可以执行类似Matching similar but not exact text strings in Excel VBA projects,...

的FuzzySearch

…或您可以使用The Levenshtein Distance来找出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

第二个字符串比第一个字符串更相似。