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