数据结构论坛

首页 » 分类 » 常识 » 逆向查询中IF函数和数组的用法,你理解吗
TUhjnbcbe - 2025/6/4 16:13:00

花叶草木深,工作要加薪。最近收到资深粉丝发来的私信:廖老师,我对于VLOOKUP的逆向查询中使用IF和数组用法不太理解,您能详解一下吗?

当然,所以今天就抽时间来扒一下,隐藏在IF函数和数组用法里的是什么样的原理呢?不过在回答问题之前,我还是先来重温一下IF函数的基本用法。

01IF函数基本用法

IF函数是Excel比较常用函数之一,有函数中的万金油之称。在很多书中,介绍IF函数时,都喜欢用划分等级的例子来解释函数的用法,并告诉我们如何嵌套来解决问题,当然微软也很给力,在Excel版将嵌套的层数增加到67层,这样我们是不是就能在工作很愉快跟IF函数玩耍了呢?然而现实很骨感,反而在很多大公司的编程规范中,明确规定不得使用IF函数嵌套层数超过3层,而且等级划分尽量不要使用IF来完成。那么问题来了,IF函数到底犯了什么错,竟会被公司雪藏呢?

因为用IF函数嵌套分级的规律:划分N个层级需要N-1个if嵌套,若划分层级太多,就会导致IF函数嵌套逻辑结构复杂,代码冗长,一旦出现问题,查找原因非常困难,这也是为什么大公司雪藏它在分级上应用的原因。

不过这些不是本文的重点,再聊重点之前,还是先来了解一下IF的基础用法吧!

语法结构:IF(条件表达式,为真的结果,为假的结果)

条件表达式:通常为单元格引用+比较运算符+值或函数,不过存在最简形式,只保留值,这时值除了有2种类型,逻辑值和数字:TURE/非0(真)和FALSE/0(假),还有一种常为0或1的数组形式;为真的结果:条件表达式成立时,显示的值或方式,可为公式,函数,引用范围外,还可以是数值,字符串,字符串需要用双引号包裹;为假的结果:条件表达式不成立时显示的值或处理方式,值和处理方式同上;注:若不论条件表达式为真或假,不想做任何处理,可以留空,若函数返回参数留空,则函数最终运行结果为0;

IF函数的使用逻辑并不难理解,它其实就是一个最多有2个选项的单选题,比如C2,录入公式IF(B2=60,“及格”,”不及格”),同行B列单元格的值大于等于60,及格,否则不及格。了解了IF函数的基本用法,是不是贼简单,接下来就一起看看数组知识点。

02数组

如果你想精通Excel函数的用法,数组就是你必须要跨过的坎,只有熟悉了数组的一些原理,才能在解决问题的时候,做到游刃有余。

当然数组部分包含的知识点也不少,有数组的运算,一维和二维如何互相转化,函数的数组模式,以及数组分为几种类型,这些我会在后面的文中重点介绍,而今天我们只用到两个概念:一维数组和二维数组。

一维数组:在Excel中也是有方向之分:横向一维和纵向一维;横向以,逗号为间隔,纵向以分号为间隔,其中每个元素可以为文本,数字,日期,TRUE/FALSE,为文本时,需用双引号包裹;

一维数组横向和纵向示意图(图1)

二维数组:是指同时包含横向和纵向,在书写时,横向和纵向的原素是有顺序的:先纵后横,体现在符号上,先逗号后分号;其中的元素的数据类型同上,结构如下图:

二维数组元素结构示意图(图2)

虽然概念上很陌生,实际我们所使用的工作表,就是一个固定长度和高度的二维数组,若整个单列或截取一部分就是纵向一维引用数组,比如:A1:A8,同理横向数组为单行或单行的一部分:C1:H1表格的二维数组则同时包含引用范围的行和列:C2:D8

工作表数组引用示意图(图3)

03分析IF函数和数组用法原理

我在IF函数中使用数组作为条件表达式,并不是老师教的,也不是在书中看的,只是一时的突发奇想:如果用数组作为IF函数的条件,哪么函数运行的结果是数组吗?

于是我就在空白的单元录入了公式=IF({1,0},TRUE,FALSE),返回结果为TRUE,这不和平常的用法没区别吗?不对,是不是我测试的方式不对,赶紧用调试工具来检查一下公式的运行过程:

选中录入公式的单元格,点击下的按钮,弹出公式求值窗口,点击求值;

公式调试操作步骤示意图(图4)

结果还是TURE,接着我就在旁边的单元格录入={1,0},回车结果为1,原来系统会自动读取数组的第一个值作为最终结果,那么问题来了,怎么样才能读取公式的其它结果呢?

当然,首选就是能读取数组的函数INDEX,若能读出第2个值,也能证明返回的结果就是数组;按照惯例用INDEX函数之前需先简介一下用法,而在这只涉及它的一维数组用法:

