Excel 查找公式最后一个求值步骤背后的逻辑,用于查找行中最后一个非空值。

Excel 查找公式最后一个求值步骤背后的逻辑,用于查找行中最后一个非空值。,excel,excel-formula,Excel,Excel Formula,我想从每一行获取最后一个非空单元格,以便进一步操作。搜索网我遇到了一个查找公式,可以很好地完成这项工作。我在行中有字母和数字数据。 样本数据如下所示 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中使用了下面的公式,它给出了正确的结果,即

我想从每一行获取最后一个非空单元格,以便进一步操作。搜索网我遇到了一个查找公式,可以很好地完成这项工作。我在行中有字母和数字数据。 样本数据如下所示

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)
=查找(2,1/(A4:K4“”),A4:K4)
查找(2,{1,1,1,1,1,1,1,1,1,#DIV/0!,1},A4:K4) 在此步骤之后,第4行的最后一个非空值即为3 有人能解释一下这一行是如何逐步转化为结果的吗


基本上以下面的公式为例

=LOOKUP(2,1/(A1:D1<>""),A1:D1)
公式将按如下方式填充

=LOOKUP(2,{1,1,1,#DIV/0!},{1,2,3,0})
其工作方式非常简单

1/(A1:D1“”)创建一个由1和#DIV\0组成的数组


然后,查找公式在此数组中查找2,但它无法找到,但它将始终返回填充有1和#DIV/0!的数组上下文中最后一个非错误值的位置!,这将是数组中的第三个位置,然后查找公式返回公式A1:D1中最后一个参数数组的第三个位置,即3,基本上以下面的公式为例

=LOOKUP(2,1/(A1:D1<>""),A1:D1)
公式将按如下方式填充

=LOOKUP(2,{1,1,1,#DIV/0!},{1,2,3,0})
其工作方式非常简单

1/(A1:D1“”)创建一个由1和#DIV\0组成的数组


然后,查找公式在此数组中查找2,但它无法找到,但它将始终返回填充有1和#DIV/0!的数组上下文中最后一个非错误值的位置!,这将是数组中的第三个位置,查找公式然后返回公式A1:D1中最后一个参数数组的第三个位置,即3。这种查找最后一个填充单元格的方法使用向量形式。在

=LOOKUP(2,{1,1,1,1,1,1,1,1,#DIV/0!,1},A4:K4)
2是查找值,数组
{1,1,1,1,1,1,1,#DIV/0!,1}
是查找向量,
A4:K4
是结果向量

查找的向量形式在查找向量中查找查找值,并从结果向量中的相同位置返回值

如果LOOKUP函数无法直接在LOOKUP_向量中找到LOOKUP_值,则该函数将匹配LOOKUP_向量中小于或等于LOOKUP_值的最大值。如果数组中有多个相等的值,其中最大的值小于或等于lookup_值,则取最后一个值的位置。在这种情况下,它匹配最后一个
1
,因为这是查找向量中小于或等于
2
的最大值


但要做到这一点,有一条规则,即lookup_vector中的值必须按升序排列。这是这种方法没有记录的特性。它就像
#DIV/0查找向量中的错误与该规则不矛盾。但是,由于源代码是不开放的,我们不能绝对肯定这一点。但是这种方法经常被成功地使用,因此我们可以非常肯定。

这种寻找最后一个填充细胞的方法使用向量形式。在

=LOOKUP(2,{1,1,1,1,1,1,1,1,#DIV/0!,1},A4:K4)
2
是查找值,数组
{1,1,1,1,1,1,1,#DIV/0!,1}
是查找向量,
A4:K4
是结果向量

查找的向量形式在查找向量中查找查找值,并从结果向量中的相同位置返回值

如果LOOKUP函数无法直接在LOOKUP_向量中找到LOOKUP_值,则该函数将匹配LOOKUP_向量中小于或等于LOOKUP_值的最大值。如果数组中有多个相等的值,其中最大的值小于或等于lookup_值,则取最后一个值的位置。在这种情况下,它匹配最后一个
1
,因为这是查找向量中小于或等于
2
的最大值


但要做到这一点,有一条规则,即lookup_vector中的值必须按升序排列。这是这种方法没有记录的特性。它就像
#DIV/0查找向量中的错误与该规则不矛盾。但是,由于源代码是不开放的,我们不能绝对肯定这一点。但是这种方法经常被成功地使用,因此我们可以非常确定。

“但它总是返回最后一个非错误值”:不,不是如文档所示。请提供记录此规则的链接。在填充了1和#DIV/0的数组上下文中!让我们承认它的文档写得很糟糕。“如果LOOKUP函数找不到LOOKUP_值,则该函数将匹配LOOKUP_向量中小于或等于LOOKUP_值的最大值。”但如果数组中有多个相同的值,则返回最后一个值的位置。这不是点。关键是,
{1,1,#DIV/0!、1,#DIV/0!、1,#DIV/0!、#DIV/0!}
似乎被接受为一个按升序排列的数组,其中最后一个
1
是小于或等于
2
的最大值。这是没有记载的。我的观点是,它没有在数组中找到最大的值,当它找不到匹配项时,它在数组中找到最后一个值,=查找(4,{3,2,1,0},{3,2,1,0}),因此为什么它返回0,很容易说它需要排序,但是排序只是把最大的放在最后,而实际上它实际上只是找到最后一个!“但它将始终返回最后一个非错误值”:否,并非如文档所示。请