解释LOOKUP公式
我想了解一些传统的Excel文件( 它的工作原理 ,但我真的很想了解如何/为什么它的工作)。
有一张用于数据input( input sheet
)和一些代码被调用来处理input sheet
中的数据。 我发现input sheet
的行数是使用像这样的查找公式确定的:
=LOOKUP(2;1/('Input sheet'!E1:E52863<>"");ROW(A:A))
- “E”列包含导入项目的名称,而列未被sorting
- “A”栏不包含任何特殊的东西 – 我可以用B,C或任何栏来代替它,它不影响公式的结果
根据我所发现的有关查找行为: •If the LOOKUP function can not find an exact match, it chooses the largest value in the lookup_range that is less than or equal to the value.
这个^ -1操作到指定的范围是什么? 如果E(x)不为空 – >它应该变成1,但是如果它是空的,那么它将是1/0 – >应该产生#DIV/0!
错误…
1/('Input sheet'!E1:E52863<>"")
结果是一样的,如果我用任何正数代替2(好吧,只尝试一些,但看起来像是这样的话)。 如果我将查找值更改为0,则得到•If the value is smaller than all of the values in the lookup_range, then the LOOKUP function will return #N/A
/ A错误 – > •If the value is smaller than all of the values in the lookup_range, then the LOOKUP function will return #N/A
我卡住了…任何人都可以摆脱一些光?
LOOKUP
有难得的能力忽略错误。 每进行1/n
操作,每次n
为零时都会产生一个错误。 假和零一样。 所以,对于你的公式,每个空单元在这个计算中都会产生一个错误。 所有这些结果放在第二个参数的vector数组中。
search任何大于1
正值(第一个参数)将导致LOOKUPfind上述向量中的最后一个非错误值。
它也有可选的第三个参数,你可以在其中指定返回查找值的结果向量。 这与INDEX / MATCH组合的INDEX组件类似。
在公式的情况下,第三个参数是一个看起来像这样的数组:{1; 2; 3; 4; 5; 6; 7; 8; 9; … n}这里n是最后一行在现代版本的Excel中的工作表是1048576。
所以LOOKUP在第二个参数中返回对应于最后一个非错误(非空白单元格)的第三个参数中的向量的值。
请注意,这种确定最后一行的方法将忽略具有导致零长度string的公式的单元格。 这样的细胞看起来空白,但当然不是。 根据情况,这可能正是你想要的。 另一方面,如果你想findE列中最后一行有一个公式的行,即使它产生一个零长度的string,那么这将做到这一点:
=MATCH("";'Input sheet'!E:E;)
如果应用“评估公式”,您可能会了解公式在做什么(或任何其他公式)。 虽然原则是相同的3行或52863我build议限制范围,加快事情,如果select评估公式。 像往常一样试图解释公式,最好是从内部开始,向外发展。 这个:
'Input Sheet'!E1:E52863<>""
从Row1到Row52863的ColumnE中的每个条目返回一个结果数组。 由于它是一个比较( <>
不等于),所以结果是布尔 – 即TRUE(不为空)或FALSE(为空)。 所以如果只有E1到E52863的前一半被填充,结果是{TRUE;TRUE;TRUE
; …和很多很多TRUE;
…和FALSE
…以及更多;FALSE
,最后}
。
向外工作,下一步是将这个数组分成1
。 在算术运算中,布尔TRUE被视为1
,FALSE被视为0
,所以得到的数组是{1;1;1;
…还有很多1;
…和#DIV/0!
…还有很多;#DIV/0!
最后}
。
然后这成为LOOKUP寻找lookup_value的lookup_vector。 你显示的lookup_value是2
。 但数组包含1
或#DIV/0!
– 所以2
永远不会被发现。 正如你已经注意到的那样, 2
也可以是3
,或者45
或者123
只要不是数组中存在的值。
那(不存在)是必要的,因为LOOKUP在find匹配时停止search。 没有匹配的事实迫使它到了(有效的)可能性的末尾 – 即最后 1
。 在这一点上,在我看来,返回“未find”是合乎逻辑的,但是 – 我怀疑只是一个怪癖,尽pipe非常方便 – 它返回1
– 按列表中的索引号,即52863如果E1中的所有单元:E52863被填充。
虽然result_vector ( Row(A:A)
)对于LOOKUP是可选的,但在这种用法中,实际上需要修复索引的起始点(从Row1开始,因为整个列)。 您可能会改变这一点,说A3:A..
结果将是ColumnE加2( 3
– 1
)中最高的填充行号的数字。