ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > vlookup精确查找的增强版

vlookup精确查找的增强版

作者:绿色风 分类: 时间:2022-08-18 浏览:143
楼主
罗刚君
vlookup在精确查找某个值时,如果有多个符合条件的对象,那么它仅仅返回其中一个 。
本自定义函数可以轻松突破这个限制,且公式简短。特点如下:
1.可以通过第四参数方便地提取所有符合条件的对象;
2.使look可以从左向右或者从右向左边进行查找;
3.可以返回超出第二参数范围的值。

代码如下:

  1. Function look(查找值 As String, 区域 As Range, 列 As Integer, 索引号 As Integer) As String
  2.     For i = 1 To 区域.Rows.Count
  3.         If 区域(i, 1) = 查找值 Then j = j + 1
  4.         If j = 索引号 Then look = 区域(1).Offset(i - 1, 列 - 1): Exit Function
  5.     Next i
  6. End Function

测试功能:
1.从左向右查找

 
2.超出第二参数也可以查找

 
3.从右向左查找

 

vlookup的精确查找增强版.rar
2楼
yfan17
代码如此简洁,功能如此强大!多谢分享!
3楼
saomai
很好用……

受益匪浅

多谢!
4楼
bengdeng
这样的查找值,最好用Find:

  1. Function look(查找值 As String, 区域 As Range, 列 As Integer, 索引号 As Integer) As String
  2.     Application.Volatile
  3.     On Error Resume Next
  4.     Dim i As Long
  5.     Dim tRan As Range, fRan As Range
  6.     Dim tStr As String
  7.     Set tRan = 区域.Find(查找值)
  8.     If Not tRan Is Nothing Then
  9.         tStr = tRan.Address
  10.         Do
  11.             i = i + 1
  12.             If i = 索引号 Then look = tRan.Offset(0, 列 - 1): Exit Function
  13.             Set tRan = 区域.Find(查找值, tRan)
  14.             '奇怪,为什么用下面这一句不可以?
  15.             'Set tRan = 区域.FindNext(tRan)
  16.         Loop While Not tRan Is Nothing And tRan.Address <> tStr
  17.     End If
  18. End Function

奇怪的是,为什么不能用FindNext?
5楼
罗刚君
find的缺点是顺序乱了
上面的代码中“区域”参数中查找也不对
要限定在第一列查找才行。
区域(1).resize(区域.Rows.Count,1)
6楼
yajun_wang888
TKS,真是一个比一个强。
7楼
yajun_wang888
弱弱的问一下啊,请问上述代码是不是VBA代码?
8楼
syz105729913
下载现成的了,哈哈,谢谢分享
9楼
ljx63426
功能强大!多谢分享!
10楼
LYG1868lyg
强悍那!受教了!
11楼
windowsxpsp
高手啊!高山仰止……
12楼
leejohn
现成的代码,收藏
13楼
lgcmeli
个人觉得没必要写一段代码解决返回多个值的查找。vlookup本身也可以,就是加个辅助列而已。把东西用简单了,而不是搞复杂了。
14楼
lrlxxqxa
3.从右向左查找没看懂,感觉跟1.从左向右查找一样呀。
15楼
eliane_lei
虽然对VBA晕晕,但是先收藏着。谢谢分享
16楼
feishifan
谢谢楼主的分享
17楼
猴子
第3、4句代码能解释一下吗?没看明白       谢谢了
18楼
zxpzxp
版主辛苦了。
19楼
hustclm
学习了,思路不错
20楼
轻似梦
学习学习,感谢分享
21楼
罗刚君
vlookup在精确查找某个值时,如果有多个符合条件的对象,那么它仅仅返回其中一个 。
本自定义函数可以轻松突破这个限制,且公式简短。特点如下:
1.可以通过第四参数方便地提取所有符合条件的对象;
2.使look可以从左向右或者从右向左边进行查找;
3.可以返回超出第二参数范围的值。

代码如下:

  1. Function look(查找值 As String, 区域 As Range, 列 As Integer, 索引号 As Integer) As String
  2.     For i = 1 To 区域.Rows.Count
  3.         If 区域(i, 1) = 查找值 Then j = j + 1
  4.         If j = 索引号 Then look = 区域(1).Offset(i - 1, 列 - 1): Exit Function
  5.     Next i
  6. End Function

测试功能:
1.从左向右查找

 
2.超出第二参数也可以查找

 
3.从右向左查找

 

vlookup的精确查找增强版.rar
22楼
yfan17
代码如此简洁,功能如此强大!多谢分享!
23楼
saomai
很好用……

受益匪浅

多谢!
24楼
bengdeng
这样的查找值,最好用Find:

  1. Function look(查找值 As String, 区域 As Range, 列 As Integer, 索引号 As Integer) As String
  2.     Application.Volatile
  3.     On Error Resume Next
  4.     Dim i As Long
  5.     Dim tRan As Range, fRan As Range
  6.     Dim tStr As String
  7.     Set tRan = 区域.Find(查找值)
  8.     If Not tRan Is Nothing Then
  9.         tStr = tRan.Address
  10.         Do
  11.             i = i + 1
  12.             If i = 索引号 Then look = tRan.Offset(0, 列 - 1): Exit Function
  13.             Set tRan = 区域.Find(查找值, tRan)
  14.             '奇怪,为什么用下面这一句不可以?
  15.             'Set tRan = 区域.FindNext(tRan)
  16.         Loop While Not tRan Is Nothing And tRan.Address <> tStr
  17.     End If
  18. End Function

奇怪的是,为什么不能用FindNext?
25楼
罗刚君
find的缺点是顺序乱了
上面的代码中“区域”参数中查找也不对
要限定在第一列查找才行。
区域(1).resize(区域.Rows.Count,1)
26楼
yajun_wang888
TKS,真是一个比一个强。
27楼
yajun_wang888
弱弱的问一下啊,请问上述代码是不是VBA代码?
28楼
syz105729913
下载现成的了,哈哈,谢谢分享
29楼
ljx63426
功能强大!多谢分享!
30楼
LYG1868lyg
强悍那!受教了!

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap