-
决胜职场的必备函数
2016年8月25日晚间业问微信平台在线分享内容实录
最近呢有款手机游戏特别火,一个从《部落冲突》演化而来的卡牌游戏,经常能在等车、等人的时候看到有朋友会拿出手机玩上几局,游戏的开发公司最近还被腾讯给收购了。
阅读全文 »2条评论 -
Excel和身份证不得不说的那些事儿
经常有从事HR方面工作的朋友会来询问一些与身份证信息提取相关的问题,在写作《Excel 2007实战技巧精粹》的时候,当中其实有专门一章的内容是与这个话题相关的。现在再通过这篇文章来简单的总结一下与之相关的一些函数公式用法。
阅读全文 » -
LOOKUP函数的二分法查找策略
-
单元格引用的简写和变形
以前发在EHblog的老博文,现在关闭了,准备陆陆续续搬迁一点过来。时间久了,有些文章也不一定保值了。
在Excel当中,单元格引用是一个很初级的问题,但也是和公式运算关系最密切的知识点之一。单元格引用从形式上来说包括A1引用和R1C1两种,从地址对象上来说又包含了绝对引用、相对引用以及两者结合的混合引用三种方式。上面两个概念已经很让人头晕了,但是要看明白下面的博文,你至少先要理解上述所提到的几个概念,因为下面博文所涉及的是比上述内容更复杂的与引用相关的元素——引用运算符,它包括【区域引用】、【联合引用】和【交叉引用】
————————————————以下原文发表于2009-9-17——————————————
单元格引用有A1和R1C1两种样式,两种形式中又包含了绝对引用和相对引用两种不同的变化。本帖不讨论绝对引用和相对引用的问题,而是着重讨论一下在单元格引用中结合三种引用运算符所进行的引用地址变形及简写方式。
单个区域的引用(同行、同列的简写):
先来讲一下R1C1方式的引用
对于G2:J2这样一个单元格区域,使用R1C1引用样式,可以写作:R2C7:R2C10,也可以写作:R2C10:R2C7。但R必须在C前面,“C10R2:C7R2”这样的写法是无效的。
对于这样同行的区域引用,可以使用简写的引用方式,即将R2C7:R2C10中的红色部分省去,简写为R2C7:C10。
如果对于同列的区域引用,例如G2:G10,则可以将R2C7:R10C7中的红色部分省去,简写为R2:R10C7。为什么可以这样简写?为什么一个是将后面的R2省去而另一个是将前面的C7省去?这样的简写有何规律?在没有官方的解释之前,为了便于大家的理解和记忆,我给出一个我自己的解释思路,请看下面的“关于引用运算符”:
关于引用运算符:
Excel中包含了3种引用运算符,用于表示对单元格的引用,
一种是冒号,称为区域运算符,这是最常见的,如=SUM(A2:B10),表示引用冒号两边单元格所围成的矩形区域;
一种是逗号,称为联合运算符,如=RANK(A1,(A1:A10,C1:C10)),表示同时引用逗号两边的两个区域;
还有一种是空格,称为交叉运算符,表示引用空格两边的两个区域的交集,如=SUM(A1:B5 A4:D9)即等价于=SUM(A4:B5)。这个交叉运算符也是我这里要重点讨论的一个使用技巧。对于G2:J2这个单元格区域,如果换一个角度来看,可以看作是G:J这4列与第2行所构成的交叉区域。因此,如果用交叉运算符和R1C1样式来引用的话,可以写作:R2 C7:C10,中间用交叉运算符空格分隔,即表示R2与C7:C10这两个区域的交叉区域。
因此R2C7:R2C10等价于(R2 C7:C10),而这个形式与上面的简写形式R2C7:C10十分相似;
同理,G2:G10可以表示为R2C7:R10C7,等价于(R2:R10 C7),这个形式与其简写形式R2:R10C7也十分相似。因此,同行或同列的区域引用简写原则可以看作是一次类似合并同类项以后消项的过程:
R2C7:R2C10=R2 C7:C10=R2C7:C10
R2C7:R10C7= R2:R10 C7=R2:R10C7交叉运算符同样也可以应用在A1引用方式中:
例如(R2 C7:C10)如果使用A1引用方式,则可以写作:(2:2 G:J)
(R2:R10 C7)如果使用A1引用方式,则可以写作:(G:G 2:10)多个区域的引用(合并同类项):
以同时引用G13:J13、G15:J15、G17:J17这三行区域为例,
使用R1C1的通常写法是:
R13C7:R13C10,R15C7:R15C10,R17C7:R17C10 其中的逗号表示联合运算
可以引入交叉运算符,简化为:
R13 C7:C10,R15 C7:C10,R17 C7:C10
此时,因为三个以逗号分隔的联合区域中,每个区域都与C7:C10有交叉部分,来做一个类似于合并同类项的变形,可以简化为:
(R13,R15,R17) C7:C10
将几个行号用逗号相连接表示联合运算,同时外面用括号包围以后,再与C7:C10区域使用空格进行连接,形成交叉运算关系,得到了我们所需要的三个行区域的同时引用。
类似的,使用A1引用样式也可以进行合并变形,上述区域的A1引用写法为:(13:13,15:15,17:17) G:J上面三个区域是水平方向平行的三行,下面来看一下垂直方向平行的三列,实质用法完全一致:L13:L20、O13:O20、P13:P20
R1C1形式:
R13C12:R20C12,R13C14:R20C14,R13C16:R20C16
引入交叉运算符,简化为:
R13:R20 C12,R13:R20 C14,R13:R20 C16
合并同类项,简化为:
R13:R20 (C12,C14,C16)A1引用样式为:(L:L,N:N,P:P) 13:20
地址引用的应用场合:
对于A1样式的地址引用,可以直接使用在公式中,例如:=SUM((13:13,15:15,17:17) G:J)
即表示同时对G13:J13、G15:J15、G17:J17三个区域进行求和。
对于R1C1引用样式,则通常用于INDIRECT函数的引用,对于INDIRECT参数中包含变量的情况,使用简写+变量参数的方式可以减少大量公式开销。具体案例待以后补充。
而对于使用INDIRECT+TEXT函数构造引用样式来进行地址引用的场合,也可以用的R1C1引用样式及其简写方式,但其中既包含联合又包含交叉的复杂情况不太多见。简单举个例子说明一下应用:
要对G:I三列中的某三个非相邻行进行引用,公式取得三个行号分别为aa、bb、cc,加权组合后可以得到aa0bb0cc一个8位数值,此时使用=TEXT(aa0bb0cc,"(R0R000R00,0) C7!:C9")
就可以得到“(Raa,Rbb,Rcc) C7:C9”的INDIRECT引用参数。其中的TEXT函数格式代码中利用了千分位符来产生表示联合引用的逗号。
除了INDIRECT函数,HYPERLINK函数中也可以用到A1样式和R1C1样式的引用地址,例如
=HYPERLINK("#r13:r20 (c12,c14,c16)","链接")
即可产生同时链接到L13:L20、O13:O20、P13:P20三个区域的超级链接。本帖附件中也使用了HYPERLINK函数便于大家识别所引用的具体区域范围。为了便于理解,可以结合下面这个附件,相信可以更容易明白一些:
微盘下载:http://vdisk.weibo.com/s/3Vl0w
本地下载:单元格引用 (1752)
-
Datedif函数全面解析及BUG分析
以前发在EHblog的老博文,现在关闭了,准备陆陆续续搬迁一点过来。时间久了,有些文章也不一定保值了。
DATEDIF函数是一个隐藏的日期函数,继承于Lotus 1-2-3。这个函数用于计算两个时间点之间的间隔,并且可以以“日”、“月”、“年”为单位计算间隔数。一般来说,用这个函数会比直接使用日期运算来的简单,但是这个函数并不是那么可靠,偶尔会犯点小毛病。所以就我本人来说,一般情况下都会用其他方式来替代实现它的功能。阅读本篇博文需要一定的函数公式理解能力,初学者慎入。
———————————————以下原文发表于2009-7-27———————————————
从不同的角度来看,DATEDIF函数都是一个比较特殊的函数:
1)在多个Excel版本中,Datedif函数都是隐藏函数,没有出现在函数列表中,Excel2007中的公式自动完成功能也不会自动生成这个函数名称,甚至在多个版本中的帮助文件中都找不到这个函数的踪影。
2)在多个版本中,Datedif函数的算法发生了改变,据我目前所知,Excel2003 SP3、Excel2007 SP1、Excel2007 SP2 以及还未正式上市的Excel 2010中,这个函数的运算结果都有所不同。更早期的版本尚无研究。
3)工作表函数Datedif与VBA中的函数Datediff也不相同。
本文将主要以Excel 2007 SP2版本中的Datedif函数运算作为研究对象,并附上Excel 2003 SP3的相应结果作为参考。请使用正确的版本打开附件,否则将会出现不同的运算结果。Excel早期版本的帮助文件中,对Datedif函数的解释如下:
DATEDIF(start_date,end_date,unit)
参数start_date代表时间段内的第一个日期或起始日期。参数end_date代表时间段内的最后一个日期或结束日期。参数unit为所需信息的返回时间单位代码。各代码对应的含义如下:
"Y"——时间段中的整年数。
"M"——时间段中的整月数。
"D"——时间段中的天数。
"MD"——start_date与end_date日期中天数的差。忽略日期中的月和年。
"YM"——start_date与end_date日期中月数的差。忽略日期中的日和年。
"YD"——start_date与end_date日期中天数的差。忽略日期中的年。这6个unit参数看上去极其简单,无非就是年月日的差值运算,但其实里面包含了许多玄机,下面将针对这6种unit代码分别进行详解:
以下假定start_date存放于A2单元格内,end_date存放于B2单元格内。1,=Datedif(A2,B2,"Y")
此参数含义为返回时间段内的整年数,
1)所谓“整年”的判断包含了两个日期值(m-d)的大小判断,假定A2与B2相差一年,如果B2的日期值小于A2的日期值,则不满一整年;如果B2的日期值大于等于A2的日期值,则可以记为一整年。
2)对于包含闰年的情况,不影响日期值大小的判断,例如A2为闰年的2月29日,则B2为闰年的2月29日及以后或非闰年的3月1日及以后都可以判断为大于等于A2日期。综合以上算法解释,这个参数的算法可以表示为以下的公式:
=YEAR(B2)-YEAR(A2)-1+(DATE(YEAR(B2),MONTH(A2),DAY(A2))<=B2)
或
=YEAR(B2)-YEAR(A2)-1+(A2<=DATE(YEAR(A2),MONTH(B2),DAY(B2)))2,=Datedif(A2,B2,"M")
此参数含义为返回时间段内的整月数,
要判断整月数,也是与A2、B2的所在月份及日期相关。
此参数的算法为:将B2、A2相减得到的天数记为Days1,从A2开始到B2的前一个月的所有月份的天数和值记为Days2,如果Days1大于等于Days2,则满足最后一个月的整月条件,否则则不足最后一个月的整月。
换言之,使用此参数时,首先计算前后日期之间的差值,然后以起始月到(中止月-1)之间的整月天数作为计算“整月”的依据,差值大于或等于整月天数的,函数结果就是(中止月-起始月);如果差值小于整月天数,函数结果就是(中止月-起始月-1)。综合以上算法解释,这个参数的算法可以表示为以下的公式:
=(YEAR(B2)-YEAR(A2))*12+MONTH(B2)-MONTH(A2)-(B2-A2<(TEXT(B2,"yyyy-m-1")-TEXT(A2,"yyyy-m-1")))*1关于此参数算法的讨论,可参考以前的一个老帖:http://club.excelhome.net/viewthread.php?tid=165589
3,=Datedif(A2,B2,"D")
此参数含义为返回时间段内的天数,
这个参数算法最简单,实质就是两个Date相减得到的天数差,其算法可以表示为以下的公式:
=B2-A24,=Datedif(A2,B2,"MD")
此参数含义为返回时间段内的天数,忽略月和年。
虽然说“忽略”月和年,但实际上当B2的day小于A2的day时,两者的日期差为负数,需要借位相减才能得到正数。如何借位,向谁借位就涉及到了两个日期的所在月份及其年份。
此参数算法包含以下几部分:
1)当B2的day大于等于A2的day时,可直接将两者的day相减得到结果。
例如A2为2003年3月4日,B2为2004年1月9日,其中的B2的day为9,A2的day为4,则函数结果为9-4=5。
2)当B2的day小于A2的day时,以B2所在日期作为基准,将B2减去Date(B2所在年份、B2的前一个月份、A2的day)所得到的差值为结果。
例如A2为2003年3月4日,B2为2004年2月3日,则将B2减去2004年1月4日的天数差作为函数结果。假如B2的月份为1月,则其前一个月份为前一年的12月。
3)此参数在Excel 2007 SP2版本中包含bug,当满足上面第二个条件且B2日期为闰年的1月份日期时,函数结果会偏大164。这个bug在Excel2003 SP3版本中不存在,但在目前尚未发布的Excel 2010中仍有这个问题存在,只不过那个版本中的差值为113。这个莫名其妙的数值如何出现的,目前暂时没搞清楚。
4)此参数包含的另一个问题可能不能算bug,但在各个版本中都存在,由于第二条算法的原因,当A2的day为29、30、31且B2的月份为3月份时,由于B2的前一个月份即2月份中没有29号、30号、31号,Date(B2所在年份、B2的前一个月份、A2的day)会由Excel自动将这样的date转换为3月1日、3月2日、3月3日,由此产生误差会出现0和负数。对于这样一个计算两个日期差的函数来说,出现负数好像有点不太合理。
例如,A2日期为2003年5月31日,B2日期为2005年3月1日,date(2005,2,31)=2005年3月3日,因此B2与此日期相减得到结果为-2。
基于第4点的问题,个人认为有以下两种算法可能会更合理一些:
I)当day(B2)<day(A2)时,将B2与其当月1日相减+A2的月末与A2相减+1,用公式来表达就是:
=IF(DAY(B2)-DAY(A2)>=0,DAY(B2)-DAY(A2),B2-TEXT(B2,"yyyy-m-1")+DATE(YEAR(A2),MONTH(A2)+1,1)-A2)
II)当day(B2)<day(A2)时,将B2与Date(B2所在年份、B2的前一个月份、A2的day)相减,当差值小于零时取零作为结果。用公式来表达就是:
=IF(DAY(B2)-DAY(A2)>=0,DAY(B2)-DAY(A2),MAX(B2-DATE(YEAR(B2),MONTH(B2)-1,DAY(A2)),0))
当然,这两种方法只是本人的建议,仅供参考。综合以上算法解释,这个参数在不够减的时候借位是以B2为基准的,这个参数的算法可以表示为以下的公式:
=IF(DAY(B2)-DAY(A2)>=0,DAY(B2)-DAY(A2),B2-DATE(YEAR(B2),MONTH(B2)-1,DAY(A2))+164*(TEXT(DATE(YEAR(B2),MONTH(B2)+1,29),"m-d")="2-29"))其中包含下划线的部分是对上面第三点中提到的闰年bug的模拟。如果要排除闰年的错误,则可以使用下面的公式:
=IF(DAY(B2)-DAY(A2)>=0,DAY(B2)-DAY(A2),B2-DATE(YEAR(B2),MONTH(B2)-1,DAY(A2)))关于这个参数算法的讨论,还在这个帖子中进行过:http://club.excelhome.net/viewthread.php?tid=357741
5,=Datedif(A2,B2,"YM")
此参数含义为返回时间段内的整月数,忽略日和年。
这里提到了“忽略”日,但实际与参数“M”一样,还是有关日期的相关计算。这个参数的算法实际上与参数“M”的算法一致,只是忽略其中年份差中所包含的月份数。其算法可以表示为以下的公式,其中引用了Datedif函数的“M”参数方便公式编写:
=MOD(DATEDIF(A2,B2,"m"),12)6,=Datedif(A2,B2,"YD")
此参数含义为返回时间段内的天数,忽略其中的年。
这个参数的算法比较复杂,情况比较多,简单地说包括以下几个重点:
1)当B2月份为3月份且B2的day大于等于A2的day时,两者相减是以A2的所在年份为基准的(如果够减,则以[A2的年份&B2的日期]与A2相减;如果不够减,则以[A2年份+1&B2的日期]与A2相减)
2)当B2月份为3月份且B2的day小于A2的day时,两者相减是以B2的所在年份为基准的(如果够减,则以B2与[B2的年份&A2的日期]相减;如果不够减,则以B2与[B2年份-1&A2的日期]相减)
3)当B2的月份不是3月份时,两者相减是以A2的所在年份为基准的,相减方式同第一条。
4)当B2的day小于A2的day,且B2日期是闰年的1月份日期,且B2与A2日期不直接够减时,存在着与“MD”参数类似的闰年bug,函数结果偏大164。这个bug在Excel2003的SP3中不存在,但在Excel 2010中依旧存在,且差值变为113。综合以上算法解释,这个参数的算法可以表示为以下的公式(上面的文字不好理解,如果能看懂下面的公式则比较容易理解上述算法):
=IF(--(TEXT(B2,"!0!0-m-d"))>=--(TEXT(A2,"!0!0-m-d")),IF((DAY(B2)<DAY(A2))*(MONTH(B2)=3),B2-DATE(YEAR(B2),MONTH(A2),DAY(A2)),DATE(YEAR(A2),MONTH(B2),DAY(B2))-A2),IF((DAY(B2)<DAY(A2))*(MONTH(B2)=3),B2-DATE(YEAR(B2)-1,MONTH(A2),DAY(A2)),DATE(YEAR(A2)+1,MONTH(B2),DAY(B2))-A2+164*(TEXT(DATE(YEAR(B2),MONTH(B2)+1,29),"m-d")="2-29")*(DAY(B2)<DAY(A2))))
其中包含下划线的部分为闰年bug的模拟,如果希望排除闰年的错误,可以将这部分内容去除。
以上分析了6个参数详细算法含义,由于无法得到详细的内部运算代码,因此以上分析结论全部来源于Datedif函数公式的黑箱测试。
欢迎有兴趣的朋友继续测试和分析。以下提供附件(注意使用相应版本的Excel打开附件):附件1:Excel2007版(请用Excel 2007 SP2版本打开)
微盘下载:http://vdisk.weibo.com/s/3Vh1l
本地下载:Datedif函数测试2007版 (1720)
附件2:Excel2003版,2003版中不含闰年bug,其余算法与2007类似(请用Excel 2003 SP3版本打开)微盘下载:http://vdisk.weibo.com/s/3Vh6m
-
你也许未曾见过这样的TEXT函数用法
以前发在EHblog的老博文,现在关闭了,准备陆陆续续搬迁一点过来。时间久了,有些文章也不一定保值了。
TEXT函数是一个通过自定义的文本格式,将数值或文本转换成另一个格式文本的函数。类似于编程语言中的Format函数。在微软的帮助中,有关TEXT函数的使用十分简单,它的主要格式代码基本与“自定义格式”中的代码无异。而我是第一个发现它能够在格式代码中结合变量来使用的人,因此就有了下面这篇博文。在这之后,TEXT函数的用途被大大扩展,成为最活跃的函数之一。
———————————————以下原文发表于2008-6-20———————————————
不少朋友都会使用Text函数,它的用法在很多人看来就是自定义单元格格式的函数版。结合不同的格式代码及条件,可以让对象显示不同的格式效果。然而在我看来,Text函数的作用远不止如此,与自定义单元格格式的代码和功能相比,Text函数可以做的更多、走的更远。Text函数是Excel在字符处理函数中少有的几个具有丰富想像力的Excel函数之一。在某些情况下,Text函数还可以替换if函数、替代Choose函数,还可以生成内存数组。
下面就跟随几个简单的例子,来看看Text函数究竟还能为我们做些什么。
详情请见附件
附件下载:
-
MMULT函数经典用法
以前发在EHblog的老博文,现在关闭了,准备陆陆续续搬迁一点过来。时间久了,有些文章也不一定保值了。
MMULT函数原是一个用于矩阵乘积运算的数学函数,相当专业,一般人不会去碰。但在Excel的实际应用中,我们很多时候会把它拿来作为条件统计公式的一部分。阅读本篇博文需要一定的函数公式理解能力,初学者慎入。
———————————————以下原文发表于2008-6-14———————————————
Countif、Sumif、Subtotal等函数都是运用于条件求和、条件计数等统计需求的常用函数,但这些函数都要求其第一参数为单元格区域的直接引用。当问题比较复杂、统计条件比较多的情况下,有些时候就无法直接使用这些函数进行条件统计,而使用Mmult函数可以很好地替代这些函数,在复杂条件下的数组统计上进行运用。
应该说,Mmult函数是数组条件统计的一大利器,用好Mmult函数可以简化许多复杂问题的公式解决方案。
论坛上之前也有一些针对Mmult函数的介绍和讲解专帖,本帖中不再对Mmult的原理进行过多的介绍,而是着重结合具体问题如何使用Mmult函数进行一些详细的分解。
下面的这个附件以一些简化的案例模型来针对Mmult的不同使用方法进行了一些探讨,同时也引用了一些论坛上已有的具体案例,希望可以给大家提供一些参考意见,同时也欢迎大家参与讨论。
详情请见附件
附件下载:
本地下载:Mmult经典用法讨论 (1780) -
年终奖个税的公式算法
-
#微函数系列#之VLOOKUP函数&HLOOKUP函数
VLOOKUP函数和HLOOKUP是一对非常著名的查询匹配函数。它们让Excel的数据匹配工作变得简单,同时也让许多的初级用户认识到了Excel函数公式的强大。许多人会把它们作为Excel的入门函数,不认识它们就好像不能算会用Excel一般。
这两个函数的功能与LOOKUP很相近,但用法相对更简单,应用场景也十分常见,因此是使用频度最高的函数之一。
VLOOKUP函数和HLOOKUP函数的区别在于组织查询匹配的方向有所不同,V代表了Vertical表示纵向查询(在目标数据表的首列中从上往下依次查询);H代表了Horizontal表示横向查询(在目标数据表的首行从左向右依次查询)。
函数的第二参数(目标数据表)可以是数组也可以是单元格区域引用,由于函数只在其首列或首行进行查询,因此在构造这个参数时,必须把查找的目标数据选定在此数据表的首行或首列位置。
与此同时,与LOOKUP的二维数组查询方式有所不同的是,Vlookup函数和HLOOKUP函数的返回值并不默认是目标数据表的最末列或最末行,而是需要通过第三参数来进行指定。第三参数的数值分别代表了数据表中的相对列序号和行序号。这样的方式意味着这两个函数的返回值必须位于匹配值的右侧(Vlookup)或下方(HLOOKUP),而没有LOOKUP函数在组建查询时那么自由。当然,也可以通过数组的方式改变这种默认情况,具体方法见下文。
这两个函数有精确匹配和近似匹配两种方式,通过第四参数的逻辑值设置来切换。
当第四参数的参数值为False时(False可以用数值0来替代),表示精确匹配,目标数据表中不需要排序,只有与查找值完全匹配时才能返回值,否则返回错误值;
当第四参数的参数值为True时(True可以用非0数值来替代),表示近似匹配,目标数据表中的首列或首行数据需要事先按升序排列(包括数值和文本),然后函数会依照LOOKUP函数的方式进行近似匹配查询,返回小于等于查询值的最大数据。因此,这种近似匹配的查询方式通常会由LOOKUP函数来取代。
这两个函数可以使用通配符进行模糊匹配,但是区分英文字母大小写,如果需要进行区分大小写的查询匹配,可以使用LOOKUP函数与Exact函数的嵌套组合来实现。
在实际使用中,这两个函数只能单方向查询的限制条件让许多问题的解决变得困难,但还是可以通过构造数组的方式来间接地解决这个问题,使Vlookup函数和HLOOKUP函数也能够反向进行匹配查询。
例如,假定查询目标的匹配值位于C列,而需要返回A列的对应值,可以这样书写公式:
=VLOOKUP(查找值,IF({1,0},C1:C10,A1:A10),2,0)
这个公式的关键部分在于第二参数使用IF({1,0},匹配数组,返回数组)的形式来构建了一个内存中的数据表,这个数据表包含了两列,左边这列就是C1:C10即匹配数组,右边这列就是A1:A10即返回数组。
有些人可能不太理解IF({1,0}的作用,打一个近似的比方,就好比书架上从左到右依次排列着数学课本、语文课本、英语课本、物理课本等等,现在希望将语文课本和物理课本单独拿出来放到另一个书架中,并且要求物理课本在语文课本的左边,就可以通过这样一个公式来实现:IF({1,0},物理课本,语文课本)。
与此类似的,如果要进行横向匹配查询,匹配值位于第5行而需要返回第3行的数据,可以这样构建公式:
=HLOOKUP(查找值,IF({1;0},A5:Z5,A3:Z3),2,0)
Vlookup函数和HLOOKUP函数的常见应用场景包括:
1,精确匹配查询。只返回第一条符合条件的数据。
2,包含通配符的模糊匹配查询。同样只返回第一条符合条件的数据。
3,类似LOOKUP函数的升序序列的近似匹配。例如分数段的划分,可以替代多个IF条件的嵌套。
4,通过构造第二参数的数据表,进行反向匹配查询。
点击查看大图
-
#微函数系列#之LOOKUP函数
LOOKUP函数是一个功能非常强大的查询函数,使用也非常广泛。从函数名称上可以看出它是VLOOKUP函数和HLOOKUP函数的近亲,同时它也具备MATCH函数的某些特征。它可以直接从查询目标中返回匹配的值或相近的值,还可以通过映射关系从另一组相对应的目标中返回数据。
LOOKUP函数包含向量和数组两种用法。
所谓向量用法指的是函数在目标向量(一维的数组或单元格引用)按顺序查找数据,找到匹配数据以后从返回向量中返回与其位置相对应的数据(目标向量和返回向量具有位置映射关系)。如果省略返回向量(第三参数),则直接从目标向量(第二参数)中返回匹配值。
需要注意的是,在一般的查询中,目标向量的数组或单元格引用中,数据需要事先按照升序排列,包括数值、文本和逻辑值。文本也有大小之分,排序依据是字符的内码,例如A<B<C。数值、逻辑值和文本之间的大小顺序是:数值<文本<False<True。
当LOOKUP的查询数据能在目标向量中找到完全匹配的数据时,直接返回该数据或与该数据相映射的数据。如果没有完全一致的数据,则返回其中小于等于查询数据的最大值。
例如
LOOKUP(3.5,{1,2,3,4,5})
的返回值为3。如果查询数据比目标向量中的最小值更小,函数就会返回错误值。
如果目标向量中的数据没有事先排序,也可以变换一种形式来构建LOOKUP公式进行精确匹配查询。例如要在{2,4,1,3,5}中查找3所对应的数据,可以这样构建公式:
=LOOKUP(1,0/({2,4,1,3,5}=3),返回向量)
其中
0/({2,4,1,3,5}=3)
的部分会返回一组由错误值和数值“0”所组成的数组,其中的“0”就对应着数组中匹配值“3”的所在位置。根据前述LOOKUP没有精确匹配时的查询规则,将返回小于等于查询目标“1”的最大值,因此这个公式将返回“0”所对应的数据。LOOKUP函数的第二种数组用法,指的是在一个二维的数组或单元格引用中查找匹配数据,查找的方向与这个二维数组的宽度和高度有关:如果高度大于等于宽度(纵向长方形),则Lookup函数会在其首列中进行查找,返回其最末列的对应值,类似于VLOOKUP函数的查询方式;如果高度小于宽度(横向长方形),则Lookup函数会在其首行中进行查找,返回其最末行的对应值,类似于HLOOKUP函数的查询方式。
Lookup函数在查询中不区分英文字母的大小写。
Lookup函数的常见应用场景包括:
1,精确匹配查询。
2,升序序列的近似查询。例如分数段的划分,可以替代多个IF条件的嵌套。
3,最末项的查询,通常用
Lookup(9E+307
来查询数值数据的最末项,或用Lookup("座"
来查询文本单字符的最末项。4,与MATCH函数组合,可以进行二维的组合查询。
点击查看大图