解释LOOKUP公式

我想了解一些传统的Excel文件( 它的工作原理 ,但我真的很想了解如何/为什么它的工作)。

有一张用于数据input( input sheet )和一些代码被调用来处理input sheet中的数据。 我发现input sheet的行数是使用像这样的查找公式确定的:

=LOOKUP(2;1/('Input sheet'!E1:E52863<>"");ROW(A:A))

  1. “E”列包含导入项目的名称,而列未被sorting
  2. “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_value2 。 但数组包含1#DIV/0! – 所以2永远不会被发现。 正如你已经注意到的那样, 2也可以是3 ,或者45或者123只要不是数组中存在的值。

那(不存在)是必要的,因为LOOKUP在find匹配时停止search。 没有匹配的事实迫使它到了(有效的)可能性的末尾 – 即最后 1 。 在这一点上,在我看来,返回“未find”是合乎逻辑的,但是 – 我怀疑只是一个怪癖,尽pipe非常方便 – 它返回1 – 按列表中的索引号,即52863如果E1中的所有单元:E52863被填充。

虽然result_vectorRow(A:A) )对于LOOKUP是可选的,但在这种用法中,实际上需要修复索引的起始点(从Row1开始,因为整个列)。 您可能会改变这一点,说A3:A..结果将是ColumnE加2( 31 )中最高的填充行号的数字。