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
的模糊匹配。换句话说,如果 s
是 t
的子串,反之亦然。
如果 Excel VBA 对于 Mac 不知道 xlErrNA
,实验表明这只是 2042。你总是可以 return例如如果未找到匹配项,则为 False 而不是错误代码。
搜索的线性特性意味着它可能不会很好地扩展,但也许它适合您的应用程序。
我正在为我的财务做一个点差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
的模糊匹配。换句话说,如果 s
是 t
的子串,反之亦然。
如果 Excel VBA 对于 Mac 不知道 xlErrNA
,实验表明这只是 2042。你总是可以 return例如如果未找到匹配项,则为 False 而不是错误代码。
搜索的线性特性意味着它可能不会很好地扩展,但也许它适合您的应用程序。