模糊字符串匹配Excel

模糊字符串匹配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

我目前需要一个模糊字符串匹配算法。我在此处给出的链接中找到一个VBA代码:


然而,无论“正确答案”有多远,这都会给你匹配的结果。如果函数与原始字符串相差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