大数跨境

makearray函数用法举例说明及逻辑分析,r和c都是1吗

makearray函数用法举例说明及逻辑分析,r和c都是1吗 浅谈出口账务和excel函数
2026-10-06
5
MAKEARRAY 函数用法举例与逻辑分析

MAKEARRAY 是 Excel 365 / WPS 较新版本中的动态数组函数,核心作用是:

先声明输出几行几列,再按每个坐标 (r, c) 计算该位置的内容。

一句话理解:

MAKEARRAY = 画布大小 + 坐标函数。

---

一、语法与参数

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

参数 含义
行数 输出数组的行数,必须是正整数
列数 输出数组的列数,必须是正整数
LAMBDA(r, c, ...) 对每个坐标计算内容
r 当前行号,从 1 到行数
c 当前列号,从 1 到列数

规则:

· r 和 c 都是从 1 开始。
· 输出形状严格等于“行数 × 列数”。
· 每个位置独立计算,不依赖其他位置的结果。
· 最终输出一定是矩形,不能是锯齿形。
· 如果行数或列数小于 1,返回错误。

---

二、逻辑分析:它是怎么算的?

假设:

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

逻辑过程:

1. 确定画布:3 行 4 列。
2. 遍历每个坐标:

r c r*10+c
1 1 11
1 2 12
1 3 13
1 4 14
2 1 21
2 2 22
2 3 23
2 4 24
3 1 31
3 2 32
3 3 33
3 4 34

3. 按行排列输出:

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

关键点:

· 坐标驱动:每个格子只关心自己的 r 和 c。
· 无状态:不像 SCAN / REDUCE 需要累积器。
· 可并行:各位置互不影响,适合规则矩阵。
· 可引用外部数据:通过 INDEX、SUMIFS 等函数取数。

---

三、基础示例

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. 9×9 乘法表

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

输出 9 行 9 列乘法表。

3. 平方矩阵

```excel
=MAKEARRAY(5, 5, LAMBDA(r, c, r^c))
```

输出每个位置是 r 的 c 次方。

---

四、动态尺寸示例

行数和列数可以不写死,用 COUNTA、ROWS、COLUMNS 动态计算。

1. 列表交叉相乘

A 列是产品,B1:D1 是月份:

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

· 行数 = A 列非空个数
· 列数 = B1:D1 的列数
· 每个位置 = 第 r 个产品 × 第 c 个月份

2. 将一维数组重塑为矩阵

A2:A7 有 6 个值,想变成 3 行 2 列:

```excel
=MAKEARRAY(3, 2, LAMBDA(r, c,
  INDEX(A2:A7, (r-1)*2 + c)
))
```

逻辑:

· 第 1 行第 1 列:INDEX(..., 1)
· 第 1 行第 2 列:INDEX(..., 2)
· 第 2 行第 1 列:INDEX(..., 3)
· 第 2 行第 2 列:INDEX(..., 4)
· 第 3 行第 1 列:INDEX(..., 5)
· 第 3 行第 2 列:INDEX(..., 6)

---

五、条件填充示例

1. 下三角矩阵

