ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 5343|回复: 27

[分享] 超越LOOKUP的三个超级函数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-12-15 13:57 | 显示全部楼层 |阅读模式
近期在网上收集的超级函数MLookup、Dlookup和Wlookup,以上三个函数功能均超越Lookup函数第一个函数MLookup介绍

'=Mlookup(查找内容,查找区域,返回值所在的列数,第N个,链接符号[当n=0时有效])
'语法说明:
'查找内容:除了单个值外,还可以选取多个单元格,进行多条件查找。
'查找区域: 同VLOOKUP
'返回值的在列数: 同VLOOKUP
'第N个:值为1就返回第1个符合条件的,值为2就返回第2个符合条件的....当值为-1值时,返回最后1个符合条件的值,值为0时返回所有查找结果并用逗号连接,默认为逗号,可更改!

代码如下:
  1. Function Mlookup(rg, rgs As Range, L As Integer, M As Integer, Optional str As String = ",")
  2.     Dim arr1, ARR2, ls
  3.     Dim R, n, K, X, cc, sr As String
  4.     arr1 = rg.Value
  5.     ARR2 = rgs
  6.     If VBA.IsArray(arr1) Then
  7.         For Each R In arr1
  8.             If R <> "" Then
  9.                 cc = cc & R
  10.                 ls = ls + 1
  11.             End If
  12.         Next R
  13.     Else
  14.         cc = arr1
  15.     End If
  16.     If M > 0 Then '非查找最后一个
  17.         For X = 1 To UBound(ARR2)
  18.             sr = ""
  19.             If ls > 1 Then
  20.                 For q = 1 To ls
  21.                     sr = sr & ARR2(X, q)
  22.                 Next q
  23.             Else
  24.                 sr = ARR2(X, 1)
  25.             End If
  26.             If sr = cc Then
  27.                 K = K + 1
  28.                 If K = M Then
  29.                     Mlookup = ARR2(X, L)
  30.                     Exit Function
  31.                 End If
  32.             End If
  33.         Next X
  34.     ElseIf M = 0 Then '查找所有值
  35.         For X = 1 To UBound(ARR2)
  36.             sr = ""
  37.             If ls > 1 Then
  38.                 For q = 1 To ls
  39.                     sr = sr & ARR2(X, q)
  40.                 Next q
  41.             Else
  42.                 sr = ARR2(X, 1)
  43.             End If
  44.             If sr = cc Then
  45.                 Mlookup = Mlookup & str & ARR2(X, L)
  46.             End If
  47.         Next X
  48.             Mlookup = Right(Mlookup, Len(Mlookup) - 1)
  49.         Exit Function
  50.     Else '查找最后一个
  51.         For X = UBound(ARR2) To 1 Step -1
  52.             sr = ""
  53.             If ls > 1 Then
  54.                 For q = 1 To ls
  55.                     sr = sr & ARR2(X, q)
  56.                 Next q
  57.             Else
  58.                 sr = ARR2(X, 1)
  59.             End If
  60.             
  61.             If sr = cc Then
  62.                 Mlookup = ARR2(X, L)
  63.                 Exit Function
  64.             End If
  65.         Next X
  66.     End If
  67.     Mlookup = ""
  68. End Function
复制代码
'=Dlookup(查找内容,待返回查找内容,查询条件,链接符号[当n=0时有效])
'语法说明:
'查找内容:单元格区域
'待返回查找内容: 单元格区域,与查找内容相同
'将所有查找结果默认逗号连接,可更改其他符号

代码如下:

  1. Function Dlookup(rg As Range, rgs As Range, tj As Range, Optional st As String = ",") As String
  2.     Dim d As Object, arr, brr, cc As String, s As String, i As Integer
  3.     arr = rg.Value
  4.     brr = rgs.Value
  5.     cc = tj
  6.     Set d = CreateObject("scripting.dictionary")
  7.     For i = 1 To UBound(arr)
  8.         If arr(i, 1) = cc Then
  9.         s = cc
  10.             If Not d.Exists(s) Then
  11.                 d(s) = brr(i, 1)
  12.             Else
  13.                 d(s) = d(s) & st & brr(i, 1)
  14.             End If
  15.         End If
  16.     Next
  17.     Dlookup = d(s)
  18.     Set d = Nothing
  19. End Function
