
本文于2023年8月2日首发于本人同名公众号:Excel活学活用,更多文章案例请搜索关注!
内容提要
矩阵数据转置的三种方法
VBA代码法
函数公式法
数据透视表
大家好,我是冷水泡茶,今天在论坛上看到一个求助贴:

他的原表是这样的:

他的需求是这样的:

楼主要求用VBA解决,我们想到三种方法,一起来看一下吧(原表的行列字段有微调):
VBA代码法
Sub TransFormData() Dim arrData(), arrTem() Dim wsSource As Worksheet, wsTarget As Worksheet Dim iRow As Integer, iCol As Integer Dim i As Integer, j As Integer, k As Integer Set wsSource = Sheets("原表") arrData = wsSource.Range("A1").CurrentRegion.Value iRow = UBound(arrData, 1) iCol = UBound(arrData, 2) Dim totalRows As Integer totalRows = (iRow - 1) * (iCol - 1) + 1 ReDim arrTem(1 To totalRows, 1 To 3) arrTem(1, 1) = "ITEM" arrTem(1, 2) = "数量" arrTem(1, 3) = "日期" k = 1 For i = 2 To iCol For j = 2 To iRow k = k + 1 arrTem(k, 1) = arrData(j, 1) arrTem(k, 2) = arrData(j, i) arrTem(k, 3) = arrData(1, i) Next Next '检查表"转置"是否存在,存在则清空,不存在则添加 On Error Resume Next Set wsTarget = Worksheets("转置") On Error GoTo 0 If wsTarget Is Nothing Then Set wsTarget = Sheets.Add(After:=Sheets(Sheets.Count)) wsTarget.Name = "转置" Else wsTarget.Cells.Clear ' 清除 End If '输出到 "转置" 表 wsTarget.Range("A1").Resize(totalRows, 3).Value = arrTemEnd Sub
代码解析:
1、把原始数据读入数组arrData()。
2、根据数据行、列的数量,重新定义目标数组arrTem()。
3、循环数组arrData()的行、列,把数据写入数组arrTem()。
4、把结果写入工作表“转置”。
函数公式法
1、在表“公式”中输入表头。
2、在A2单元格输入公式:
=INDEX(原表!$A$2:$A$158,MOD(ROW(A1)-1,ROWS(原表!$A$2:$A$158))+1,1)
3、在B2单元格输入公式:
=INDEX(原表!$B$2:$Y$158,MOD(ROW(A1)-1,ROWS(原表!$A$2:$A$158))+1,INT((ROW(A1)-1)/ROWS(原表!$A$2:$A$158)+1))
4、在C2单元格输入公式:
=INDEX(原表!$B$1:$Y$1,1,INT((ROW(A1)-1)/ROWS(原表!$A$2:$A$158)+1))
5、选中A2:C2,往下拖,直到出现错误值为止。
6、也可以在上述公式前增加IFERROR函数容错。
数据透视表
1、选中所有列,插入数据透视,选择新建工作表。
2、把ITEM字段加到行,日期字段都加到“值”。
3、把右上列框里的∑数值拖到行:

则变成这样:

4、在设计菜单-->报表布局,选择“以表格形式显示”,再右击“ITEM”,字段设置-->布局和打印-->重复项目标签,结果如下:

5、复制整个表,粘贴为数值(如果需要重复使用这个数据透视表的,可以复制粘贴到另一张表)。
6、筛选删除空白、汇总项目,把所有“求和项:”替换为空,搞定。
喜欢就点个赞、点在看、留个言呗!需要示例文件的朋友请关注本人同名V公众号查看文件获取方式。