```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 矩形,但上三角留空,视觉上是三角形。

2. 奇偶判断 + 文字 + 平方

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

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

3. 生成日期序列

```excel
=MAKEARRAY(3, 2, LAMBDA(r, c,
  DATE(2026, 10, r + c - 1)
))
```

输出 3 行 2 列的日期。

4. 生成字母编号

```excel
=MAKEARRAY(2, 3, LAMBDA(r, c,
  CHAR(64 + c) & r
))
```

输出:

```text
A1  B1  C1
A2  B2  C2
```

---

六、结合 SUMIFS 做交叉表

假设:

· A 列产品
· B 列月份
· C 列销量

想输出“产品 × 月份”的销量交叉表:

```excel
=MAKEARRAY(
  COUNTA(产品列),
  COUNTA(月份列),
  LAMBDA(r, c,
    SUMIFS(
      销量列,
      产品列, INDEX(产品列, r),
      月份列, INDEX(月份列, c)
    )
  )
)
```

逻辑:

· r 控制产品
· c 控制月份
· 每个格子做一次条件求和

这是 MAKEARRAY 最实用的财务、销售场景之一。

---

七、与 VSTACK / HSTACK 拼接复杂形状

MAKEARRAY 输出矩形,多个矩形可以拼接:

```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
```

宽度不足处 Excel 会自动补 #N/A。
若不想看到错误值,可用 IFERROR 包一层。

---

八、常见错误与避坑

1. 行数或列数不能小于 1

```excel
=MAKEARRAY(0, 3, LAMBDA(r,c, r*c))
```

报错。行数、列数必须是正整数。

2. LAMBDA 参数个数必须为 2

```excel
=MAKEARRAY(3, 3, LAMBDA(r, r*2))
```

错误。必须写成:

```excel
=MAKEARRAY(3, 3, LAMBDA(r, c, r*2))
```

3. 不能生成锯齿数组

Excel 动态数组最终必须是矩形。
不规则形状只能靠 IF 留空,或用 VSTACK / HSTACK 拼接。

4. 性能问题

行数 × 列数过大时,计算量急剧上升。
例如 1000×1000 = 100 万个格子,容易卡顿。
尽量缩小范围,或用 FILTER 先筛选。

5. 易失性函数要谨慎

如果 LAMBDA 里用了 RAND()、NOW()、OFFSET() 等易失性函数,每次重算都会变。
MAKEARRAY 本身不是易失性函数,但内部可以调用易失性函数。

6. WPS 兼容性

WPS 较新版本支持 MAKEARRAY 和 LAMBDA,但需:

· 保存为 .xlsx 或 .xlsm
· 不要用兼容模式
· 版本不能太旧

否则重新打开可能变成 #VALUE!。

---

九、与 SEQUENCE、MAP、REDUCE 的对比

函数 输出形状 特点 适合
SEQUENCE 指定行列 只能生成规则序列 连续数字、日期
MAKEARRAY 指定行列 每个坐标自定义计算 矩阵、交叉表、条件填充
MAP 与输入同形状 多数组逐元素映射 多列逐行计算
SCAN 与输入同形状 单数组状态扫描 累计、填充、状态跟踪
REDUCE 单值或最终数组 归约聚合 求和、拼接、累积

选择逻辑:

· 要规则矩形,每个格子按坐标算 → MAKEARRAY
· 要逐元素映射多个数组 → MAP
· 要累积状态 → SCAN / REDUCE
· 要筛选、排序、去重 → FILTER / SORT / UNIQUE

---

十、一句话总结

MAKEARRAY 的逻辑就是:

先定行数和列数,再对每个坐标 (r, c) 调用 LAMBDA 计算内容。

它适合:

· 规则矩阵
· 乘法表
· 交叉表
· 条件填充
· 一维数组重塑
· 按坐标生成文本、日期、编号

它不适合:

· 需要累积状态
· 输出长度不固定
· 锯齿形数组
· 超大矩阵

记住:

MAKEARRAY 是“坐标驱动”的矩形生成器。
能用它就用它,比 REDUCE+VSTACK 更直接、更高效。
不是。r 和 c 不是都等于 1,它们是变量,分别代表当前格子的行号和列号。

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

· r:当前行号,从 1 开始,一直取到“行数”。
· c:当前列号,从 1 开始,一直取到“列数”。

Excel 会遍历所有 (r, c) 组合,每个位置拿自己的行号和列号去计算。

---

举例:=MAKEARRAY(3, 4, LAMBDA(r, c, r*10 + c))

行数 = 3,列数 = 4,所以:

· r 会取:1、2、3
· c 会取:1、2、3、4

每个位置的 (r, c) 是:

位置 r c r*10+c
第1行第1列 1 1 11
第1行第2列 1 2 12
第1行第3列 1 3 13
第1行第4列 1 4 14
第2行第1列 2 1 21
第2行第2列 2 2 22
第2行第3列 2 3 23
第2行第4列 2 4 24
第3行第1列 3 1 31
第3行第2列 3 2 32
第3行第3列 3 3 33
第3行第4列 3 4 34

输出就是:

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

---

什么时候 r 和 c 都是 1?

只有当你写成:

```excel
=MAKEARRAY(1, 1, LAMBDA(r, c, ...))
```

这时只有 1 行 1 列,所以 r=1、c=1。

但正常情况下,r 和 c 是随位置变化的,不是固定为 1。

---

一句话

r 是行号,c 是列号;
它们从 1 开始,分别遍历到指定的行数和列数;
每个格子都有自己的 (r, c),不是都等于 1。

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