只会用 VLOOKUP?这些奇技淫巧了解一下!

上次讲了如何使用IF和CHOOSE配合VLOOKUP实现反向VLOOKUP。

然而,挤牙膏不是我的专长。 今天,我们来盘点一下EXCEL中常用的数据查询方法。

假设场景

为何更好展现这些查询方法,我们不妨设想一个场景
假如我有如下的一张表,需要快速地找到所有姓赵的学生的成绩

为了获得姓赵的所有学生的成绩,我们需要用怎么样的逻辑来完成呢?

  1. 直觉告诉我,首先我需要获得所有同学的姓氏
  2. ​接着,我应该很自然地把姓赵的同学筛选出来
  3. 最后,我便可从容不迫地匹配出所需的同学的成绩

在开始具体实现之前,我们还需要注意,实现这件事方法有很多,但是怎样的方法才是合适的,才是符合需求的

  • 比如,今天需要姓同学,明天你是否又需要姓的同学的成绩,或者其他某个姓氏的成绩了呢
  • 比如,如今你的表中有几十个人,明天你是否需要从全校的几千人中查询

如果需求简单,复杂的方法反而浪费时间
如果需求复杂,完善的方法可以让你事半功倍

接下来,我们就来看看,简单可以有多么简单,复杂又可以有多么复杂,他们适用的场景又有什么不同


极致简单版

1.获得所有同学的姓氏

在不考虑复姓的前提下,获得姓名中的姓氏,不要太简单哦!

这里提供两种方法:

  • 分列
    是EXCEL最常用的拆分方法,可以将一列文本,按照一定的规则,拆成几列。
  • MID函数
    相比于分列,我更喜欢MID
    MID可以对字符进行拆分,取出中间任意几个字符
MID("ABC", 1, 2)  
# 从ABC这个字符串的第1个字符开始,取出2个字符
# 结果为 AB

比如,如果要取出同学姓名中的姓氏,MID(同学姓名,1,1)就可以了

2. 筛选学生和成绩

有了姓氏,接着我们需要把某个姓氏的同学都挑选出来

同样提供两个操作,筛选和切片器

  • 筛选
    EXCEL中用于数据查询最最常见的功能
    反正姓都有了,直接对姓氏那一列筛选就OK了。相信你懂的(  ̄ー ̄)

    image.png

  • 切片器

切片器就是成了仙的筛选,真正做到了哪里要看点哪里

只要将表格格式化或者使用pivot table,就可以轻松使用切片器,让你的筛选变成指尖愉快的单击。

极致复杂版

快乐的时光总是那么短暂,接下来,我们来搞点烧脑的东西。

本段内容如果催眠,那就来瓶脉动吧!重新脉动起来(脉动可以考虑适当赞助)

EXCEL中什么最复杂,那自然是公式啊
EXCEL中什么公式最复杂,那自然是嵌套公式啊

如果我们要使用公式来解决这个问题,那么问题的复杂程度的陡然上升。

这时,有人就要问了,既然我有简单的方式,为什么要反过来使用复杂的呢?

行为艺术吗?

行为艺术自然是没有必要的,复杂的公式自然有其优势,比如

  • 简单法需要添加一列姓氏辅助列,会在原表格上添加冗余数据
  • 简单法只能筛选数据,得到数据还需要把内容复制出来
  • 无论是删选,还是切片器,如果全校有几千个人,百家姓都在,那么使用起来其实是比较麻烦的

如果用公式法,一定程度上可以解决以上问题!

在公式法中,这是一个典型的一对多筛选问题(利用一个筛选多行数据)
也是EXCEL各路函数争奇斗艳,施展灵魂操作的地方

争奇斗艳者

  • 神奇的数组函数
    EXCEL可以处理单个值的计算,也可以处理一个序列。
    即,你输入一个序列,他对里面每一个元素运算,然后再输出一列结果
  • 优雅的Match
Match("C", {"A","B", "C", "D"})  
# 在序列中搜寻C,输出找到的位置
# 即 3
  • 精准的INDEX
INDEX({"A","B","C", "D"},3)  
# 在序列中找到位置为3的值,输出
# 即 C
  • 深藏不漏的IF
    IF配合数组函数,可以实现1对多的查询
IF({"A","B","C","D"} = "C", {1,2,3,4},0)  
# ABCD对应1234 
# 将序列中的每一个值与C比较,如果相等,输出对应的值,反之输出0
# {0,0,3,0}

技术路线

而利用以上的函数,我们又有两条技术路线可以尝试:

  • 路线1
    使用IF直接获得比较每一个名字的姓是否是,如果是,可以获得对应的行号,获得行号后就可以使用INDEX函数来获取姓名列和成绩列的值了

示意图如下

  • 路线2
    第二种操作就很有趣了,我们可以通过一些手段,将一对多问题,转化为一对一问题,然后使用MATCH处理。

示意图如下

具体实现

能看到这里的小伙伴一定是真爱, 给你们比心!

由于具体实现比较复杂,我很难在有效的篇幅内讲清,所以这里只能意思一下!

想深入了解的读者可以在文末获取一个EXCEL文件,自己试验一下。

  • 路线1
#Name
=IFERROR(INDEX(A$1:A$17,SMALL(IF(N$2=MID(A$1:A$17,1,1),ROW(A$1:A$17),""),ROW(A$1:A$17))),"-")
#SCORE
=IFERROR(INDEX(B$1:B$17,SMALL(IF(N$2=MID(A$1:A$17,1,1),ROW(A$1:A$17),""),ROW(A$1:A$17))),"-")
  • 路线2
#Name
=IFERROR(INDEX(A1:A17,SMALL(IFERROR(MATCH(O2&ROW(A1:A17),MID(A1:A17,1,1) & ROW(A1:A17),0),""),ROW(A1:A17))),"-")
#SCORE
=IFERROR(INDEX(B1:B17,SMALL(IFERROR(MATCH(O2&ROW(A1:A17),MID(A1:A17,1,1) & ROW(A1:A17),0),""),ROW(A1:A17))),"-")

尾声

国庆,中秋,已然结束啦,祝大家在接下的学习与工作,一切顺利。

EXCEL文件获取方式:后台回复EasyCEL

肖恩
2020.10

你可能感兴趣的:(只会用 VLOOKUP?这些奇技淫巧了解一下!)