相信不少人看到标题,立即嗤之以鼻,VLOOKUP 谁不会?是的,大家都会,但用的好的人不多。相信我,这篇文章一定可以算得上通俗易懂,又有深度的一篇文章,熟练掌握本文所讲内容,一定会在日常 Excel 处理时如鱼得水。

预备知识

Excel 数组

Excel 用 {a,b,c}{a;b;c} 表示数组。数组的主要作用是用于有多个返回值的公式 (数组公式)或函数。我举一个必须用数组公式的例子。假设有三个字段,是按行放置的,我们想进行转置,像下面这样:

要求用函数来实现,不能用选择性粘贴。正确的答案如下图(注意数组函数最后必须 CTRL+SHIFT+ENTER 三个键同时按下,否则错误

注意地址栏是公式有大括号括起来:{=TRANSPOSE(A2:C2)},这个是 Excel 数组公式的标志。

我们可以把数组简单地理解为:Excel 把工作表的某区域 (Range) 值,按照行列整体在内存中存储,并可以方便的再将数组在工作表的 Range 中进行显示

来看一个操作,印证和理解一下。在 A1:C3 这个区域存放着两笔信息,我们用数组公式将数据放到同样大小的一块区域 E1:G3

将光标放到编辑栏,按下 F9,对,你没有看错,Excel 对数组使用的是域,所以用 F9 来解析,我们发现,编辑栏变成了这样:

地址栏的数据为:

 {"ID","姓名","地址";"001","Stone","Wuhan";"002","Tom","England"}

如果我们这么写看起来就更清晰了:

 { "ID","姓名","地址"; "001","Stone","Wuhan";"002","Tom","England"}

这是一个二维的数组。我们可以看到,行数据用逗号分隔(水平数组),列数据用分号分割(垂直数组)。刚才的操作可以这样解释:Excel 把 A1:C3 的数据拷贝到数组,然后再把数组的数据拷贝到 E1:G3。那么,这样操作的作用是什么呢?注意,这个是理解后续函数操作的关键:我们之所以要用数组公式把数据放到数组中,就是为了在需要在函数中要用到 Excel Range 的地方,也可以用数组来代替,从而获得某种灵活性。现在不理解,不着急,后面有例子说明。

数组的运算

如果把某个值和一个数组进行运算,那么这个值会和数组中的每一个元素(或称每一项)进行运算。如果将两个数组进行运算,那么数组中的每个对应位置的元素都会执行某种运算。这种运算规律非常像线性代数的矩阵运算。

举个例子:

IF 函数高级用法

IF 除了返回一个单值,还可以返回一个数组。此时 IF 函数的语法如下:

IF({1,0}, range1, range2)

理解:因为 {1,0} 表示一个数组,所以每一个元素都会执行运算,首先获取第一个元素 1, IF 函数对不为零的条件,返回 range1;然后再获取第二个元素 0, IF 函数对 0,返回 range2。最后,函数再将 range1 和 range2 组合成一个新的数组。

举例: 运用 IF 函数将 ID姓名 两个字段改变顺序

{=IF({1,0},B1:B3,A1:A3)}

VLOOKUP 基本用法

VLOOKUP 的语法如下:

VLOOKUP(Lookup_value, Table_array, Col_index_num, TRUE/FALSE)
  • Lookup_value: 要查找的值
  • Table_array: 查找的范围。查找的范围中, Lookup_value 对应的列(为了表述方便,后面将对应的列称作关键列)关键列必须处在第一列位置。
  • Col_index_num: 查找的列数。在查找范围中,要找的值从第一列算起,所在列的偏移值。比如从 A 算起,如果要在 B 列中查找某值,则列的偏移值为 2,以此类推。要点:查找的列一定要在 Lookup_value 所在列的右边。
  • 第四个参数,如果为 FALSE 或者 0,表示精确匹配,如果为 TRUE 或者 非零值,表示模糊匹配

文字描述总是难理解一些,可以参考视频 VLOOKUP 函数 来学习。

接下来介绍 VLOOKUP 函数的几个比较高级一点的用法。

向左查找

比如我们要根据 ID 来查找姓名,但不巧 姓名ID 的左边:

我们前面讲过使用 IF 函数构造一个数组,通过这个数组来改变列的位置,也讲过函数需要使用 Range 的地方,可以使用数组来代替。将上面两个技术结合,就可以达到目的。

函数如下:

=VLOOKUP(E2,IF({1,0},B1:B3,A1:A3),2,0)

函数理解: IF({1,0},B1:B3,A1:A3) 返回一个数组,数组内容为:

{"ID","姓名";"001","Stone";"002","Tom"}

所以 VLOOKUP 函数利用这个数组,可以在第二列中就开到对应姓名。

多条件查找

比如我们要根据公司姓名两个字段来确定人员对应的补助:

方法是将公司和姓名组合成一个字段,然后再使用 VLOOKUP 函数:

H2 单元格的函数为:

{=VLOOKUP(E2&F2,IF({1,0},A1:A5&B1:B5,C1:C5),2,0)}

注意这里必须使用公式数组,同时按下 CTRL+SHIFT+ENTER

VLOOKUP 和 COLUMNS 函数联合起来

比如我们要根据补助标准来发放补助,但表的字段太多,补助AJ 列。如果使用 VLOOKUP 函数,需要计算 A 到 AJ 的列数。

这个时候,我们可以通过 columns 函数来帮助我们计算 A 到 AJ 共计多少列。columns 函数的语法如下:

COLUMNS(A:AJ)

结合 VLOOKUP 函数用法如下:

=VLOOKUP(AL2,A:AJ,COLUMNS(A:AJ),0)

手写一个比 VLOOKUP 更好用的函数

通过上面的介绍,我觉得 VLOOKUP 函数的缺点还是蛮多的,比如:

  • 不能向左查找
  • 查找范围是一个连续的范围,很多不相关的列都放在里面,不但用不到,还需要计算从开始到结束的偏移量 (offset)

那我们可不可以按自己的逻辑来增强 VLOOKUP 函数呢?当然可以,自定义函数如何实现是另一个话题,这里不细讲如何自定义函数,只给出一个增强 VLOOKUP 函数的实现,用起来比较清爽:

VLOOKUPPRO(lookup_value, lookup_range, target_range)

根据 lookup_value 在 lookup_range 中找到 lookup_value, 然后返回 target_range 中找到的值。这样,不用计算列数,一般情况下,我们也用不到模糊查找,所以就直接用精确查找。

Public Function VLookupPro(lookup_value As Range, lookup_range As Range, target_range As Range) As VariantDim result As VariantDim table_array1() As VariantDim table_array2() As VariantDim table_array As VariantDim firstRow As LongDim lastRow As LongDim usedRng As RangeSet usedRng = lookup_range.Worksheet.UsedRangefirstRow = usedRng.Cells(1, 1).RowlastRow = usedRng.Cells(usedRng.Rows.Count, 1).Row' Populate lookup_range and target_rangeDim i As LongDim rowCount As LongrowCount = lastRow - firstRow + 1ReDim table_array1(1 To rowCount)ReDim table_array2(1 To rowCount)For i = 1 To rowCounttable_array1(i) = lookup_range.Cells(i, 1).Valuetable_array2(i) = target_range.Cells(i, 1).ValueNextReDim table_array(1 To UBound(table_array1), 1 To 2)For i = 1 To UBound(table_array)table_array(i, 1) = table_array1(i)table_array(i, 2) = table_array2(i)Nextresult = Application.WorksheetFunction.VLookup(lookup_value.Value, table_array, 2, False)VLookupPro = result
End Function

使用方法示例如下:

VLOOKUP 函数,你所不知道的用法相关推荐

  1. Go基础之--位操作中你所不知道的用法

    之前一直忽略的就是所有语言中关于位操作,觉得用处并不多,可能用到也非常简单的用法,但是其实一直忽略的是它们的用处还是非常大的,下面先回顾一下位操作符的基础 位操作符 与操作:& 1 & ...

  2. python 函数调用 不允许关键字参数_你所不知道的Python|函数参数的演进之路

    原标题:你所不知道的Python|函数参数的演进之路 函数参数处理机制是Python中一个非常重要的知识点,随着Python的演进,参数处理机制的灵活性和丰富性也在不断增加,使得我们不仅可以写出简化的 ...

  3. 你所不知道的setTimeout

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...

  4. 被低估的css滤镜,你所不知道的 CSS 滤镜技巧与细节

    本文主要介绍 CSS 滤镜的不常用用法,希望能给读者带来一些干货! 系列 CSS 文章汇总在我的 Github ,持续更新,欢迎点个 star 订阅收藏. OK,下面直接进入正文.本文所描述的滤镜,指 ...

  5. 你所不知道的模块调试技巧 - npm link #17

    你所不知道的模块调试技巧 - npm link #17 1. 背景 node 应用开发中,我们不可避免的需要使用或拆分为 npm 模块,经常遇到的一个问题是: 新开发或修改的 npm 模块,如何在项目 ...

  6. 你真的会玩SQL吗?你所不知道的 数据聚合

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  7. Android Context完全解析,你所不知道的Context的各种细节

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/47028975 前几篇文章,我也是费劲心思写了一个ListView系列的三部曲,虽然 ...

  8. 你所不知道的console.log()(console.log详解)

    console.log,作为一个前端开发者,想必每天都会用它来做分析调试,但这个简单函数背后你所不知道的一面,很多人未必使用过,有一些也是很方便使用的 基础 首先,简单科普这个函数的作用.前端开发者可 ...

  9. 你所不知道的Shutdown命令

    你所不知道的Shutdown命令 当你按下win + R 在输入框中输入"shutdown -s -t 6"(拼手速的时候来了) 当你看到图一时,上面会写Windows将在6秒钟开 ...

最新文章

  1. 最新+经典+论文+代码+多版本+神器+https://paperswithcode.com/
  2. hadoop和python的关系_Python 的 map 和 reduce 和 Hadoop 的 MapReduce 有什么关系?
  3. Git分支合并:Merge、Rebase的选择
  4. 进站公交车碾起积水溅上轿车两男子驾车撞伤公交司机
  5. python odoo_Odoo开发教程20-使用 Python 虚拟环境安装 Odoo第二讲
  6. 【转】细说.NET中的多线程 (二 线程池)
  7. flume介绍与原理
  8. Jenkins远程调度Shell命令
  9. android之字体阴影效果
  10. CRC校验关键点说明(内附C语言CRC校验库)
  11. 4.19华为技术面+4.21华为主管面(已OC)
  12. nginx通过url跳转到另外的一个url上
  13. redis px nx ex xx
  14. 母亲节任务最后一个料理的源码
  15. 睡不着?用药成瘾?深受失眠困扰的北上广白领们必看
  16. oppoa9处理器怎么样_oppo a9是什么处理器
  17. linux单网卡多拨Adsl,ADSL多拨
  18. 线程学习(13)-偏向锁
  19. 企业如何借助百度百家号进行网络推广?
  20. Esxi6.7-7.0设置自动启动无效原因

热门文章

  1. Mysql 、oracle 、 zookpper、 redis 默认端口
  2. 假如需要一百万个对象
  3. 2015年4月1日愚人节--怀念张国荣
  4. 大学里,有这样一群人
  5. 使用Python生成股票K线图
  6. mysql的配置和安装
  7. 周公解梦数据库(完整版:含9000多条数据)
  8. cnpm不是内部命令的解决办法
  9. 手柄?模拟器?tcgames?王座?玩刺激战场到底怎么玩才能吃鸡?
  10. 中国传媒大学计算机联合学院,中国传媒大学成功举行CCF-CV走进高校学术报告会...