最近總有很多同學提問Vlookup無法查找的問題,今天就翻出原來編寫自定義函數MLookup,希望對這些同學有用。
Vlookup是最常用到的查找函數,但它有很大的局限性。比如:只能查找第一個符合條件的值,無法任意位置查找和多條件查找等。於是,我用VBA編寫了一個功能強大的Mlookup函數。可以實現:
查找第N個查找最後一個多條件查找一對多查找一對多查找後合併
一、用法介紹
=Mlookup(查找內容,查找區域,返回值所在的列數,第N個)
語法說明:
查找內容:除了單個值外,還可以選取多個單元格,進行多條件查找。查找區域:同VLOOKUP返回值的在列數:同VLOOKUP第N個:值為1就返回第1個符合條件的,值為2就返回第2個符合條件的....當值為0值時,返回最後1個符合條件的值,值為-1時返回所有查找結果並用逗號連接(新增功能)
二、功能演示
【例】如下圖所示的入庫表中,要求完成以下查找。
1、查找第2次電視的進貨數量。
=Mlookup(A11,A2:D8,4,2)
2、查找電視的最後一次入庫數量
=Mlookup(A11,A2:D8,4,0)
3、查找47寸電視的第1次進貨數量。
=Mlookup(A11:B11,A2:D8,4,1)
4、實現篩選功能。
=Mlookup($B$10:$B$11,$A$1:$D$8,4,A14)
5、實現多結果查找功能。(把所有符合條件結果用逗號連接起來)
=MLOOKUP(A11,B$1:C$8,2,-1)
三、使用方法
Mlookup要想在你的表格中也能使用,需要按下面的步驟操作。
1、按alt+F11(鍵盤上如果有FN鍵 ,還需要同時按FN)會打開VBE窗口,在窗口中點插入 - 模塊。把下面的代碼複製粘貼到右側的空白區域中。
代碼(如下)
Function Mlookup(rg, rgs As Range, L As Integer, M As Integer)Dim arr1, ARR2, 列數Dim R, n, K, X, cc, sr As Stringarr1 = rg.ValueARR2 = rgsIf VBA.IsArray(arr1) ThenFor Each R In arr1If R <> "" Thencc = cc & R列數 = 列數 + 1End IfNext RElsecc = arr1End IfIf M > 0 Then '非查找最後一個For X = 1 To UBound(ARR2)sr = ""If 列數 > 1 ThenFor q = 1 To 列數sr = sr & ARR2(X, q)Next qElsesr = ARR2(X, 1)End IfIf sr = cc ThenK = K + 1If K = M ThenMlookup = ARR2(X, L)Exit FunctionEnd IfEnd IfNext XElseIf M = -1 Then '查找所有值For X = 1 To UBound(ARR2)sr = ""If 列數 > 1 ThenFor q = 1 To 列數sr = sr & ARR2(X, q)Next qElsesr = ARR2(X, 1)End IfIf sr = cc ThenMlookup = Mlookup & "," & ARR2(X, L)End IfNext XMlookup = Right(Mlookup, Len(Mlookup) - 1)Exit FunctionElse '查找最後一個For X = UBound(ARR2) To 1 Step -1sr = ""If 列數 > 1 ThenFor q = 1 To 列數sr = sr & ARR2(X, q)Next qElsesr = ARR2(X, 1)End IfIf sr = cc ThenMlookup = ARR2(X, L)Exit FunctionEnd IfNext XEnd IfMlookup = ""End FunctionEnd Function
2、當前文件另存為「啟用宏的工作簿」格式,
然後在這個表格中就可以像一樣使用Mlookup函數了。
註:如果你想在電腦中所有Excel文件中使用,可以保存為加截宏。但...在其他電腦上公式就會出錯。所以想用這個自定義函數,還是複製代碼吧。
Excel解釋說明:VBA就是這麼帥,需要什麼函數就編寫它。學會VBA後,你會發現excel變得無所不能!