Excel中的模糊匹配查找
我正在为我的财务编写一个电子表格,需要一点帮助。 我有一张交易表,希望能够通过另一张表上的一组规则自动化每个交易分配的帐户。
我的交易例如是这样的: 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
我希望能够在查找表中find这样一组规则: Backblaze 275 Countdown 300 Dropbox 275 Hot 300 Z 387 Pizzahut 300 Graham 184
如果我的交易名称包含查找表中的某些内容,则查找帐号并将其放置在acc_num当前所在的单元格中。
我已经尝试使用像这样的查找function,但无济于事。
=IF(C2="", "", VLOOKUP("*"&C20&"*",'Chart Rules'!$A$2:$C$1001,2,0))
我意识到上述函数在查找值上进行了模糊匹配,而不是查找值中的表。
我将不胜感激在如何做到这一点的任何build议! 干杯
这是一个VBA解决scheme,实现了一个相当弱的模糊查找。 也许它可以在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 & "*"
。 换句话说,如果s
是t
的子串,反之亦然。
如果用于Mac的Excel VBA不知道xlErrNA
,实验表明这只是2042年。如果找不到匹配,您总是可以返回False而不是错误代码。
search的线性意味着它可能不会很好地扩展,但也许它将适用于您的应用程序。