Excel中的模糊匹配查找

时间:2016-09-11 11:54:41

标签: excel vlookup fuzzy-search excel-vba-mac

我正在为我的财务编写电子表格,需要一些帮助。我有一张交易,希望能够通过另一张纸上的一套规则自动化每笔交易所分配的帐户。

我的交易例如如下所示: 1/04/16 -5.9 TEA'S ME acc_num 1/04/16 -8.5 CAFE 101 acc_num 1/04/16 -4.8 HOT WOK acc_num

我希望能够在查找表中拥有这样的一组规则: Backblaze 275 Countdown 300 Dropbox 275 Hot 300 Z 387 Pizzahut 300 Graham 184

如果我的交易名称包含查询表中的内容,则会查找帐号并将其放在acc_num当前所在的单元格中。

我尝试过使用像这样的vlookup函数,但无济于事。

=IF(C2="", "", VLOOKUP("*"&C20&"*",'Chart Rules'!$A$2:$C$1001,2,0))

我意识到上面的函数对查找值进行了模糊匹配,而不是它正在寻找值的表。

我很感激有关如何做到这一点的任何建议! 干杯

1 个答案:

答案 0 :(得分:0)

这是一个VBA解决方案,它实现了相当弱的模糊查找。也许它可以在Mac上运行,也许不行(当有一位Mac的同事试图运行我的某些程序时,我的情况很复杂):

Function FLOOKUP(pat As String, arr As Variant, ColNum As Long, Optional CaseSensitive = True) As Variant
    'does a linear search of first column of array or range arr until it finds a
    'string which is a fuzzy match for pat, returning the corresponding
    'entry in column ColNum of arr. If no match is found NA is returned

    Dim A As Variant, i As Long, s As String, p As String, pStar As String

    p = IIf(CaseSensitive, pat, UCase(pat))
    pStar = "*" & p & "*"

    If TypeName(arr) = "Range" Then
        A = arr.Value
    Else
        A = arr
    End If

    For i = LBound(A) To UBound(A)
        s = A(i, 1)
        If Not CaseSensitive Then s = UCase(s)
        If p Like "*" & s & "*" Or s Like pStar Then
            FLOOKUP = A(i, ColNum)
            Exit Function
        End If
    Next i

    FLOOKUP = CVErr(xlErrNA)
End Function

在此代码中s被认为是t的模糊匹配,当且仅当s Like "*" & t & "*"t Like "*" & s & "*"时。换句话说,如果st的子字符串,反之亦然。

如果Mac的Excel VBA不了解xlErrNA,那么实验表明这只是2042年。您可以随时返回如果找不到匹配项,则为False而不是错误代码。

搜索的线性特性意味着它可能不会很好地扩展,但也许它适用于您的应用程序。