在LOOKUP公式的最后一个评估步骤之后的逻辑,在一行中查找最后的非空值。

我想从每一行中获得最后一个非空的单元格以进一步操作。 search网我碰到一个LOOKUP公式,可以做这个工作很好。 我有alpha和数字数据在行中。 示例数据如下所示。

ID1 ID2 ID3 ID4 ID5 ID6 ID7 ID8 ID9 ID10 ID11 a1 a2 a3 a4 a5 23 24 25 25 23 NN 67 99 200001 ss p1 23 rq 3 

我在L4中使用下面的公式给出正确的结果,在L4中是3。 第2行的类似公式给出L2中的结果25。 为了理解公式,我进行了公式评估,但是我没有得到最后一步的逻辑,因为它是如何转化为最终结果的。

 =LOOKUP(2,1/(A4:K4<>""),A4:K4) 

LOOKUP(2,{1,1,1,1,1,1,1,1,1,#DIV / 0!,1},A4:K4)在这个步骤之后,结果是行4的最后一个非空值来,即3有人可以解释这条线是如何最终转化为一步一步的结果。

快照

这种find最后填充的单元格的方法使用了LOOKUP的vectorforms。 在

=LOOKUP(2,{1,1,1,1,1,1,1,1,1,#DIV/0!,1},A4:K4) 2是lookup_value,数组{1,1,1,1,1,1,1,1,1,#DIV/0!,1}是lookup_vector, A4:K4是result_vector。

LOOKUP的向量forms在lookup_value中查找lookup_vector,并从result_vector中的相同位置返回值。

如果LOOKUP函数直接在lookup_vector中找不到lookup_value,则该函数将匹配lookup_vector中小于或等于lookup_value的最大值。 如果数组中有多个相等的值,其中最大值小于或等于lookup_value,则取最后一个值的位置。 在这种情况下,它与最后一个匹配,因为这是lookup_vector中小于或等于2最大值。

但是为了做到这一点,有一个规则,lookup_vector中的值必须按照升序排列。 这是这种方法没有logging的function。 它接缝就好像#DIV/0! lookup_vector中的错误不违反该规则。 但由于来源不公开,我们不能绝对确定这一点。 但这种方法经常使用,我们可以肯定。

基本上以下面的公式为例

 =LOOKUP(2,1/(A1:D1<>""),A1:D1) 

数据在A1:D1

 A1 B1 C1 D1 1 2 3 

公式将填充如下

 =LOOKUP(2,{1,1,1,#DIV/0!},{1,2,3,0}) 

这个工作方式非常简单。

1 /(A1:D1 <>“”)创build一个1和#DIV \ 0的数组!

  1 where the cell is not blank #DIV/0 where the cell is blank 

然后查找公式在这个数组中find一个2,它不能find,但是它将总是返回最后一个NON ERROR值的位置,在1和#DIV / 0!的数组的上下文中,这将是在数组中的第三个位置,LOOKUP公式然后返回公式A1中的最后一个参数数组的第三个位置:D1,它是3