我试图理解一些遗留的Excel文件(它的工作原理,但我真的很想了解它是如何工作的)。
有一个数据输入表(input sheet
)和一些被调用来处理input sheet
中数据的代码。我发现input sheet
中的行数是使用如下的查找公式确定的:
=LOOKUP(2;1/('Input sheet'!E1:E52863<>"");ROW(A:A))
根据我发现的Lookup行为:•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 - &gt;应该产生#DIV/0!
错误......
1/('Input sheet'!E1:E52863<>"")
结果是一样的,如果我用任何正数替换2(好的,只试过一些,但看起来就是这种情况)。如果我将查找值更改为0,那么我会得到#N / A错误 - &gt; •If the value is smaller than all of the values in the lookup_range, then the LOOKUP function will return #N/A
我被困了......任何人都可以解释一下吗?
答案 0 :(得分:4)
LOOKUP
具有忽略错误的罕见能力。每次1/n
为零时,执行n
操作都会产生错误。假与零相同。因此,对于您的公式,每个空单元格在此计算中都会产生错误。所有这些结果都放在第二个参数的矢量数组中。
搜索大于1
的任何正值(第一个参数)将导致LOOKUP在上面的向量中找到最后一个非错误值。
它还有一个很好的可选第三个参数,你可以在其中指定返回查找值的结果向量。这类似于INDEX / MATCH组合的INDEX组件。
对于公式,第三个参数是一个如下所示的数组:{1; 2; 3; 4; 5; 6; 7; 8; 9; ... n}其中n是最后一个工作表的行号,在现代版本的Excel中为1048576。
因此LOOKUP返回第三个参数中向量的值,该值对应于第二个参数中的最后一个非错误(非空白单元格)。
请注意,这种确定最后一行的方法将忽略具有导致零长度字符串的公式的单元格。这样的细胞看起来是空白的,但当然不是。根据具体情况,这可能正是您想要的。另一方面,如果你想在E列中找到包含公式的最后一行,即使它导致零长度字符串,那么这样做:
=MATCH("";'Input sheet'!E:E;)
答案 1 :(得分:2)
如果应用评估公式,您可能会了解公式正在做什么(或任何其他公式)。虽然原则是相同的,无论是3行还是52863我建议限制范围,但如果选择评估公式可以加快速度。像往常一样尝试解释公式,最好从内部开始向外工作。这个:
'Input Sheet'!E1:E52863<>""
返回一个数组,其中包含ColumnE中从Row1到Row52863的每个条目的结果。由于它是比较(<>
不相等),结果是布尔值 - 即TRUE(非空)或FALSE(为空)。因此,如果仅填充E1到E52863的前半部分,则结果为{TRUE;TRUE;TRUE
; ......还有很多TRUE;
...和FALSE
......还有很多;FALSE
,最后是}
。
向外工作,下一步是将此数组划分为1
。在算术运算中,布尔值TRUE被视为1
,FALSE被视为0
,因此结果数组为{1;1;1;
...而且多了1;
...和{{ 1}} ...还有很多#DIV/0!
,最后是;#DIV/0!
。
然后成为 lookup_vector ,其中LOOKUP寻找lookup_value。您显示的 lookup_value 是}
。但该数组包含2
或1
- 因此永远不会在其中找到#DIV/0!
。正如您所注意到的那样,2
也可以是2
,或3
或45
- 任何内容,只要数组中没有值。
那是(不存在)是必要的,因为LOOKUP在找到匹配时停止搜索。没有匹配的事实迫使它到达(有效)可能性的末尾 - 即 last 123
。在这一点上,在我看来,回归&#34;未找到&#34;是合乎逻辑的。但是 - 我怀疑只是一个怪癖,虽然很方便 - 它返回1
- 列表中的索引号,即52863,如果E1中填充了所有单元格:E52863。
虽然 result_vector (1
)对于LOOKUP是可选的,但在此用法中需要修复索引的起点(实际上是Row1,因为整个列)。您可以将其更改为Row(A:A)
,结果将是ColumnE加上2(A3:A..
- 3
)中填充最多的行数。