网上冲浪看到的题目,我的工作中其实没遇到过,但是这题解起来挺好玩儿的,所以写这篇文章把解决方式总结一下。
我看到这个题目的第一反应是整理数据为标准的格式,即业务人员一人一个单元格存储,考核得分对应其后。
方法一:快捷键+vlookup
快捷键 Ctrl+E
在数据表右侧添加一列,标题下第一行写上要提取的名称,摁键盘上的Ctrl+E,就可以填充到末尾了,如图所示
同理把其他的人名提取出来,上下复制粘贴到一起,然后VLOOKUP匹配到一起。
=VLOOKUP(F3,$L$2:$M$15,2,FALSE)
注意查找范围要绝对引用,不然下拉的时候就出错了
这个方法适合少量数据的处理,几百上千就容易出错了,效率也不够高效
方法二:vlookup+if+find
=VLOOKUP(1,IF({1,0},--ISNUMBER(FIND(D3,$A$2:$A$8)),$B$2:$B$8),2,FALSE)
分解一下这个函数思路,就是先用find查找条件在数据范围内的第几行,这一列数据我们用--ISNUMBER(FIND(D3,$A$2:$A$8))表示,如图中的第③步。
然后用IF({1,0},列1,列2)把上一步求得的区域和对应的分值组成一个区域,然后用vlookup去匹配。
可能会有一个疑问,为什么要把员工那一列这样处理,直接find出结果,vlookup4所在的行不行吗?
当然!不行。
find得到的是查找的值在文本中的位置,他会随着我们查找的文本的长度和被查找的文本长度变化而变化,并不是恒等于4的,所以这里要把他处理成1和0的关系,我们就可以判断当结果返回1的时候,他所对应的分值才是正确的。
在写这个方法的时候,突然想到一个不用if组成新数组也能得到分值的方法,而且这个方法对比今天列举的这几个方法来说都简单好理解。
方法三:index+match+find
=INDEX($A$2:$B$8,MATCH(1,--ISNUMBER(FIND(D3,$A$2:$A$8)),0),2)
index(数据范围,移动行,移动列)返回指定的行与列交叉处的单元格引用
移动的行,同样是利用--ISNUMBER(FIND(D3,$A$2:$A$8))这个公式,处理好我们的员工列,然后用match函数得到查找值所在的行
移动的列=2,即分值所在的列
方法四:文本函数+vstack+vlookup
=VLOOKUP(D3,VSTACK(IF({1,0},TEXTBEFORE($A$2:$A$8,","),$B$2:$B$8),IF({1,0},TEXTAFTER($A$2:$A$8,","),$B$2:$B$8)),2,FALSE)
这个方法是利用Excel新更新的几个函数完成的
TEXTBEFORE(文本,分隔符)返回分隔符之前的文本
TEXTAFTER(文本,分隔符)返回分隔符之后的文本
VSTACK(范围1,范围2,......)将数组上下合并成一个数组
我们用这三个函数把数据处理成标准格式,替换vlookup中的查找范围,就可以得到最终结果。
这种方法就不放图了,有兴趣在表格里面实现以下,自己动手做一遍,体会更深刻一些。
方法五:powerquery纯操作无代码版本
选中数据区域-数据-来自表格/区域
加载数据到编辑器中
按图处理数据
在表1处右击-复制
得到表1(2),可以重命名,也可以不管,对两张表删除多余列并重命名,如图
按下图所示追加查询
将得到的表根据提示关闭并上载至表中
然后就可以用vlookup函数匹配了,图中的追加1就是我们处理后的表
用PQ的好处就是无论多少数据,数据增减变化,我们处理过后的结果总是跟着我们的变动而变化的,也就是说得到的结果基本正确。
我们总结一下:
本文列举了5种方法解决这个问题,第一种是不推荐的,手工处理容易出错且效率低,局限性较大;
第2~4种都是一个公式得到结果,根据自己的喜好来选择即可,需要注意的是数据的范围要绝对引用,还有如果有增删,记得修改数据范围;
第5种方法适用于对PQ有简单了解的朋友,这个办法基本属于一劳永逸,数据增删之后只需要刷新表,数据会自动更新,很方便。
完结,✿✿ヽ(°▽°)ノ✿