复制代码
3、'=Wlookup(查找内容,查找区域,逆向查询拓展列,返回值所在的列数,第N个,模糊状态=0/7)
'语法说明:
'查找内容:除了单个值外,还可以选取多个单元格,进行多条件查找。
'查找区域: 同VLOOKUP
'返回值的在列数: 同VLOOKUP
'第N个:值为1就返回第1个符合条件的,值为2就返回第2个符合条件的....当值为-1值时,返回最后1个符合条件的值,值为0时返回所有查找结果并用逗号连接!

代码如下:
  1. Function Wlookup(rg, rgs As Range, L As Integer, M As Integer, Optional P As Integer = 0)
  2.     Dim arr1, ARR2, arr3, columnn 'columnn是列数
  3.     Dim R, n, K, X, cc, sr As String
  4.     arr1 = rg.Value
  5.     If L > 0 Then ARR2 = rgs
  6.     If L < 0 Then
  7.         arr3 = rgs
  8.         ARR2 = rgs.Offset(0, L).Resize(UBound(arr3), UBound(arr3, 2) - L) 'UBound(arr3, 2)是arr3的列数,rgs需要扩展范围,将左侧L列加入其中,如原来是B2:B3,L是-1,那么扩展后就是A2:B3
  9.     End If
  10.     If VBA.IsArray(arr1) Then
  11.         For Each R In arr1
  12.             If R <> "" Then
  13.                 cc = cc & R '查找值为多个单元格合并
  14.                 columnn = columnn + 1
  15.             End If
  16.         Next R
  17.     Else
  18.         cc = arr1
  19.     End If
  20.     If M > 0 And L > 0 Then '非查找最后一个
  21.         For X = 1 To UBound(ARR2) 'x是数组的行数
  22.             sr = ""
  23.             If columnn > 1 Then
  24.                 For q = 1 To columnn 'q是数组中列的范围
  25.                     sr = sr & ARR2(X, q)
  26.                 Next q
  27.             Else
  28.                 sr = ARR2(X, 1)
  29.             End If
  30.             If P = 0 And sr = cc Then
  31.                 K = K + 1
  32.                 If K = M Then
  33.                     Wlookup = ARR2(X, L)
  34.                     Exit Function
  35.                 End If
  36.             End If
  37.             If P = 1 And sr Like "*" & cc & "*" Then
  38.                 K = K + 1
  39.                 If K = M Then
  40.                     Wlookup = ARR2(X, L)
  41.                     Exit Function
  42.                 End If
  43.             End If
  44.         Next X
  45.     ElseIf M > 0 And L < 0 Then '非查找最后一个
  46.         For X = 1 To UBound(ARR2) 'x是数组的行数
  47.             sr = ""
  48.             If columnn > 1 Then
  49.                 For q = 1 To columnn 'q是数组中列的范围,查找值是合并的,sr就是指查找值
  50.                     sr = sr & ARR2(X, q - L) 'rgs已经拓展,查找列所在的位置发生变化,需要加上L列,因L是负数,使用-L转换为正数
  51.                 Next q
  52.             Else
  53.                 sr = ARR2(X, 1 - L) '查找值所处的位置,从拓展范围后的rgs数组的最左侧算起,
  54.             End If
  55.             If P = 0 And sr = cc Then  '查找值是单个
  56.                 K = K + 1
  57.                 If K = M Then
  58.                     Wlookup = ARR2(X, 1)
  59.                     Exit Function
  60.                 End If
  61.             End If
  62.             If P = 1 And sr Like "*" & cc & "*" Then  '查找值是单个
  63.                 K = K + 1
  64.                 If K = M Then
  65.                     Wlookup = ARR2(X, 1)
  66.                     Exit Function
  67.                 End If
  68.             End If
  69.         Next X
  70.     ElseIf M = 0 And L > 0 Then '查找所有值
  71.         For X = 1 To UBound(ARR2)
  72.             sr = ""
  73.             If columnn > 1 Then
  74.                 For q = 1 To columnn
  75.                     sr = sr & ARR2(X, q)
  76.                 Next q
  77.             Else
  78.                 sr = ARR2(X, 1)
  79.             End If
  80.             If P = 0 And sr = cc Then
  81.                 Wlookup = Wlookup & "," & ARR2(X, L)
  82.             End If
  83.             If P = 1 And sr Like "*" & cc & "*" Then
  84.                 Wlookup = Wlookup & "," & ARR2(X, L)
  85.             End If
  86.         Next X
  87.         Wlookup = Right(Wlookup, Len(Wlookup) - 1)
  88.         Exit Function
  89.     ElseIf M = 0 And L < 0 Then '查找所有值
  90.         For X = 1 To UBound(ARR2)
  91.             sr = ""
  92.             If columnn > 1 Then
  93.                 For q = 1 To columnn
  94.                     sr = sr & ARR2(X, q - L)
  95.                 Next q
  96.             Else
  97.                 sr = ARR2(X, 1 - L)
  98.             End If
  99.             If P = 0 And sr = cc Then
  100.                 Wlookup = Wlookup & "," & ARR2(X, 1)
  101.             End If
  102.             If P = 1 And sr Like "*" & cc & "*" Then
  103.                 Wlookup = Wlookup & "," & ARR2(X, 1)
  104.             End If
  105.         Next X
  106.         Wlookup = Right(Wlookup, Len(Wlookup) - 1)
  107.         Exit Function
  108.     Else '查找最后一个
  109.         If L > 0 And M = -1 Then
  110.             For X = UBound(ARR2) To 1 Step -1
  111.                 sr = ""
  112.                 If columnn > 1 Then
  113.                     For q = 1 To columnn
  114.                         sr = sr & ARR2(X, q)
  115.                     Next q
  116.                 Else
  117.                     sr = ARR2(X, 1)
  118.                 End If
  119.                 If P = 0 And sr = cc Then
  120.                     Wlookup = ARR2(X, L)
  121.                     Exit Function
  122.                 End If
  123.                 If P = 1 And sr Like "*" & cc & "*" Then
  124.                     Wlookup = ARR2(X, L)
  125.                     Exit Function
  126.                 End If
  127.             Next X
  128.         End If
  129.         If L < 0 And M = -1 Then
  130.             For X = UBound(ARR2) To 1 Step -1
  131.                 sr = ""
  132.                 If columnn > 1 Then
  133.                     For q = 1 To columnn
  134.                         sr = sr & ARR2(X, q - L)
  135.                     Next q
  136.                 Else
  137.                     sr = ARR2(X, 1 - L)
  138.                 End If
  139.                 If P = 0 And sr = cc Then
  140.                     Wlookup = ARR2(X, 1)
  141.                     Exit Function
  142.                 End If
  143.                 If P = 1 And sr Like "*" & cc & "*" Then
  144.                     Wlookup = ARR2(X, 1)
  145.                     Exit Function
  146.                 End If
  147.             Next X
  148.         End If
  149.     End If
  150.     Wlookup = ""
  151. End Function
