大数跨境

scan和xlookup为何返回错误值

scan和xlookup为何返回错误值 浅谈出口账务和excel函数
2026-10-04
9

不是的。第二次循环结束后,累加器 x 的值不是 {1, 2}。

这是一个非常容易产生误解的地方。为了彻底理清,我们需要严格区分“累加器 x 的值”和“最终输出的结果”。这取决于你使用的是 SCAN 还是 REDUCE。

我们分两种情况来详细拆解:

情况一:使用图片中的 SCAN 公式

公式:=SCAN("", A2:A4, LAMBDA(x, y, XLOOKUP(y, B2:B8, C2:D8, "")))

在 SCAN 函数中,x 代表的是上一次循环产生的结果。

1. 第一次循环:y = a1。
   · XLOOKUP 返回 {1, 8}。
   · 此时,累加器 x 的值就是 {1, 8}(一个包含两个元素的水平数组)。
2. 第二次循环:y = a2。
   · 传入 LAMBDA 的 x 是上一步的结果,即 {1, 8}。
   · XLOOKUP 返回 {2, 9}。
   · 在这一步的运算过程中,累加器 x 依然是 {1, 8},它并没有变成 {1, 2}。它只是被当作一个参数传进去,用来进行下一步计算(在这里,x 甚至没有被用到,因为公式里没有 VSTACK(x, ...))。
   · 这一步运算的返回值是 {2, 9}。
3. 第三次循环:y = a3。
   · 传入 LAMBDA 的 x 变成了上一步的返回值 {2, 9}。
   · 这一步返回 {5, 12}。

那 {1, 2, 5} 是怎么来的?
{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 代表的是不断累积变大的那个最终容器。情况就完全不同了:

1. 第一次循环:y = a1。
   · XLOOKUP 返回 {1, 8}。
   · VSTACK("", {1, 8}) 的结果是 {1, 8}。
   · 此时,累加器 x 变成了 {1, 8}。
2. 第二次循环:y = a2。
   · 传入的 x 是 {1, 8}。
   · XLOOKUP 返回 {2, 9}。
   · VSTACK(x, {2, 9}) 会把新旧数据堆叠起来。
   · 此时,累加器 x 变成了一个两行两列的数组 {1, 8; 2, 9}。
3. 第三次循环:y = a3。
   · 传入的 x 是 {1, 8; 2, 9}。
   · 堆叠后,累加器 x 最终变成了三行两列的数组 {1, 8; 2, 9; 5, 12}。

总结

· 在您当前使用的 SCAN 公式中,第二次循环时,传入的累加器 x 是 {1, 8},而不是 {1, 2}。
· 最终看到的 1, 2, 5 是 SCAN 函数把每一步算出的多列结果“砍掉第二列”后,收集起来的最终输出,而不是 x 在运算过程中的中间形态。

【声明】内容源于网络
0
0
浅谈出口账务和excel函数
1234
内容 1570
粉丝 0
浅谈出口账务和excel函数 1234
总阅读29.3k
粉丝0
内容1.6k