函数你知道VLOOKUP,一定没听说过MLOOUP,轻松实现一对多查找!

B站影视 日本电影 2025-10-27 21:11 1

摘要:日常工作中,我们经常需要通过一些条件去查找数据,比如通过编号去查询产品,通过身份证号去查找人。

关注我,每天分享高效办公技巧及免费自动化模版,从此告别加班

01

前言

日常工作中,我们经常需要通过一些条件去查找数据,比如通过编号去查询产品,通过身份证号去查找人。

VLOOKUP无疑是我们用得最多的一个函数,会不会VLOOUP经常被面试官定为熟不熟悉EXCEL的判断标准。

但有时候,我们想要查找和返回的数据结果可能不止一个,我想返回所要符合条件的结果,但VLOOKUP只能找到第一个,后面的就无法返回了

这是个让很多小伙伴很头疼的问题,如何实现下图这样,一对多查找并返回所有找到的结果?

今天我们介绍两个方法,建议你点赞收藏教程,转发给需要的小伙伴,避免以后遇到这个问题找不到教程哦

02

公式法:FILTER+TEXTJOIN

如果你用的是EXCEL2019和WPS2019以后的版本,这可以用这两个函数嵌套实现。

早期的旧版本,没有这两个新函数,我们需要参考第二个方法MLOOKUP

作用:根据指定条件筛选区域,并返回符合条件的结果(动态数组,支持溢出显示)。

语法

=FILTER(要返回的结果区域, 查找筛选条件, 如果找不到返回什么)

结果的效果,类似于我们手动筛选的结果。比如我们要找名为“刘艳冬”的同学所有报修课堂。

和我们手动筛选结果是一样的

作用:将多个文本字符串按指定分隔符连接,可选择忽略空白单元格。

TEXTJOIN(间隔符号, 是否忽略空值, 文本1, 文本2 , ...)

* 后面的文本,可以是手动输入的文本,也可以是单元格引用

好,了解完这两个函数,我们就开始写公式。

我们的思路是:先用FILTER筛选出每个人的所有课程,再用TEXTJOIN用逗号间隔连接起来,所以公式是这样:

=TEXTJOIN(",",TRUE,FILTER($B$2:$B$31,$A$2:$A$31=E2,"无此人"))

textjoin的第二个参数和FILTER第三个参数,可以忽略用默认值,再简化一下公式是这样:

=TEXTJOIN(",",,FILTER($B$2:$B$31,$A$2:$A$31=E2))

03

自定义函数

如果你用的是2019以前的旧版本软件,或者觉得FILTER+TEXTJOIN这两个函数嵌套太复杂了,可以用VBA自定义函数的方法(代码我附在最后,直接复制就行)

什么叫自定义函数?就是EXCCEL/WPS自带函数库中没有,开发者自己开发的函数,开发完成后,可以和自带函数一样应用。

我们将这个新函数命名为:MLOOKUP,参数如下:

=MLOOKUP(查找值,在哪列找,返回哪列,匹配模式,用什么符号间隔)

函数说明:

1、查找值,在哪列找,返回哪列前三个参数为必须填写;

2、后面两个选填,匹配模式默认精确匹配,符号默认用逗号间隔;

VBA代码操作方法:

1、在你要应用函数的数据表中,按快捷键ALT+F11,打开VBA开发编辑器;

2、在左边“工程”空白处右键鼠标,插入一个模块:

3、将自定义函数MLOOKUP代码复制粘贴到右边空白代码窗口(代码在文章最后);

4、右上角打叉关闭VBA代码窗口,返回表格就可以用MLOOKUP了;

结果和第一个方法是一样的。我们还可以扩展一下这个函数的应用,比如:我想找出所有姓“刘”的同学的所有课程

这个时候,我们第四个参数匹配模式就可以派上用场了,我们可以应用模糊匹配。模糊匹配就是指只要包括查找值关键字就行了。

模糊匹配的应用,第一个方法也能实现,但比较复杂,得再嵌套FIND函数+ISNUMBER函数,整个公式就又复杂了

但我们用MLOOKUP,只需要一个函数一条简短的公式就行了。

对比一下,你觉得哪个更简洁高效呢?

或者,还有没有其它方法呢,评论区留言交流!

MLOOKUP代码:

Function MLOOKUP(findvalue, findrange, resultrange, _Optional isFuzzy As Boolean = False, _Optional delimiter As String = ",") As String'findvalue:查找值'findrange:查找区域'resultrange:返回结果区域'isFuzzy:是否模糊匹配(True=模糊,默认False=精确)'delimiter:结果间隔符号(默认逗号)Dim findarr As Variant, resultarr As Variant, m%Dim istr$On Error Resume Nextfindarr = findrangeresultarr = resultrangeFor m = 1 To UBound(findarr)If isFuzzy Then '模糊匹配If InStr(1, CStr(findarr(m, 1)), CStr(findvalue), vbTextCompare) > 0 Thenistr = istr & delimiter & resultarr(m, 1)End IfElse '精确匹配If findarr(m, 1) = findvalue Thenistr = istr & delimiter & resultarr(m, 1)End IfEnd IfNextIf Len(istr) > 0 ThenMLOOKUP = Mid(istr, Len(delimiter) + 1)ElseMLOOKUP = ""End IfEnd Function

如果你EXCEL基础还比较浅,建议你从这本书先系统性学习EXCEL函数和基础。

来源:陈星体育谈

相关推荐