将矩阵转换为3列表('反向枢轴','展开','展平','正常化')

时间:2013-12-12 11:11:21

标签: excel matrix pivot-table unpivot powerquery

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

第一

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

LATER

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

5 个答案:

答案 0 :(得分:51)

要“反转枢轴”,“展开”或“展平”:

  1. 对于Excel 2003:激活摘要表中的任何单元格,然后选择“数据 - 数据透视表和数据透视图报表”:

    SO20541905 first example

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

    对于Excel for Mac 2011,它是 + Alt + P See here)。

    1. 选择多个合并范围,然后点击下一步

      SO20541905 second example

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

      SO20541905 third example

    3. 在“步骤2b of 3”中,在范围字段中指定汇总表范围(样本数据为A1:E5),然后单击添加,然后下一步

      SO20541905 fourth example

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

      SO20541905 fifth example

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

      SO20541905 sixth example

    6. 在Grand Totals(此处为Cell V7或7)的交叉处向下钻取(即双击):

      SO20541905 seventh example

    7. 现在可以删除PT。

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

      Launch Excel有同一主题的视频我认为质量非常好。

答案 1 :(得分:20)

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

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

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

enter image description here

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

enter image description here

这将打开Power Query Editor窗口中的表格。

enter image description here

单击第一列的列标题以将其选中。然后,在转换功能区上,点击取消透视列下拉菜单,然后选择取消隐藏其他列

对于没有 Unpivot其他列命令的Power Query版本,请选择除第一列以外的所有列(使用按住Shift键并单击列标题)并使用 Unpivot 命令。

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

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

答案 2 :(得分: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)

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

答案 3 :(得分:0)

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

enter image description here

答案 4 :(得分: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 可以是多列的范围,它会 复制列的行值。例如你可以有 byMatrix A1:C5 和 D1:H5 的 unPivMatrix 它将复制 A2:C5 列值(忽略 A1)。

相关问题