同行多列合并方法

=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 会自动变成 A2A3……,所以 ROW(A1) 实际上起到了 递增计数器 的作用,依次为 1, 2, 3, …

COLUMNS($A$1:$E$17) 的值

区域 $A$1:$E$175 列(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 等新函数出现之前)。


需要我帮你写一个按列优先展开的变体公式吗?

posted @ 2026-07-07 17:30  涣明  阅读(5)  评论(0)    收藏  举报