Excel 中的模糊匹配查找

Fuzzy matching lookup in Excel

我正在为我的财务做一个点差sheet,需要一点帮助。我有一笔 sheet 笔交易,我希望能够通过另一笔 sheet.

上的一组规则将每笔交易分配到的账户自动化

例如,我的交易如下所示: 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

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

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

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

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

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

对于如何执行此操作的任何建议,我将不胜感激! 干杯

这是一个 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 Like "*" & t & "*"t Like "*" & s & "*" 时,s 才被视为 t 的模糊匹配。换句话说,如果 st 的子串,反之亦然。

如果 Excel VBA 对于 Mac 不知道 xlErrNA,实验表明这只是 2042。你总是可以 return例如如果未找到匹配项,则为 False 而不是错误代码。

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