如何在 Excel 中将多列合并为一列?

如何在 Excel 中将多列合并为一列?

我不确定该如何表述,但如果我在 Excel 中有下表:

表格1

有没有办法将类型列合并为一列以获得以下表:

表 2

基本上,我如何让 Excel 为每个对象列创建一行以键入列组合?我拥有的实际表格将包含更多行,并且手动执行此操作并不容易。

答案1

您要尝试执行的操作是 Unpivot 或 Melt。我能想到三种方法可以做到这一点:

  • 创建一个 OFFSET 公式。
  • 像李一样在 Power BI 引擎中使用 PowerQuery。
  • 创建一个动态数组,我将在下面展示。

每种方法都有优点和缺点。Offset 的优点是输入数据后可以立即给出答案。缺点是,您必须将公式复制到目标位置,因此如果输入数据的大小发生变化,您必须相应地复制公式。此外,OFFSET 是一个易失性函数,可能会也可能不会影响工作簿的性能。

Power Query 方法要求您每次更改数据时都刷新数据。

动态数组与偏移量类似,它们会立即计算,但它们的优点是可以随着数据的变化而重新调整形状,并且它们是非易失性的。它们的缺点是它们会动态地将结果写入工作表本身,因此如果您有任何占用的单元格,公式就会溢出。

也就是说,这里有一种使用 LET 的动态数组方法,可以使其更容易理解、修改和调试。

=LET( unPivMatrix, A2:A4,
      byMatrix, B2:D4,
       upC, COLUMNS( unPivMatrix ),
       upCells, MIN( ROWS( unPivMatrix ), ROWS( byMatrix ) ) * upC,
       upSeq, SEQUENCE( upCells,, 0 ),
       byC, COLUMNS( byMatrix ),
       mux, INDEX( unPivMatrix, upSeq/upC + 1, MOD( upSeq, upC ) + 1 ),
       demux, IFERROR( INDEX( byMatrix,
                              IFERROR( INT( SEQUENCE( upCells, byC,0 )/byC/upC ) + 1,
                                       MOD( upSeq, upC ) + 1 ),
                              SEQUENCE( 1, byC + 1 ) ),
                        mux ),
       demux
     )

矩阵是你想要分配的列 - 因此这些将是类型在您的示例中。通过Matrix您想要根据哪些列进行逆透视?这些列是对象在您的示例中。考虑一下 Excel 中的数据透视表。通过Matrix是您要旋转数据的行,以及矩阵是要取消透视的数据。

此公式首先为逆透视创建一个形状,以便可以将其复用到单个列中(称为多路复用器) 像这样:

多路复用器
A
b
C
F
G
...

结果被放入解复用首先创建一个数组通过Matrix重复通过Matrix中每列的列值矩阵

解复用 col1
1
1
1
2
2
2
3

通过引用比实际存在的列多一列通过Matrix,INDEX 函数将引发错误。

解复用 col1 附加列
1 #参考!
1 #参考!
1 #参考!
2 #参考!
2 #参考!
2 #参考!
3 #参考!

利用这个错误可以有效地融合两个数组(解复用通过Matrix多路复用器) 一起。通过将结果包装在 IFERROR 中,我们能够将 #REF! 错误替换为多路复用器

解复用 col1 附加列
1 A
1 b
1 C
2 d
2
2 F
3 G

此公式现在是基于动态数组的通用反透视。即,您可以将任何范围放入矩阵通过Matrix并以与 Power Query 中的 UNPIVOT 工作方式类似的方式获取您想要的结果。

答案2

您可以尝试使用公式来解决它,见下面的示例

在此处输入图片描述

我添加了一些公式文本,使其更清晰一些。在我看来,这种方法有点笨拙——如果您输入更多数据,则需要扩展公式。

一个不错的选择是通过 Power Query 进行逆透视。互联网上有很多关于如何操作的文章尝试一下微软的

答案3

尝试使用Power Query获取结果:

  1. 数据-来自表/范围

在此处输入图片描述

  1. 选择类型 1、类型 2、类型 3下栏转换tab-选择非透视列- 消除属性列更改价值类型-关闭并加载在此处输入图片描述

相关内容