盛夏时节,高考刚过, 本期说一点跟高考有关系的。 什么东西跟高考有关系? 就是看不懂、学不会和考不过的内容…… (预感本期将创阅读量新低) 本篇可能是讲述VLOOKUP、数组和IF{0,1}, 最透彻的网文,立文为证! 感受被数学支配的恐惧吧! 喵哈哈哈…… 一、【数组】 数组是啥? 就是一大堆数据组合在一起。 数组其实是计算机专业的概念, 和数学专业内的数组不是太一样, 数学专业(线性代数里的)内的数组, 是一个按照长方阵列排列的复数或实数集合, 其准确的定义叫矩阵(Matrix)。 计算机专业中的数组和矩阵的结构相似, 但数组中的元素可以是字符或其他, 矩阵中的只能是数, 这是二者最直观的区别。 EXCEL里, 把数据填入行和列内, 本质上就是数组。 单独一行叫单行数组,是一维数组, 表达式{1,2,3…},用逗号【,】隔开; 单独一列的叫单列数组,是二维数组, 是最简单的二维数组,不是一维数组哦, 表达式{1;2;3…}, 在行与行之间,即多个一维数组间, 用分号【;】隔开。 多行、多列的区域,组成了二维数组, 表达式如{1,2,3;4,5,6;7,8,9;…}。 维度的理解很简单, 把行看成是X轴,是一个维度,一维, 把列看成是Y轴,则再加一个维度,变成二维。 单独一列,其X轴上固定宽度是一列,而不是没有, 所以,单列数组是二维,而不是一维。 到目前为止,好像很简单。 甲纯们平时在做表,其实都是在玩数组。 二、【VLOOKUP与数组】 VLOOKUP函数的【查找返回区域】, 很多情况下, 区域内的原始数据并不能马上应用, 而是要经过一系列的分解或者组合或者重构。 比如下图: VLOOKUP要通过查找特征值【ERP号】, 得到相应的【姓名】。 但【ERP号】列并不在查找返回区域内的第一列, 所以要改变它在区域(数组)内的位置, 最简单的方法是直接新增一行并且做数据映射, 这个在之前的文章中有演示过。 传送门>>>VLOOKUP列的映射 如果说有强迫症, 或者条件不允许, 就是无法改变表格的格式, 那有没有组合或重构【查找返回区域】的其他办法? 百毒一下,有很多方法提到了IF{0,1}。 演示: 三、【IF{0,1}】 呃,请问有人看得懂吗? [B10]=VLOOKUP(A:A,IF({0,1},A1:A7,D1:D7),2,0)。 这里的【IF({0,1},A1:A7,D1:D7)】是个什么鬼? 它是条件数组函数。 在EXCEL有看到大括号【{}】的出现, 就代表有数组的存在。 【IF({0,1},真区域,假区域)】, 整体的意思是说, 根据判断条件,创建一个数组, 暂时存在内存里面(即内存数组), 不显示出来(所以在表格内看不见)。 前面说过,其实二维数组等同于EXCEL的行列区域, 所以VLOOKUP函数可以作用于数组上。 {0,1}有3层意思, 1是创建的数组的形式是{X,X}, 即2列的二维数组。 就像下图: 2是{0,1}是IF的判断条件, 它也是一个数组, 应按顺序判断数组内的数据, 先判断数据【0】(即为假), 于是将IF({0,1},真区域,假区域)的【假区域】的数据, 填充到创建的内存数组内的第一列; (注:IF函数中0为假,1和其他的任意数字均为真, {0,1}和{FLASE,2}和{0,100}等等,本质上没有差别) 接着判断数据为1(即为真), 于是将IF({0,1},真区域,假区域)的【真区域】的数据, 填充到内存素组内的第二列。 IF({0,1},A1:A7,D1:D7)的效果示意图如下: 3是{0,1},判断结果是先假、后真, 刚好把【IF({0,1}】,真区域,假区域)内的 【真区域】和【假区域】的这2个, 本来按顺序是先真后假的数据, 对调了一下, 也就实现了调换列的顺序的目的。 如果是使用【IF({1,0}】,判断结果先真、后假, 那么公式就要变成: VLOOKUP(A:A,IF({1,0},D1:D7,A1:A7),2,0)。
好吧,纯老师自己好像也很乱。 总之就是利用IF({X,X},真区域,假区域), 按照特定的判断条件, 实现调换列顺序的功能, 并生成一个新的内存数组。 那看完上述的知识点, 希望有假纯能够举手质疑: 花这么多气力绕这么一大圈, 就为了调个列顺序?! 丫闲得吧。 四、【IF({X,X,X,X…}】 使用IF({X,X},真区域,假区域), 费这么大劲就形成两列的数组, 根本就无法应对日常很多列的数据。 如果要生成包含更多列的内存数组呢? 关键在于判断条件数组【{ }】内的形式。 使用IF({X1,X2,X3…Xn},真区域,假区域) 生成内存数组, 最简单的可以理解为【摘取】的概念。 【摘取】是列的摘取,即看中了哪一列, 就把该列摘取出来填充到内存数组的相应列。 步骤有2个: 举例IF({0,1},A1:A7,D1:D7) 1、确定要【摘取】的区域 {0,1}先演化为【{取假区域的某一列,取真区域里的某一列}】 2、确定要【摘取】的列 确定原则是 被【摘取】的列与内存数组的列序号相等。 则【{取假区域的某一列,取真区域的某一列}】 进一步演化为:【{取假区域的第1列,取真假区域的第2列}】 再加一个重点: 3、仅单列等于无数列 根据第二部演化的【摘取】条件, 【取真区域里的第2列】无法实现, 因为真区域【A1:A7】只有一列,并没有第2列, 根据EXCEL单列等于无数列的默认条件, 直接取【A1:A7】。 但如果区域内有2列,而【摘取】条件要求第3列, 则内存数组会出错,所以仅单列等于无数列。 IF({0,1},A1:A7,D1:D7), 最终生成的内存数组为{D1:D7,A1:A7}。 照猫画虎,推导其他例子。 IF({1,1},A:B,C:D): {1,1}演化为【{取真区域的第1列,取真区域的某2列}】, 故生成的内存数组为{A:A,B:B}。 IF({0,0},A:B,C:D): {0,0}演化为【{取假区域的第1列,取假区域的某2列}】, 故生成的内存数组为{C:C,D:D}。 开始来一点容易混淆的: IF({1,0,1},A:C,D:E): {1,0,1}演化为 【{真区域第1列,假区域的某2列,真区域第3列}】, 故生成的内存数组为{A:A,E:E,C:C}。 第2列取的是假区域的第2列,是E:E,而不是D:D。 要注意看清楚哦! IF({0,1,0},A:C,D:F): {0,1,0}演化为 【{假区域第1列,真区域的某2列,假区域第3列}】, 故生成的内存数组为{D:D,B:B,F:F}。 其他的以此类推、举一反三。 好了,终于写完了! 解脱啦…… 以下, 献给参加高考, 和没参加高考的, 希望,你们都可以证明自己! 所以, 最后, 到底第一个冲出考场的, 是左脚踩线还是右脚踩线呢? |
|