大数跨境

makearray或reduce+vstack如何自定义形状

makearray或reduce+vstack如何自定义形状 浅谈出口账务和excel函数
2026-10-06
4
MAKEARRAY 与 REDUCE+VSTACK 自定义形状

先明确一个前提:Excel 动态数组最终输出必须是矩形,不能是锯齿形。
所谓“自定义形状”,本质是控制三件事:

1. 行数:输出几行
2. 列数:输出几列
3. 每个位置的内容:第 r 行第 c 列放什么,或者空着

MAKEARRAY 是声明式:直接告诉 Excel 要几行几列,再按坐标填内容。
REDUCE+VSTACK 是命令式:一步一步堆叠,边算边拼。

---

一、MAKEARRAY:直接声明行数和列数

语法

```excel
=MAKEARRAY(行数, 列数, LAMBDA(r, c, 表达式))
```

· r:当前行号,从 1 开始
· c:当前列号,从 1 开始
· 输出形状 = 第一个参数 × 第二个参数

示例 1:固定 3 行 4 列

```excel
=MAKEARRAY(3, 4, LAMBDA(r, c, r*10 + c))
```

输出:

```text
11  12  13  14
21  22  23  24
31  32  33  34
```

示例 2:动态行数、动态列数

```excel
=MAKEARRAY(
  COUNTA(A2:A100),
  COLUMNS(B1:D1),
  LAMBDA(r, c, INDEX(A2:A100, r) * INDEX(B1:D1, c))
)
```

· 行数由 A 列非空个数决定
· 列数由 B1:D1 的列数决定
· 输出的是“A 列每个元素 × B1:D1 每个元素”的矩阵

示例 3:生成下三角,上三角留空

```excel
=MAKEARRAY(5, 5, LAMBDA(r, c, IF(c <= r, r*c, "")))
```

输出:

```text
1
2   4
3   6   9
4   8   12  16
5   10  15  20  25
```

虽然还是 5×5 矩形,但视觉上成了三角形。

示例 4:乘法表

```excel
=MAKEARRAY(9, 9, LAMBDA(r, c, r*c))
```

输出 9×9 乘法表。

示例 5:按条件切换内容

```excel
=MAKEARRAY(6, 3, LAMBDA(r, c,
  CHOOSE(c,
    "第" & r & "行",
    r^2,
    IF(MOD(r,2)=0, "偶", "奇")
  )
))
```

第 1 列文字,第 2 列平方,第 3 列奇偶判断。

---

二、REDUCE+VSTACK:逐步堆叠自定义形状

核心思路

· VSTACK:垂直堆叠,用来加行
· HSTACK:水平堆叠,用来加列
· REDUCE:循环,每次把新行/新列拼到累加器上
· 最后用 DROP 去掉初始占位行/列

模板:按行构建

```excel
=DROP(
  REDUCE(
    初始行,
    SEQUENCE(行数),
    LAMBDA(acc, r,
      VSTACK(acc, 生成第r行)
    )
  ),
  1
)
```

初始行最好写成与目标列数相同的一行空值:

```excel
SEQUENCE(1, 列数, 0, 0)
```

示例 1:生成 5 行 3 列,每行是 r、r²、r³

```excel
=DROP(
  REDUCE(
    SEQUENCE(1, 3, 0, 0),
    SEQUENCE(5),
    LAMBDA(acc, r,
      VSTACK(acc, HSTACK(r, r^2, r^3))
    )
  ),
  1
)
```

输出:

```text
1   1   1
2   4   8
3   9   27
4   16  64
5   25  125
```

示例 2:按列构建

```excel
=DROP(
  REDUCE(
    SEQUENCE(3, 1, 0, 0),
    SEQUENCE(4),
    LAMBDA(acc, c,
      HSTACK(acc, SEQUENCE(3, 1, c*10))
    )
  ),
  1
)
```

输出 3 行 4 列:

```text
10  20  30  40
10  20  30  40
10  20  30  40
```

示例 3:筛选并堆叠成一列

```excel
=DROP(
  REDUCE(
    "",
    FILTER(A2:A10, B2:B10="是"),
    LAMBDA(acc, x, VSTACK(acc, x))
  ),
  1
)
```

把 B 列为“是”的 A 列值堆成一列。

示例 4:生成不规则三角形

```excel
=DROP(
  REDUCE(
    SEQUENCE(1, 5, 0, 0),
    SEQUENCE(5),
    LAMBDA(acc, r,
      VSTACK(
        acc,
        IF(SEQUENCE(1, 5) <= r, r * SEQUENCE(1, 5), "")
      )
    )
  ),
  1
)
```

输出下三角,上三角空白。

---

三、两者对比

维度 MAKEARRAY REDUCE+VSTACK
写法 声明式,直接给行数列数 命令式,逐步堆叠
可读性 高 较低
性能 好 差,每一步重建数组
适合 规则矩形、矩阵、条件填充 动态行数、每行逻辑不同、需要累积状态
形状控制 第一个参数控制行,第二个控制列 靠 VSTACK/HSTACK 方向控制
不规则形状 用 IF 留空,仍是矩形 同样用 IF 留空,仍是矩形

---

四、复杂形状:拼接多个 MAKEARRAY

Excel 不能输出真正的锯齿数组,但可以用 VSTACK / HSTACK 把多个矩形拼成复杂形状。

示例:上面 3×2,下面 2×4

```excel
=VSTACK(
  MAKEARRAY(3, 2, LAMBDA(r,c, "A" & r & c)),
  MAKEARRAY(2, 4, LAMBDA(r,c, "B" & r & c))
)
```

输出:

```text
A11  A12
A21  A22
A31  A32
B11  B12  B13  B14
B21  B22  B23  B24
```

VSTACK 会自动把宽度不足的部分补 #N/A,保持矩形。
如果不想看到 #N/A,可以用 IFERROR 包一层,或者用空字符串填充。

---

五、避坑要点

1. 最终一定是矩形
      不同长度的行堆叠时,Excel 自动补 #N/A。想留空就用 "",不要指望锯齿。
2. REDUCE+VSTACK 性能差
      每次 VSTACK 都会重建整个数组,复杂度接近 O(n²)。数据量大时优先用 MAKEARRAY。
3. 初始值要选好
      用 SEQUENCE(1, 列数, 0, 0) 做初始行,最后 DROP 第一行,最稳。
4. 动态尺寸用 ROWS / COLUMNS / COUNTA
      例如 MAKEARRAY(COUNTA(A2:A100), 3, ...)。
5. 需要累积状态时,才用 REDUCE
      比如下一行依赖上一行的结果。否则 MAKEARRAY 更直接。

---

六、一句话总结

· MAKEARRAY:告诉 Excel “我要 r 行 c 列”,再用 LAMBDA(r,c,...) 填每个格子。
· REDUCE+VSTACK:从空数组开始,循环往里加行或加列,最后 DROP 掉占位行。
· 自定义形状 = 控制行数、列数、每个位置的内容。
· Excel 只能输出矩形,不规则形状靠 IF 留空或 VSTACK/HSTACK 拼接实现。
· 能用 MAKEARRAY 就优先用,REDUCE+VSTACK 留给需要累积状态的场景。

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