在Excel中,当我们尝试查找某些短语时,可以将星号*和其他任何字符放在其中。但是如何在VBA宏中执行此操作?例如下面; 我想通过用星号搜索firName的值来找到secName,但id不起作用。我想问题是VBA认为我想准确地找到“ *”作为普通字符而不是其他任何字符。
const hat = require('b/hat');
是否可以按照我所描述的方式使用星号“ *”? 问候
答案 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
第二个字符串比第一个字符串更相似。