语法结构:=INDEX(一维数组,位置);功能:读取数组中对应位置的元素;测试中,条件数组只包含2个元素,所以测试的公式修改为=INDEX(IF({1,0},TRUE,FALSE),2),回车后,返回的结果为FALSE,结果证明返回的确实是数组,虽然到这基本可以推测出数组为:{TRUE,FALSE},不过还是通过按钮,来验证一下,具体公式的运行过程如下:

公式运行过程步骤示意图(图5)

上图在第1次点击求值时,可以看到IF函数的执行结果为{TRUE,FALSE},通过跟条件表达式的{1,0}对比就能知道,原来可以用数字1/0顺序,来控制真假结果在数组的顺序;如果再将公式中的TRUE/FALSE都换成数组,那结果又会是怎么呢?

不过由于数组有三种类型,而IF函数的参数为3个,若想说明所有的情况,恐怕再有一两篇文章也写不完,所以这里我就只介绍关于逆向查询有关的2种情况,并将其概括为2个原型:

IF({1,0},一维纵向数组1,一维纵向数组2)IF({1;0},一维横向数组1,一维横向数组2)上面原型的运行结果,都会返回一个新的二维数组,数组1和数组2的顺序,也可以通过1,0的顺序来控制,先来个简单的例子,近距离了解一下生成的规律:

公式1:IF({0,1},{2;3;5;6},{7;8;9;10})生成一个二维数组:{7,2;8,3;9,5;10,6},类似数组合并,结果改变了两列元素的顺序;

公式2:IF({0;1},{2,3,5,6},{7,8,9,10})生成的新二维数组:{7,8,9,10;2,3,5,6},类似数组拼接,结果改变了两行元素的顺序;

公式1,2运行过程示意图(图6)

如果将上面公式中的结果数组用单元格引用代替,不就能实现单元格引用范围的重排了吗?不过在使用的时候,有1点值得注意:

结果的引用范围必须行数或列数相同且位置对应,否则行数或列数少的会返回部分#N/A或者结果错误;使用逆向查询的函数并非只有VLOOKUP,还有HLOOKUP,下面就来看看逆向查询是如何实现的。

04逆向查询的实现

在LOOKUP系查询家族中,VLOOKUP和HLOOKUP函数要求比较苛刻:

VLOOKUP使用时查找的值必需在引用范围的第一列;HLOOKUP则是查找的值必须在引用范围的第一行;由于大部分的表格,数据存储都是以行为一条数据的结构,所以HLOOKUP按列查询在使用率上就没有VLOOKUP高。我就VLOOKUP为例,简单的示范一下,逆向查询的实现:

现有一张工资表,数据结构如下:

案例数据结构示意图(图7)

求根据姓名查询出工号?

分析:根据VLOOKUP函数要求,姓名必须出现查询范围的第一列,上图可知,工号在A列,姓名在B列,所以要VLOOKUP来查询,就必须用到上面的公式1,来调整列的顺序。不过调整顺序的写法并非只有一种,因为A列,B列的结果的顺序有2种组合,条件数组中的1,0的顺序也有2种可能,所以可以组合出四种写法,而我选择条件数组的种的1对应A列引用,0对应B列引用,其中一种的写法:IF({0,1},A:A,B:B);在带入VLOOKUP函数之前,先回顾一下函数用法:

VLOOKUP(查找值,查找引用范围,返回结果所在列数,查找模式编码)

之后把编写的IF公式代替查找引用范围,返回结果所在列数为2,查找模式编码为0(精准查找),公式的原料已经备齐,剩下就是步骤了。

操作步骤:

F1:G1录入“查询姓名”和“工号”,F2为录入姓名单元格,G3的公式为=VLOOKUP(F2,IF({0,1},A:A,B:B),2,0)回车;

05总结

虽然IF函数和数组的用法可以实现VLOOKUP和HLOOKUP的逆向查找,但逆向查找用INDEX+MATCH组合不是也是很香的嘛。因为毕竟引用范围的重排是比较性能的,非必要的情况下,不建议使用。

不过话有说回来,IF函数和数组的结合的玩法还是挺有意思的,也可以作为我们平常练习或开拓思路的一种方法,也未尝不可。由于文章的篇幅,多维引用范围的重组没有说到,如果你想了解,可以留言或私信给我,当留言超过20个,我就会解锁它们的玩法。

有人说学的深了难,够用就行,可是在成人的世界里,不难的事,又有几个是值钱的。学习无非就是,你的一个想法,然后你去不断判断,验证,总结成你的智慧的过程,只要你念念不忘,必有回响。

好了,今天的文章就到这儿,希望你可以从中有所收获,也希望你能把你们遇到的问题私信或在文后留言给我。如果你喜欢我的文章,就

1
查看完整版本: 逆向查询中IF函数和数组的用法,你理解吗