用标记将单列转置为多行

用标记将单列转置为多行

我在 Excel 表(也在文本文件和 CSV 中)中有一个数据,如下所示:

;;
A
1
2
3

;;
B
1
2

;;
C
1
2
3
4
5

每个组都有一个标记“;;”,每个组后面都有一个空格。长度各不相同。我想像这样转置成多行:

A 1 2 3
B 1 2
C 1 2 3 4 5

我找不到这个任务的公式或宏。

谢谢

答案1

您不需要 VBA 来实现此目的,只需要INDEX/MATCH一点想象力。

在此处输入图片描述

数据在 A 列,从单元格 A1 开始。BF 列计算各种项目(如下所述),而输出则从单元格 H1 开始。

数据被分组为“块”,B 列仅标识特定数据项所属的块号 - 每当找到 ;; 标记时,块号就会递增。C 列显示数据项在每个块内的相对位置,其中 0 表示 A 列中的相应单元格被排除在输出之外。

单元格 D1 和 E1 只是 B 列和 C 列中的最大值,分别表示块数和任何块内的最大项目数。因此,输出将适合包含 D1 行和 E1 列的单元格矩形阵列。

如果每个块都包含相同的编号,因此包含最大数量的项目(如示例中所示为 6),那么我们可以简单地将第一个块中的项目编号为 1-6,第二个块中的项目编号为 7-12,第三个块中的项目编号为 13-18,等等,并将项目 1-6 映射为 put 的第一行,7-12 映射为第二行,13-18 映射为第三行,等等。

实际上,这种方法是可行的,只是会忽略任何未使用的项目编号。F 列提供项目编号,例如,由于块 1 仅包含 4 个项目,因此值 5 和 6 不会出现在 F 列中,而块 2(单元格 A8)中的第一个项目被赋予项目编号 7(单元格 F8)。

当将单元格 H1 中的代码片段$E$1*(ROW(H1)-1)+COLUMN(H1)-7复制到相邻单元格时,会生成适合输出行和列的(理论上的)项目编号。(单元格 H1 位于输出的第 1 行和第 1 列)MATCHH1 中的函数会测试在 F 列中是否找到项目编号。如果找到,该INDEX部分将从 A 列提供相应的值。否则,如果 F 列中的项目编号不匹配,则函数会捕获产生的 #N/AIFERROR并将其替换为空字符串。

根据输入数据的性质,可以对这种方法进行改进,例如避免在所有潜在输出单元中重复使用ROW()COLUMN()函数,但上面提出的方法提供了一个起点。

相关内容