38

我需要转换表格FIRST中的 Excel 矩阵LATER

第一

    P1  P2  P3  P4
F1  X
F2  X   X
F3      X       X
F4      X   X

稍后

F   P   VALUE
F1  P1  X
F1  P2
F1  P3
F1  P4
F2  P1  X
F2  P2  X
F2  P3
F2  P4
F3  P1
F3  P2  X
F3  P3
F3  P4  X
F4  P1
F4  P2  X
F4  P3  X
F4  P4
4

5 回答 5

59

要“反转枢轴”、“取消枢轴”或“展平”:

  1. 对于 Excel 2003:激活汇总表中的任何单元格并选择数据 - 数据透视表和数据透视图报告:

    SO20541905 第一个例子

对于更高版本,使用Alt+ D、访问向导P

对于 Excel for Mac 2011,它是⌘</kbd>+Alt+P (See here).

  1. 选择多个合并范围并单击Next

    SO20541905 第二个例子

  2. 在“Step 2a of 3”中,选择我将创建页面字段并单击Next

    SO20541905 第三个例子

  3. 在“Step 2b of 3”中,在Range字段中指定汇总表范围(样本数据为 A1:E5),然后单击Add,然后单击Next

    SO20541905第四个例子

  4. 在“第 3 步,共 3 步”中,选择数据透视表的位置(应使用现有工作表,因为 PT 只是暂时需要):

    SO20541905第五个例子

  5. 单击Finish以创建数据透视表:

    SO20541905第六个例子

  6. 向下钻取(即双击)总计的交叉点(此处为单元格 V7 或7):

    SO20541905第七个例子

  7. 现在可以删除 PT。

  8. 通过选择快速菜单中的表格(在表格中右键单击)和转换为范围,可以将生成的表格转换为传统的单元数组

Launch Excel上有一个关于同一主题的视频,我认为它的质量非常好。

于 2013-12-12T12:31:41.550 回答
28

在不使用 VBA 的情况下取消透视数据的另一种方法是使用 PowerQuery,它是 Excel 2010 及更高版本的免费插件,可在此处获得:http: //www.microsoft.com/en-us/download/details.aspx?id=39379

安装并激活 Power Query 加载项。然后按照以下步骤操作:

将列标签添加到您的数据源并通过 Insert > Table 或Ctrl-将其转换为 Excel 表格T

在此处输入图像描述

选择表中的任何单元格,然后在 Power Query 功能区上单击“从表”。

在此处输入图像描述

这将在 Power Query 编辑器窗口中打开该表。

在此处输入图像描述

单击第一列的列标题以将其选中。然后,在转换功能区上,单击Unpivot Columns下拉菜单并选择Unpivot other columns

对于没有Unpivot other columns命令的 Power Query 版本,选择除第一个列之外的所有列(使用 Shift 键单击列标题)并使用Unpivot命令。

在此处输入图像描述

结果是一张扁平的桌子。单击主页功能区上的关闭并加载,数据将加载到新的 Excel 工作表中。

在此处输入图像描述

现在到了好的部分。将一些数据添加到源表中,例如

在此处输入图像描述

单击带有 Power Query 结果表的工作表,然后在数据功能区上单击全部刷新。你会看到类似的东西:

在此处输入图像描述

Power Query 不仅仅是一次性转换。它是可重复的,并且可以链接到动态变化的数据。

于 2014-12-27T21:10:28.067 回答
2

到目前为止,所有解决方案都涉及 VBA、PowerQuery 等,它们很棒,但都是“一次性”事件。要使其更具动态性,请考虑使用 INDEX(MATCH(...))。这将允许对表进行动态更新。

在此处输入图像描述

于 2018-11-14T15:09:53.077 回答
1

添加 LET 函数和动态数组允许这种非 VBA 解决方案。

=LET(data,B2:E5,
     dataRows,ROWS(data),
     dataCols,COLUMNS(data),
     rowHeaders,OFFSET(data,0,-1,dataRows,1),
     colHeaders,OFFSET(data,-1,0,1,dataCols),
     dataIndex,SEQUENCE(dataRows*dataCols),
     rowIndex,MOD(dataIndex-1,dataRows)+1,
     colIndex,INT((dataIndex-1)/dataRows)+1,
     dataColumn, IF(INDEX(data,rowIndex,colIndex)="","",INDEX(data,rowIndex,colIndex)),
     unfiltered, CHOOSE({1,2,3},INDEX(rowHeaders,rowIndex),INDEX(colHeaders,colIndex), dataColumn),
     filtered, FILTER(unfiltered, dataColumn<>""),
     unfiltered)

这将显示所有项目,包括具有空白数据的项目。为了消除空白,将最后一个参数更改为过滤。

于 2021-02-19T15:01:57.247 回答
0

再添加一个到 BoK。这需要 Excel 365。它通过 A1:A5 取消透视 B1:E5。

=LET( unPivMatrix, B1:E5,
      byMatrix, A1:A5,
        upC, COLUMNS( unPivMatrix ),
        byC, COLUMNS( byMatrix ),
        dmxR, MIN( ROWS( unPivMatrix ), ROWS( byMatrix ) ) - 1,
        dmxSeq, SEQUENCE( dmxR ) + 1,
        upCells, dmxR * upC,
        upSeq, SEQUENCE( upCells,, 0 ),
        upHdr, INDEX( INDEX( unPivMatrix, 1, ),  1,  SEQUENCE( upC ) ),
        upBody, INDEX( unPivMatrix,  dmxSeq,  SEQUENCE( 1, upC ) ),
        byBody, INDEX( byMatrix,  dmxSeq,  SEQUENCE( 1, byC ) ),
        attr, INDEX( upHdr, MOD( upSeq, upC ) + 1 ),
        mux, INDEX( upBody, upSeq/upC + 1, MOD( upSeq, upC ) + 1 ),
        demux, IFERROR( INDEX(
                              IFERROR( INDEX( byBody,
                                              IFERROR( INT( SEQUENCE( upCells, byC,0 )/byC/upC ) + 1, MOD( upSeq, upC ) + 1 ),
                                                       SEQUENCE( 1, byC + 1 ) ),
                                        attr ),
                              upSeq + 1, SEQUENCE( 1, byC + 2 ) ),
                         mux ),
        FILTER(demux, mux<>"")
 )

注意: byMatrix 可以是具有多列的范围,它将复制列的行值。例如,您可以拥有 A1:C5 的 byMatrix 和 D1:H5 的 unPivMatrix,它会复制 A2:C5 列值(忽略 A1)。

于 2021-06-25T16:25:15.293 回答