|
楼主 |
发表于 2019-12-15 14:02
|
显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
本帖最后由 maozhe 于 2019-12-17 12:46 编辑
DLOokup简记为速度型D,速度快,可以倒着查第几个!,0为返回全部
Mlookup简记为标准型M,功能比Dlookup多了,能具体返回第几个值,0是所有值合并,-1是倒数第一个
Wlookup简记为万能型W,超级功能性的lookup
- '=Dlookup(查找内容tj,查找区域rg1,待返回数据区域rg2,第M个,默认为0,返回全部,连接字符st,默认为“,”)
- '主要用于按条件将内容一对多的合并,dlookup使用了数组和字典功能,为速度型,
- '参数M默认为0,返回全部信息,你可以随便指定不为0,当为负数时是倒着查第几个,
- '连接符号可以随便更改,不算输入为默认的英文逗号!也可以通过“”取消连接符号!
- '支持可以从右向左查询,把rg1和rg2换一下位置就可以了
- '使用筛选查询,就是把返回的内容放在不同单元格内分别显示,当条件变化是,单元格内容跟着变化
- Function Dlookup(tj As Range, rg1 As Range, rg2 As Range, Optional M As Integer = 0, Optional st As String = ",") As String
- Dim d As Object, arr, brr, crr, ds As String, S As String, i As Integer
- arr = rg1.Value
- brr = rg2.Value
- S = tj.Value
- If M <> 0 Then st = "|||"
- Set d = CreateObject("scripting.dictionary")
- For i = 1 To UBound(arr)
- If arr(i, 1) = S Then
- If Not d.Exists(S) Then
- d(S) = brr(i, 1)
- Else
- d(S) = d(S) & st & brr(i, 1)
- End If
- End If
- Next
- ds = d(S) '要是没有M参数,直接写成Dlookup = d(s)结束,结果就是查找所有!
- Set d = Nothing
- '有了参数M才有一下语句,先把字典值分配给变量ds,再由SPLIT函数拆分赋值给变量crr
- crr = Split(ds, st)
- If M = 0 Then '查找所有值
- Dlookup = ds
- Exit Function
- ElseIf M > 0 And M < UBound(crr) + 2 Then '正向查找第几个
- Dlookup = crr(M - 1)
- Exit Function
- ElseIf M < 0 And M > -UBound(crr) - 2 Then '逆向查找第几个
- Dlookup = crr(UBound(crr) + M + 1)
- Exit Function
- Else '无结果
- Dlookup = ""
- End If
- End Function
- '=Mlookup(查找内容tj,查找区域rgs,返回值所在的列数L,第M个,连接字符串,默认为“,”)
- '1、查找内容:除了单个值外,还可以选取多个单元格,进行多条件查找。
- '2、查找区域: 同VLOOKUP
- '3、返回值的在列数L: 同VLOOKUP
- '4、第M个:值为1就返回第1个符合条件的,值为2就返回第2个符合条件的....当值为-1值时,返回最后1个符合条件的值,值为0时返回所有查找结果并用逗号连接
- Function Mlookup(tj As Range, rgs As Range, L As Integer, Optional M As Integer = 0, Optional st As String = ",") As String
- Dim arr1, ARR2, Ls
- Dim r, k, i As Integer, S As String, Sr As String
- arr1 = tj.Value
- ARR2 = rgs.Value
- If VBA.IsArray(arr1) Then
- For Each r In arr1
- If r <> "" Then
- S = S & r
- Ls = Ls + 1
- End If
- Next r
- Else
- S = arr1
- End If
- If M > 0 Then '非查找最后一个
- For i = 1 To UBound(ARR2)
- Sr = ""
- If Ls > 1 Then
- For q = 1 To Ls
- Sr = Sr & ARR2(i, q)
- Next q
- Else
- Sr = ARR2(i, 1)
- End If
- If Sr = S Then
- k = k + 1
- If k = M Then
- Mlookup = ARR2(i, L)
- Exit Function
- End If
- End If
- Next i
- ElseIf M = 0 Then '查找所有值
- For i = 1 To UBound(ARR2)
- Sr = ""
- If Ls > 1 Then
- For q = 1 To Ls
- Sr = Sr & ARR2(i, q)
- Next q
- Else
- Sr = ARR2(i, 1)
- End If
- If Sr = S Then
- Mlookup = Mlookup & st & ARR2(i, L)
- End If
- Next i
- Mlookup = Right(Mlookup, Len(Mlookup) - Len(st))
- Exit Function
- Else '查找最后一个
- For i = UBound(ARR2) To 1 Step -1
- Sr = ""
- If Ls > 1 Then
- For q = 1 To Ls
- Sr = Sr & ARR2(i, q)
- Next q
- Else
- Sr = ARR2(i, 1)
- End If
- If Sr = S Then
- Mlookup = ARR2(i, L)
- Exit Function
- End If
- Next i
- End If
- Mlookup = ""
- End Function
- '=Wlookup(查找内容,查找区域,返回值所在的列数L,第M个数值,与原数据排列有关,P是否精确查找,默认为0,模糊查找),
- '用法同Mlookup函数
- Function Wlookup(rg As Range, rgs As Range, L As Integer, Optional M As Integer = 0, Optional P As Integer = 0)
- Dim arr1, ARR2, arr3, columnn 'columnn是列数
- Dim r, k, X, cc, Sr As String
- arr1 = rg.Value
- If L > 0 Then ARR2 = rgs
- If L < 0 Then
- arr3 = rgs
- ARR2 = rgs.Offset(0, L).Resize(UBound(arr3), UBound(arr3, 2) - L) 'UBound(arr3, 2)是arr3的列数,rgs需要扩展范围,将左侧L列加入其中,如原来是B2:B3,L是-1,那么扩展后就是A2:B3
- End If
- If VBA.IsArray(arr1) Then
- For Each r In arr1
- If r <> "" Then
- cc = cc & r '查找值为多个单元格合并
- columnn = columnn + 1
- End If
- Next r
- Else
- cc = arr1
- End If
- If M > 0 And L > 0 Then '非查找最后一个
- For X = 1 To UBound(ARR2) 'x是数组的行数
- Sr = ""
- If columnn > 1 Then
- For q = 1 To columnn 'q是数组中列的范围
- Sr = Sr & ARR2(X, q)
- Next q
- Else
- Sr = ARR2(X, 1)
- End If
- If P = 0 And Sr = cc Then
- k = k + 1
- If k = M Then
- Wlookup = ARR2(X, L)
- Exit Function
- End If
- End If
- If P = 1 And Sr Like "*" & cc & "*" Then
- k = k + 1
- If k = M Then
- Wlookup = ARR2(X, L)
- Exit Function
- End If
- End If
- Next X
- ElseIf M > 0 And L < 0 Then '非查找最后一个
- For X = 1 To UBound(ARR2) 'x是数组的行数
- Sr = ""
- If columnn > 1 Then
- For q = 1 To columnn 'q是数组中列的范围,查找值是合并的,sr就是指查找值
- Sr = Sr & ARR2(X, q - L) 'rgs已经拓展,查找列所在的位置发生变化,需要加上L列,因L是负数,使用-L转换为正数
- Next q
- Else
- Sr = ARR2(X, 1 - L) '查找值所处的位置,从拓展范围后的rgs数组的最左侧算起,
- End If
- If P = 0 And Sr = cc Then '查找值是单个
- k = k + 1
- If k = M Then
- Wlookup = ARR2(X, 1)
- Exit Function
- End If
- End If
- If P = 1 And Sr Like "*" & cc & "*" Then '查找值是单个
- k = k + 1
- If k = M Then
- Wlookup = ARR2(X, 1)
- Exit Function
- End If
- End If
- Next X
- ElseIf M = 0 And L > 0 Then '查找所有值
- For X = 1 To UBound(ARR2)
- Sr = ""
- If columnn > 1 Then
- For q = 1 To columnn
- Sr = Sr & ARR2(X, q)
- Next q
- Else
- Sr = ARR2(X, 1)
- End If
- If P = 0 And Sr = cc Then
- Wlookup = Wlookup & "," & ARR2(X, L)
- End If
- If P = 1 And Sr Like "*" & cc & "*" Then
- Wlookup = Wlookup & "," & ARR2(X, L)
- End If
- Next X
- Wlookup = Right(Wlookup, Len(Wlookup) - 1)
- Exit Function
- ElseIf M = 0 And L < 0 Then '查找所有值
- For X = 1 To UBound(ARR2)
- Sr = ""
- If columnn > 1 Then
- For q = 1 To columnn
- Sr = Sr & ARR2(X, q - L)
- Next q
- Else
- Sr = ARR2(X, 1 - L)
- End If
- If P = 0 And Sr = cc Then
- Wlookup = Wlookup & "," & ARR2(X, 1)
- End If
- If P = 1 And Sr Like "*" & cc & "*" Then
- Wlookup = Wlookup & "," & ARR2(X, 1)
- End If
- Next X
- Wlookup = Right(Wlookup, Len(Wlookup) - 1)
- Exit Function
- Else '查找最后一个
- If L > 0 And M = -1 Then
- For X = UBound(ARR2) To 1 Step -1
- Sr = ""
- If columnn > 1 Then
- For q = 1 To columnn
- Sr = Sr & ARR2(X, q)
- Next q
- Else
- Sr = ARR2(X, 1)
- End If
- If P = 0 And Sr = cc Then
- Wlookup = ARR2(X, L)
- Exit Function
- End If
- If P = 1 And Sr Like "*" & cc & "*" Then
- Wlookup = ARR2(X, L)
- Exit Function
- End If
- Next X
- End If
- If L < 0 And M = -1 Then
- For X = UBound(ARR2) To 1 Step -1
- Sr = ""
- If columnn > 1 Then
- For q = 1 To columnn
- Sr = Sr & ARR2(X, q - L)
- Next q
- Else
- Sr = ARR2(X, 1 - L)
- End If
- If P = 0 And Sr = cc Then
- Wlookup = ARR2(X, 1)
- Exit Function
- End If
- If P = 1 And Sr Like "*" & cc & "*" Then
- Wlookup = ARR2(X, 1)
- Exit Function
- End If
- Next X
- End If
- End If
- Wlookup = ""
- End Function
复制代码
|
评分
-
1
查看全部评分
-
|