复制代码
以上三个函数功能均强于Lookup
1、大量查询时DLOokup用到字典,速度最快属于速度型,Mlookup和Wlookup速度差了许多!
2、Mlookup属于标准型超功能lookup,支持多条件查询,返回类型较多!
3、Wlookup属于多功能型LOOKUP,看看代码就知道,可以逆向查询和模糊查询!
4、以上函数均在win7上32位office测试过,或许还有瑕疵,欢迎大家回电saype@qq.com



补充内容 (2019-12-19 21:06):
最新的更新在17楼,希望大家直接去17楼下载附件,附件内有模块源码!

补充内容 (2019-12-19 21:07):
最新源码与本楼的源码差距很大!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-19 14:27 | 显示全部楼层
本帖最后由 maozhe 于 2019-12-19 16:11 编辑
WYS67 发表于 2019-12-18 22:28
楼主应该用附件实例加以详细说明。需要此函数的,大多是刚入门的菜鸟,您光说功能强大没用,得用实例证明 ...

17楼附件,已经更新到最新了

TA的精华主题

TA的得分主题

 楼主| 发表于 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
  1. '=Dlookup(查找内容tj,查找区域rg1,待返回数据区域rg2,第M个,默认为0,返回全部,连接字符st,默认为“,”)
  2. '主要用于按条件将内容一对多的合并,dlookup使用了数组和字典功能,为速度型,
  3. '参数M默认为0,返回全部信息,你可以随便指定不为0,当为负数时是倒着查第几个,
  4. '连接符号可以随便更改,不算输入为默认的英文逗号!也可以通过“”取消连接符号!
  5. '支持可以从右向左查询,把rg1和rg2换一下位置就可以了
  6. '使用筛选查询,就是把返回的内容放在不同单元格内分别显示,当条件变化是,单元格内容跟着变化

  7. Function Dlookup(tj As Range, rg1 As Range, rg2 As Range, Optional M As Integer = 0, Optional st As String = ",") As String
  8.     Dim d As Object, arr, brr, crr, ds As String, S As String, i As Integer
  9.     arr = rg1.Value
  10.     brr = rg2.Value
  11.     S = tj.Value
  12.     If M <> 0 Then st = "|||"
  13.     Set d = CreateObject("scripting.dictionary")
  14.     For i = 1 To UBound(arr)
  15.         If arr(i, 1) = S Then
  16.             If Not d.Exists(S) Then
  17.                 d(S) = brr(i, 1)
  18.             Else
  19.                 d(S) = d(S) & st & brr(i, 1)
  20.             End If
  21.         End If
  22.     Next
  23.     ds = d(S) '要是没有M参数,直接写成Dlookup = d(s)结束,结果就是查找所有!
  24.     Set d = Nothing
  25.     '有了参数M才有一下语句,先把字典值分配给变量ds,再由SPLIT函数拆分赋值给变量crr
  26.     crr = Split(ds, st)
  27.     If M = 0 Then '查找所有值
  28.         Dlookup = ds
  29.         Exit Function
  30.     ElseIf M > 0 And M < UBound(crr) + 2 Then '正向查找第几个
  31.         Dlookup = crr(M - 1)
  32.         Exit Function
  33.     ElseIf M < 0 And M > -UBound(crr) - 2 Then  '逆向查找第几个
  34.         Dlookup = crr(UBound(crr) + M + 1)
  35.         Exit Function
  36.     Else '无结果
  37.         Dlookup = ""
  38.     End If
  39. End Function

  40. '=Mlookup(查找内容tj,查找区域rgs,返回值所在的列数L,第M个,连接字符串,默认为“,”)
  41. '1、查找内容:除了单个值外,还可以选取多个单元格,进行多条件查找。
  42. '2、查找区域: 同VLOOKUP
  43. '3、返回值的在列数L: 同VLOOKUP
  44. '4、第M个:值为1就返回第1个符合条件的,值为2就返回第2个符合条件的....当值为-1值时,返回最后1个符合条件的值,值为0时返回所有查找结果并用逗号连接

  45. Function Mlookup(tj As Range, rgs As Range, L As Integer, Optional M As Integer = 0, Optional st As String = ",") As String
  46.     Dim arr1, ARR2, Ls
  47.     Dim r, k, i As Integer, S As String, Sr As String
  48.     arr1 = tj.Value
  49.     ARR2 = rgs.Value
  50.     If VBA.IsArray(arr1) Then
  51.         For Each r In arr1
  52.             If r <> "" Then
  53.                 S = S & r
  54.                 Ls = Ls + 1
  55.             End If
  56.         Next r
  57.     Else
  58.         S = arr1
  59.     End If
  60.     If M > 0 Then '非查找最后一个
  61.         For i = 1 To UBound(ARR2)
  62.             Sr = ""
  63.             If Ls > 1 Then
  64.                 For q = 1 To Ls
  65.                     Sr = Sr & ARR2(i, q)
  66.                 Next q
  67.             Else
  68.                 Sr = ARR2(i, 1)
  69.             End If
  70.             If Sr = S Then
  71.                 k = k + 1
  72.                 If k = M Then
  73.                     Mlookup = ARR2(i, L)
  74.                     Exit Function
  75.                 End If
  76.             End If
  77.         Next i
  78.     ElseIf M = 0 Then '查找所有值
  79.         For i = 1 To UBound(ARR2)
  80.             Sr = ""
  81.             If Ls > 1 Then
  82.                 For q = 1 To Ls
  83.                     Sr = Sr & ARR2(i, q)
  84.                 Next q
  85.             Else
  86.                 Sr = ARR2(i, 1)
  87.             End If
  88.             If Sr = S Then
  89.                 Mlookup = Mlookup & st & ARR2(i, L)
  90.             End If
  91.         Next i
  92.         Mlookup = Right(Mlookup, Len(Mlookup) - Len(st))
  93.         Exit Function
  94.     Else '查找最后一个
  95.         For i = UBound(ARR2) To 1 Step -1
  96.             Sr = ""
  97.             If Ls > 1 Then
  98.                 For q = 1 To Ls
  99.                     Sr = Sr & ARR2(i, q)
  100.                 Next q
  101.             Else
  102.                 Sr = ARR2(i, 1)
  103.             End If
  104.             If Sr = S Then
  105.                 Mlookup = ARR2(i, L)
  106.                 Exit Function
  107.             End If
  108.         Next i
  109.     End If
  110.     Mlookup = ""
  111. End Function


  112. '=Wlookup(查找内容,查找区域,返回值所在的列数L,第M个数值,与原数据排列有关,P是否精确查找,默认为0,模糊查找),
  113. '用法同Mlookup函数

  114. Function Wlookup(rg As Range, rgs As Range, L As Integer, Optional M As Integer = 0, Optional P As Integer = 0)
  115.     Dim arr1, ARR2, arr3, columnn 'columnn是列数
  116.     Dim r, k, X, cc, Sr As String
  117.     arr1 = rg.Value
  118.     If L > 0 Then ARR2 = rgs
  119.     If L < 0 Then
  120.         arr3 = rgs
  121.         ARR2 = rgs.Offset(0, L).Resize(UBound(arr3), UBound(arr3, 2) - L) 'UBound(arr3, 2)是arr3的列数,rgs需要扩展范围,将左侧L列加入其中,如原来是B2:B3,L是-1,那么扩展后就是A2:B3
  122.     End If
  123.     If VBA.IsArray(arr1) Then
  124.         For Each r In arr1
  125.             If r <> "" Then
  126.                 cc = cc & r '查找值为多个单元格合并
  127.                 columnn = columnn + 1
  128.             End If
  129.         Next r
  130.     Else
  131.         cc = arr1
  132.     End If
  133.     If M > 0 And L > 0 Then '非查找最后一个
  134.         For X = 1 To UBound(ARR2) 'x是数组的行数
  135.             Sr = ""
  136.             If columnn > 1 Then
  137.                 For q = 1 To columnn 'q是数组中列的范围
  138.                     Sr = Sr & ARR2(X, q)
  139.                 Next q
  140.             Else
  141.                 Sr = ARR2(X, 1)
  142.             End If
  143.             If P = 0 And Sr = cc Then
  144.                 k = k + 1
  145.                 If k = M Then
  146.                     Wlookup = ARR2(X, L)
  147.                     Exit Function
  148.                 End If
  149.             End If
  150.             If P = 1 And Sr Like "*" & cc & "*" Then
  151.                 k = k + 1
  152.                 If k = M Then
  153.                     Wlookup = ARR2(X, L)
  154.                     Exit Function
  155.                 End If
  156.             End If
  157.         Next X
  158.     ElseIf M > 0 And L < 0 Then '非查找最后一个
  159.         For X = 1 To UBound(ARR2) 'x是数组的行数
  160.             Sr = ""
  161.             If columnn > 1 Then
  162.                 For q = 1 To columnn 'q是数组中列的范围,查找值是合并的,sr就是指查找值
  163.                     Sr = Sr & ARR2(X, q - L) 'rgs已经拓展,查找列所在的位置发生变化,需要加上L列,因L是负数,使用-L转换为正数
  164.                 Next q
  165.             Else
  166.                 Sr = ARR2(X, 1 - L) '查找值所处的位置,从拓展范围后的rgs数组的最左侧算起,
  167.             End If
  168.             If P = 0 And Sr = cc Then  '查找值是单个
  169.                 k = k + 1
  170.                 If k = M Then
  171.                     Wlookup = ARR2(X, 1)
  172.                     Exit Function
  173.                 End If
  174.             End If
  175.             If P = 1 And Sr Like "*" & cc & "*" Then  '查找值是单个
  176.                 k = k + 1
  177.                 If k = M Then
  178.                     Wlookup = ARR2(X, 1)
  179.                     Exit Function
  180.                 End If
  181.             End If
  182.         Next X
  183.     ElseIf M = 0 And L > 0 Then '查找所有值
  184.         For X = 1 To UBound(ARR2)
  185.             Sr = ""
  186.             If columnn > 1 Then
  187.                 For q = 1 To columnn
  188.                     Sr = Sr & ARR2(X, q)
  189.                 Next q
  190.             Else
  191.                 Sr = ARR2(X, 1)
  192.             End If
  193.             If P = 0 And Sr = cc Then
  194.                 Wlookup = Wlookup & "," & ARR2(X, L)
  195.             End If
  196.             If P = 1 And Sr Like "*" & cc & "*" Then
  197.                 Wlookup = Wlookup & "," & ARR2(X, L)
  198.             End If
  199.         Next X
  200.         Wlookup = Right(Wlookup, Len(Wlookup) - 1)
  201.         Exit Function
  202.     ElseIf M = 0 And L < 0 Then '查找所有值
  203.         For X = 1 To UBound(ARR2)
  204.             Sr = ""
  205.             If columnn > 1 Then
  206.                 For q = 1 To columnn
  207.                     Sr = Sr & ARR2(X, q - L)
  208.                 Next q
  209.             Else
  210.                 Sr = ARR2(X, 1 - L)
  211.             End If
  212.             If P = 0 And Sr = cc Then
  213.                 Wlookup = Wlookup & "," & ARR2(X, 1)
  214.             End If
  215.             If P = 1 And Sr Like "*" & cc & "*" Then
  216.                 Wlookup = Wlookup & "," & ARR2(X, 1)
  217.             End If
  218.         Next X
  219.         Wlookup = Right(Wlookup, Len(Wlookup) - 1)
  220.         Exit Function
  221.     Else '查找最后一个
  222.         If L > 0 And M = -1 Then
  223.             For X = UBound(ARR2) To 1 Step -1
  224.                 Sr = ""
  225.                 If columnn > 1 Then
  226.                     For q = 1 To columnn
  227.                         Sr = Sr & ARR2(X, q)
  228.                     Next q
  229.                 Else
  230.                     Sr = ARR2(X, 1)
  231.                 End If
  232.                 If P = 0 And Sr = cc Then
  233.                     Wlookup = ARR2(X, L)
  234.                     Exit Function
  235.                 End If
  236.                 If P = 1 And Sr Like "*" & cc & "*" Then
  237.                     Wlookup = ARR2(X, L)
  238.                     Exit Function
  239.                 End If
  240.             Next X
  241.         End If
  242.         If L < 0 And M = -1 Then
  243.             For X = UBound(ARR2) To 1 Step -1
  244.                 Sr = ""
  245.                 If columnn > 1 Then
  246.                     For q = 1 To columnn
  247.                         Sr = Sr & ARR2(X, q - L)
  248.                     Next q
  249.                 Else
  250.                     Sr = ARR2(X, 1 - L)
  251.                 End If
  252.                 If P = 0 And Sr = cc Then
  253.                     Wlookup = ARR2(X, 1)
  254.                     Exit Function
  255.                 End If
  256.                 If P = 1 And Sr Like "*" & cc & "*" Then
  257.                     Wlookup = ARR2(X, 1)
  258.                     Exit Function
  259.                 End If
  260.             Next X
  261.         End If
  262.     End If
  263.     Wlookup = ""
  264. End Function
