我需要转换表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
答案 0 :(得分:51)
对于Excel 2003:激活摘要表中的任何单元格,然后选择“数据 - 数据透视表和数据透视图报表”:
对于更高版本,使用 Alt + D , P 访问向导。
对于Excel for Mac 2011,它是⌘ + Alt + P (See here)。
选择多个合并范围,然后点击下一步。
在“Step 2a of 3”中,选择我将创建页面字段并单击 Next 。
在“步骤2b of 3”中,在范围字段中指定汇总表范围(样本数据为A1:E5),然后单击添加,然后下一步
在“第3步(共3步)”中,选择数据透视表的位置(现有工作表应该投放,因为临时只需要PT):
单击完成以创建数据透视表:
在Grand Totals(此处为Cell V7或7
)的交叉处向下钻取(即双击):
现在可以删除PT。
在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 。
选择表格中的任何单元格,然后在Power Query功能区上单击“从表格”。
这将打开Power Query Editor窗口中的表格。
单击第一列的列标题以将其选中。然后,在转换功能区上,点击取消透视列下拉菜单,然后选择取消隐藏其他列。
对于没有 Unpivot其他列命令的Power Query版本,请选择除第一列以外的所有列(使用按住Shift键并单击列标题)并使用 Unpivot 命令。
结果是一张平台。单击主页功能区上的关闭并加载,数据将加载到新的Excel工作表中。
现在到了好的方面。将一些数据添加到源表中,例如
单击包含Power Query结果表的工作表,然后在数据功能区上单击全部刷新。你会看到类似的东西:
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)
答案 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)。