模糊字符串匹配Excel
我目前需要一个模糊字符串匹配算法。我在此处给出的链接中找到一个VBA代码:模糊字符串匹配Excel,excel,vba,fuzzy-search,Excel,Vba,Fuzzy Search,我目前需要一个模糊字符串匹配算法。我在此处给出的链接中找到一个VBA代码: 然而,无论“正确答案”有多远,这都会给你匹配的结果。如果函数与原始字符串相差4个字符或更多,有没有办法实现它的“N/A”?试试看,这是否是您想要的。它松散地基于你那里的一个 编辑:做了更多的测试,发现我的原始版本不太正确。这应该是更好的,但几乎不可能让这样的东西在任何情况下都能起作用 Function FuzzyFind(lookup_value As String, tbl_array As Range) As Str
然而,无论“正确答案”有多远,这都会给你匹配的结果。如果函数与原始字符串相差4个字符或更多,有没有办法实现它的“N/A”?试试看,这是否是您想要的。它松散地基于你那里的一个 编辑:做了更多的测试,发现我的原始版本不太正确。这应该是更好的,但几乎不可能让这样的东西在任何情况下都能起作用
Function FuzzyFind(lookup_value As String, tbl_array As Range) As String
Dim i As Long, cell As Range, Matches As Long, LengthError As Long, _
FuzzyValue As String, FuzzyMatch As Long, L As String, C As String, MultipleReturns As Boolean
For Each cell In tbl_array
Matches = 0
If cell.Value <> "" Then
L = UCase(lookup_value)
C = UCase(cell.Value)
For i = 1 To Len(L)
If InStr(Mid(L, i, Len(L) - i), Mid(C, i, 1)) > 0 Then
Matches = Matches + 1
Else
Matches = Matches - 1
End If
Next i
LengthError = Abs(Len(C) - Len(L))
Matches = Matches - LengthError
If Len(L) - Matches <= 4 And Matches >= FuzzyMatch Then
If Matches = FuzzyMatch Then
MultipleReturns = True
Exit For
End If
FuzzyValue = cell.Value
FuzzyMatch = Matches
End If
End If
Next
If FuzzyValue <> "" Then
If MultipleReturns = True Then
FuzzyFind = "N/A (Multiple Returns)"
Else
FuzzyFind = FuzzyValue
End If
Else
FuzzyFind = "N/A"
End If
End Function
函数FuzzyFind(查找值作为字符串,tbl数组作为范围)作为字符串
暗i的长度,单元格的范围,匹配的长度,长度_
FuzzyValue为字符串,FuzzyMatch为长字符串,L为字符串,C为字符串,MultipleReturns为布尔值
对于tbl_阵列中的每个单元
匹配项=0
如果单元格的.Value为“”,则
L=UCase(查找值)
C=UCase(单元格值)
对于i=1到Len(L)
如果InStr(Mid(L,i,Len(L)-i),Mid(C,i,1))>0,那么
匹配项=匹配项+1
其他的
匹配项=匹配项-1
如果结束
接下来我
长度误差=Abs(长度(C)-长度(L))
匹配项=匹配项-长度错误
如果Len(L)-匹配=FuzzyMatch,则
如果匹配=模糊匹配,则
倍数=真
退出
如果结束
FuzzyValue=单元格值
模糊匹配=匹配
如果结束
如果结束
下一个
如果模糊值为“”,则
如果MultipleReturns=True,则
FuzzyFind=“不适用(多次返回)”
其他的
FuzzyFind=FuzzyValue
如果结束
其他的
FuzzyFind=“不适用”
如果结束
端函数
Function FuzzyFind(lookup_value As String, tbl_array As Range) As String
Dim i As Long, cell As Range, Matches As Long, LengthError As Long, _
FuzzyValue As String, FuzzyMatch As Long, L As String, C As String, MultipleReturns As Boolean
For Each cell In tbl_array
Matches = 0
If cell.Value <> "" Then
L = UCase(lookup_value)
C = UCase(cell.Value)
For i = 1 To Len(L)
If InStr(Mid(L, i, Len(L) - i), Mid(C, i, 1)) > 0 Then
Matches = Matches + 1
Else
Matches = Matches - 1
End If
Next i
LengthError = Abs(Len(C) - Len(L))
Matches = Matches - LengthError
If Len(L) - Matches <= 4 And Matches >= FuzzyMatch Then
If Matches = FuzzyMatch Then
MultipleReturns = True
Exit For
End If
FuzzyValue = cell.Value
FuzzyMatch = Matches
End If
End If
Next
If FuzzyValue <> "" Then
If MultipleReturns = True Then
FuzzyFind = "N/A (Multiple Returns)"
Else
FuzzyFind = FuzzyValue
End If
Else
FuzzyFind = "N/A"
End If
End Function