复制代码




评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-15 14:50 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-12-15 20:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
看起来挺nb的

TA的精华主题

TA的得分主题

发表于 2019-12-15 21:02 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-12-15 22:31 | 显示全部楼层
功能可能多些,感觉没有Lookup二分法的查询效率高。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-16 16:34 | 显示全部楼层
本帖最后由 maozhe 于 2019-12-17 14:34 编辑

为了大家好记忆,所有的函数参数模式都与lookup看齐,并把待返回的序号默认统一为0,可忽略,特做如下优化:1、Dlookup使用了数组和字典功能,为速度型,参数M默认为0,返回全部信息,你可以随便指定不为0,当为负数时是倒着查,连接符号可以随便更改,不算输入为默认的英文逗号!也可以通过“”取消连接符号!
'=Dlookup(查找内容tj,查找区域rg1,待返回数据区域rg2,第M个,默认为0,全部返回,连接字符串st,默认为“,”)
2、Mlookup属于标准型(Model),本次修改了默认参数M和连接符号,与Dlookup相比多了多条件查询,但查询速度较慢,是Dlookup的7倍左右,当然你也可以用&符号把查询条件连接后再用Dlookup!
3、Wlookup依旧是万能型的,可以倒着查询,当然用Dlookup也能实现,支持多条件查询!
4、以上三个函数,我比较喜欢第一个,因为它速度快,还可以指定任意元素!以上三个函数暂时不在更新,有什么问题请电邮Saype@qq.com,欢迎大家帮我完善!
最新更新到2楼

TA的精华主题

TA的得分主题

发表于 2019-12-16 17:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
maozhe 发表于 2019-12-16 16:34
进一步优化了以上三个函数,见地址
http://club.excelhome.net/thread-1512855-1-1.html
二楼,放错地方

收藏了!慢慢消化。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-17 12:12 | 显示全部楼层
另外Dlookup  支持可以从右向左查询,把rg1和rg2换一下位置就可以了

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-17 12:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Dlookup不仅仅支持从右向左查询,还函数支持筛选查询

筛选查询

筛选查询
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-26 14:24 , Processed in 0.051465 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表