Excel仪表盘开发:基于指定单元格返回多匹配值,VBA能否实现?
用VBA实现多匹配查找,替代仅返回第一个结果的VLOOKUP
完全没问题!用VBA写个自定义函数就能轻松解决VLOOKUP只能返回第一个匹配结果的痛点,刚好适配你做仪表盘的需求。下面是具体的实现步骤和代码:
实现步骤
- 打开VBA编辑器:按下
Alt+F11快捷键,或者通过Excel顶部的「开发工具」选项卡点击「Visual Basic」进入。 - 插入模块:在左侧的项目窗口里,右键点击你的工作簿名称,选择「插入」→「模块」。
- 粘贴自定义函数代码:把下面的代码复制到模块的代码窗口里。
Function LookupNth(lookupVal As Variant, lookupRange As Range, returnCol As Integer, matchNum As Integer) As Variant Dim cell As Range Dim matchCount As Integer ' 初始化匹配计数器 matchCount = 0 ' 遍历查找范围的第一列 For Each cell In lookupRange.Columns(1).Cells ' 匹配到目标值时,计数器+1 If cell.Value = lookupVal Then matchCount = matchCount + 1 ' 当计数器等于指定的匹配序号时,返回对应列的值 If matchCount = matchNum Then LookupNth = lookupRange.Cells(cell.Row - lookupRange.Row + 1, returnCol).Value Exit Function End If End If Next cell ' 如果没有找到指定序号的匹配,返回#N/A LookupNth = CVErr(xlErrNA) End Function
如何使用这个函数
回到Excel工作表,在需要返回结果的单元格里输入类似这样的公式:=LookupNth(A2, 数据源!$A:$C, 3, 2)
参数解释:
A2:你要查找的目标值所在的单元格数据源!$A:$C:存放数据的工作表(这里叫「数据源」)里的查找范围,第一列必须是包含查找值的列3:你想要返回的列在查找范围里的序号(比如范围是A:C,第三列就是C列)2:指定返回第几个匹配的结果(这里是第二个)
实用小提示
- 如果指定的
matchNum超过了实际存在的匹配数量,函数会返回#N/A,你可以根据需求修改代码,比如把最后一行改成LookupNth = ""来返回空字符串 - 记得保存工作簿为「启用宏的工作簿(.xlsm)」格式,否则下次打开时宏会被禁用,自定义函数无法正常工作
内容的提问来源于stack exchange,提问作者Samba
相关产品推荐
相关产品推荐

