同行多列合并方法
=IFERROR(INDEX($A$1:$E$17, INT((ROW(A1)-1)/COLUMNS($A$1:$E$17))+1, MOD(ROW(A1)-1, COLUMNS($A$1:$E$17))+1), "")
这是一个经典的 Excel "二维区域展开为一列" 的公式。它的作用是将一个多行多列的区域(如 $A$1:$E$17)按行优先顺序,逐个单元格地"拉平"成一列数据。下面逐层拆解:
整体结构
=IFERROR( INDEX(...), "" )
- INDEX:从指定区域中,根据行号和列号取出对应单元格的值。
- IFERROR:如果 INDEX 取数时出错(说明已经超出数据范围),就返回空文本
"",避免显示#REF!错误。
核心难点:行号和列号怎么算?
INDEX 需要两个参数:第几行、第几列。这个公式的精妙之处就在于用 ROW(A1) 来动态生成这两个值。
假设公式写在某个单元格中,往下拖拽填充。
ROW(A1) 的作用——生成序号
| 公式所在行 | ROW(A1) |
ROW(A2) |
ROW(A3) |
... | ROW(A85) |
|---|---|---|---|---|---|
| 返回值 | 1 | 2 | 3 | ... | 85 |
当公式向下拖拽时,
A1会自动变成A2、A3……,所以ROW(A1)实际上起到了 递增计数器 的作用,依次为 1, 2, 3, …
COLUMNS($A$1:$E$17) 的值
区域 $A$1:$E$17 有 5 列(A 到 E),所以 COLUMNS(...) = 5。这个值在整个公式中是固定的(因为有 $ 绝对引用)。
行号计算
INT((ROW(A1)-1) / COLUMNS($A$1:$E$17)) + 1
以序号 n = ROW(A1)-1(从 0 开始计数)为例:
| 序号 n | INT(n / 5) + 1 |
含义 |
|---|---|---|
| 0 | INT(0/5)+1 = 1 | 第 1 行 |
| 1 | INT(1/5)+1 = 1 | 第 1 行 |
| 2 | INT(2/5)+1 = 1 | 第 1 行 |
| 3 | INT(3/5)+1 = 1 | 第 1 行 |
| 4 | INT(4/5)+1 = 1 | 第 1 行 |
| 5 | INT(5/5)+1 = 2 | 第 2 行 |
| 6 | INT(6/5)+1 = 2 | 第 2 行 |
| ... | ... | ... |
| 84 | INT(84/5)+1 = 17 | 第 17 行 |
本质:用整除(
INT)实现"每 5 个序号换一行",即 行号 = 商 + 1。
列号计算
MOD(ROW(A1)-1, COLUMNS($A$1:$E$17)) + 1
| 序号 n | MOD(n, 5) + 1 |
含义 |
|---|---|---|
| 0 | MOD(0,5)+1 = 1 | 第 1 列 (A) |
| 1 | MOD(1,5)+1 = 2 | 第 2 列 (B) |
| 2 | MOD(2,5)+1 = 3 | 第 3 列 (C) |
| 3 | MOD(3,5)+1 = 4 | 第 4 列 (D) |
| 4 | MOD(4,5)+1 = 5 | 第 5 列 (E) |
| 5 | MOD(5,5)+1 = 1 | 回到第 1 列 (A) |
| 6 | MOD(6,5)+1 = 2 | 第 2 列 (B) |
| ... | ... | ... |
本质:用取余(
MOD)实现"列号在 1~5 之间循环",即 列号 = 余数 + 1。
合在一起的效果
公式从 $A$1:$E$17(共 17 行 × 5 列 = 85 个单元格)中,按 从左到右、从上到下 的顺序,依次取出每个单元格的值:
A1, B1, C1, D1, E1,
A2, B2, C2, D2, E2,
...
A17, B17, C17, D17, E17
每往下拖一行公式,就输出下一个值。当拖到第 86 行时,INDEX 会引用到第 18 行(超出范围),触发错误,IFERROR 将其捕获并返回空字符串 ""。
一句话总结
这个公式利用
INT做整除求行号 +MOD做取余求列号,将一个 M×N 的二维区域按行优先顺序展开为一列,是 Excel 中实现"二维转一维"的经典技巧,常用于数据整理和动态数组(在TOCOL/WRAPROWS等新函数出现之前)。
需要我帮你写一个按列优先展开的变体公式吗?

浙公网安备 33010602011771号