INDEX+MATCH是一对非常好用的组合,比VLOOKUP更好用,能适用更多的匹配场景。
比如针对这种反向匹配的问题,用INDEX+MATCH就非常简单了。
但是今天我们不讲这个组合,我们来讲讲如何利用PowerQuery里的M函数实现类似INDEX+MATCH的效果。
我们的题目是这样的。
现在不同订单有多种产品类别,需要根据不同的类别编号将产品类别做一个替换。
结果是这样的。
这个问题利用普通的函数组合,什么数组公式啊什么各种函数好像都不好解决,所以我们尝试利用PQ来解决这个比较困难的问题。
第一步、加载数据
将数据加载到PQ,这里就不细说了,忘记了的同学可以翻看一下我之前写过的PQ技巧,这里将有订单号的表名改为“订单”,对应关系的表名改为“对应”,当然你可以改其他名字,只是为了好区分。
第二步、文本拆分
在订单表里,点击添加列-添加自定义列,然后写上自定义列公式“=Text.Split([产品类别],";")”,就把产品类别按照分号做了拆分,只有拆分好了才能分别去对应。
每个产品类别拆分后都是一个列表List,可以查看下结果。
第三步、类别编号对应
这一步是最关键最核心的一步,我们需要把每个List里的元素按照对应规则一一对应到编号。由于是对列表的每个元素操作,我们用到List.Transform函数。首先将函数写好,"each _"表示不对列表做任何操作,这里“_”表示列表中的每一个元素。
然后我们再来我们定位每个类别在对应表的类别列中出现的位置。
利用List.PostionOf可以定位当前列表中每一个元素在对应关系表的类别里中出现的位置,这里“对应[类别]”也是一个列表,即对应表中的类别这列。
这样就定位好了每个类别在对应表中的位置,相当于做好了MATCH函数的功能。
下面做INDEX函数的功能。
直接取对应表中编号这一列对应位置的内容就好了。注意这里方括号[]表示某个表里的一列,而花括号表示列表里某个索引位置的值。
这个时候的结果就是把类别转换成了对应的编号。
第四步、合并编号,加载数据
上一步出来的结果是列表,我们需要组合成一个文本,这里用Text.Combine函数即可,类似于工作表函数中的Textjoin(不过要OFFICE最新版才有)。注意这里函数写在外层,因为是对整个列表操作。
然后加载工作表,这个就不赘述了。当然自定义这三个字你可以在添加自定义列的时候修改一下。
看下来其实PowerQuery里的M函数也不是很难,如果工作表函数学的比较扎实,同时还学过一些数组公式的知识,那么学起M函数应该比较轻松!
其实不用M函数,只用PQ面板里的功能,也能做到,你愿意尝试下么?