|
雨沫懿馨 发表于 2014-8-3 00:03
能解释下这个函数吗?我看不懂!
=VLOOKUP(C29,INDIRECT(TEXT(SMALL(IF(X$39:Y$120=C29,ROW(X$39:Y$120)*100+COLUMN(X$39:Y$120)),COUNTIF(C$28:C28,C29)+1),"R0C00")&":R120C26",),27-MOD(SMALL(IF(X$39:Y$120=C29,ROW(X$39:Y$120)*100+COLUMN(X$39:Y$120)),COUNTIF(C$28:C28,C29)+1),100),)
外层不说了,结构吗,先说第二参数
INDIRECT(TEXT(SMALL(IF(X$39:Y$120=C29,ROW(X$39:Y$120)*100+COLUMN(X$39:Y$120)),COUNTIF(C$28:C28,C29)+1),"R0C00")&":R120C26",)就是间接引用,
R120C26是R1C1样式,就是120行,26列,其实就是Z120,数据区域的最后一个
TEXT(SMALL(IF(X$39:Y$120=C29,ROW(X$39:Y$120)*100+COLUMN(X$39:Y$120)),COUNTIF(C$28:C28,C29)+1),"R0C00")这部分也是调试成R1C1样式,
SMALL(IF(X$39:Y$120=C29,ROW(X$39:Y$120)*100+COLUMN(X$39:Y$120)),COUNTIF(C$28:C28,C29)+1)就是要找到这个单元格需要引用区域的起点,问题是你需要查找数据所在的区域是两列(X或Y),有些麻烦,IF(X$39:Y$120=C29,ROW(X$39:Y$120)*100+COLUMN(X$39:Y$120))这个意思就是把c29所在的单元格范围的行号与列标合起来,比如3956就是39行56列,这里面可能有好几个数呢(x或y里等于C29的会有好多个)。small的第二参数是这个的关键,COUNTIF(C$28:C28,C29)+1的意思就是说countif部分是说在c29上面的数()里面(C29是第一个)包含几个C29,比如前面有1个C29的值了,这次就从第二个等于C29的位置开始引用,依次类推。比如说这次的结果是5824,那么就是58行24列开始了(换成普通写法就是X58)
small转换格式(text)后就成R58C24了,
这样的话INDIRECT(TEXT(SMALL(IF(X$39:Y$120=C29,ROW(X$39:Y$120)*100+COLUMN(X$39:Y$120)),COUNTIF(C$28:C28,C29)+1),"R0C00")&":R120C26",)的部分意思就是从开始的单元格(small部分)到(用冒号连起来,比如A1:B4)最后一个数据所在区域(Z120,R120C26),注意INDIRECT用R1C1样式的时候为indirect(R1C1样式,),这样就完成了引用区域(从满足条件的第一个到最后一个单元格区域)
下面说第三参数,27-MOD(SMALL(IF(X$39:Y$120=C29,ROW(X$39:Y$120)*100+COLUMN(X$39:Y$120)),COUNTIF(C$28:C28,C29)+1),100)
这样写是因为第二参数的结果可能是两列或3列,但需要引用的数据在最后一列,不知第二列还是第三列呀,作一判断
small部分的意思前面说过,不再多说,就是满足条件的单元格所在行数列数(比如2735为27行35列)列数在后面,这样的话用mod就可以取出来了(后俩位就取对100的余数),然后该区域最后一列(26)-开始的列数(比如说24)再加1就是最后一列所在引用区域的位置(比如,总共3列,最后一列就是3列,依次类推)
其余的就不再说了吧
言语笨拙,还请见谅
|
评分
-
查看全部评分
|