scan和xlookup为何返回错误值
浅谈出口账务和excel函数
不是的。第二次循环结束后,累加器 x 的值不是 {1, 2}。
这是一个非常容易产生误解的地方。为了彻底理清,我们需要严格区分“累加器 x 的值”和“最终输出的结果”。这取决于你使用的是 SCAN 还是 REDUCE。
公式:=SCAN("", A2:A4, LAMBDA(x, y, XLOOKUP(y, B2:B8, C2:D8, "")))
在 SCAN 函数中,x 代表的是上一次循环产生的结果。
· 此时,累加器 x 的值就是 {1, 8}(一个包含两个元素的水平数组)。
· 传入 LAMBDA 的 x 是上一步的结果,即 {1, 8}。
· 在这一步的运算过程中,累加器 x 依然是 {1, 8},它并没有变成 {1, 2}。它只是被当作一个参数传进去,用来进行下一步计算(在这里,x 甚至没有被用到,因为公式里没有 VSTACK(x, ...))。
· 传入 LAMBDA 的 x 变成了上一步的返回值 {2, 9}。
{1, 2, 5} 不是累加器 x 在循环过程中的值,而是 SCAN 函数最终收集并输出的结果数组。
SCAN 会像一个记录员,把每次 LAMBDA 计算产生的结果都记下来:
· 记录第一次的结果:{1, 8} -> 提取第一列 -> 1
· 记录第二次的结果:{2, 9} -> 提取第一列 -> 2
· 记录第三次的结果:{5, 12} -> 提取第一列 -> 5
最后把这三次记录垂直拼起来,输出了 {1; 2; 5}。
情况二:如果使用之前加了 VSTACK 的 REDUCE 公式
公式:=REDUCE("", A2:A4, LAMBDA(x, y, VSTACK(x, XLOOKUP(y, B2:B8, C2:D8, ""))))
在 REDUCE 函数中,x 代表的是不断累积变大的那个最终容器。情况就完全不同了:
· VSTACK("", {1, 8}) 的结果是 {1, 8}。
· VSTACK(x, {2, 9}) 会把新旧数据堆叠起来。
· 此时,累加器 x 变成了一个两行两列的数组 {1, 8; 2, 9}。
· 堆叠后,累加器 x 最终变成了三行两列的数组 {1, 8; 2, 9; 5, 12}。
· 在您当前使用的 SCAN 公式中,第二次循环时,传入的累加器 x 是 {1, 8},而不是 {1, 2}。
· 最终看到的 1, 2, 5 是 SCAN 函数把每一步算出的多列结果“砍掉第二列”后,收集起来的最终输出,而不是 x 在运算过程中的中间形态。