makearray或reduce+vstack如何自定义形状
浅谈出口账务和excel函数 MAKEARRAY 与 REDUCE+VSTACK 自定义形状
先明确一个前提:Excel 动态数组最终输出必须是矩形,不能是锯齿形。
3. 每个位置的内容:第 r 行第 c 列放什么,或者空着
MAKEARRAY 是声明式:直接告诉 Excel 要几行几列,再按坐标填内容。
REDUCE+VSTACK 是命令式:一步一步堆叠,边算边拼。
=MAKEARRAY(行数, 列数, LAMBDA(r, c, 表达式))
=MAKEARRAY(3, 4, LAMBDA(r, c, r*10 + c))
LAMBDA(r, c, INDEX(A2:A100, r) * INDEX(B1:D1, c))
· 输出的是“A 列每个元素 × B1:D1 每个元素”的矩阵
=MAKEARRAY(5, 5, LAMBDA(r, c, IF(c <= r, r*c, "")))
=MAKEARRAY(9, 9, LAMBDA(r, c, r*c))
=MAKEARRAY(6, 3, LAMBDA(r, c,
第 1 列文字,第 2 列平方,第 3 列奇偶判断。
二、REDUCE+VSTACK:逐步堆叠自定义形状
· REDUCE:循环,每次把新行/新列拼到累加器上
示例 1:生成 5 行 3 列,每行是 r、r²、r³
VSTACK(acc, HSTACK(r, r^2, r^3))
HSTACK(acc, SEQUENCE(3, 1, c*10))
FILTER(A2:A10, B2:B10="是"),
LAMBDA(acc, x, VSTACK(acc, x))
IF(SEQUENCE(1, 5) <= r, r * SEQUENCE(1, 5), "")
维度 MAKEARRAY REDUCE+VSTACK
适合 规则矩形、矩阵、条件填充 动态行数、每行逻辑不同、需要累积状态
形状控制 第一个参数控制行,第二个控制列 靠 VSTACK/HSTACK 方向控制
不规则形状 用 IF 留空,仍是矩形 同样用 IF 留空,仍是矩形
Excel 不能输出真正的锯齿数组,但可以用 VSTACK / HSTACK 把多个矩形拼成复杂形状。
MAKEARRAY(3, 2, LAMBDA(r,c, "A" & r & c)),
MAKEARRAY(2, 4, LAMBDA(r,c, "B" & r & c))
VSTACK 会自动把宽度不足的部分补 #N/A,保持矩形。
如果不想看到 #N/A,可以用 IFERROR 包一层,或者用空字符串填充。
不同长度的行堆叠时,Excel 自动补 #N/A。想留空就用 "",不要指望锯齿。
每次 VSTACK 都会重建整个数组,复杂度接近 O(n²)。数据量大时优先用 MAKEARRAY。
用 SEQUENCE(1, 列数, 0, 0) 做初始行,最后 DROP 第一行,最稳。
4. 动态尺寸用 ROWS / COLUMNS / COUNTA
例如 MAKEARRAY(COUNTA(A2:A100), 3, ...)。
比如下一行依赖上一行的结果。否则 MAKEARRAY 更直接。
· MAKEARRAY:告诉 Excel “我要 r 行 c 列”,再用 LAMBDA(r,c,...) 填每个格子。
· REDUCE+VSTACK:从空数组开始,循环往里加行或加列,最后 DROP 掉占位行。
· 自定义形状 = 控制行数、列数、每个位置的内容。
· Excel 只能输出矩形,不规则形状靠 IF 留空或 VSTACK/HSTACK 拼接实现。
· 能用 MAKEARRAY 就优先用,REDUCE+VSTACK 留给需要累积状态的场景。