使用Excel VBA实现动态数据转置:多列转多行(跨工作表)
动态提取多工作表数据并转置至目标工作表行内
核心思路
- 遍历指定源工作表,动态识别非空白数据列(适配月度更新的新增数据)
- 将每列数据转置到目标工作表的对应行
- 自动跳过空白单元格,避免无效数据填充
实现代码
Sub TransposeDynamicData() Dim wb As Workbook Dim wsSource As Worksheet Dim wsTarget As Worksheet Dim lastCol As Long, lastRow As Long Dim targetRow As Long Dim col As Long, row As Long ' 初始化工作簿和目标工作表(根据实际名称修改) Set wb = ThisWorkbook Set wsTarget = wb.Sheets("汇总表") ' 替换成你的目标工作表名 targetRow = 1 ' 数据起始行 ' 遍历所有源工作表(可改成指定工作表集合,比如Sheets(Array("一月","二月"...))) For Each wsSource In wb.Sheets ' 跳过目标工作表本身 If wsSource.Name <> wsTarget.Name Then ' 获取源表最后一列(动态识别有数据的列) lastCol = wsSource.Cells(1, wsSource.Columns.Count).End(xlToLeft).Column ' 遍历每一列数据 For col = 1 To lastCol ' 获取当前列最后一行数据 lastRow = wsSource.Cells(wsSource.Rows.Count, col).End(xlUp).Row ' 仅处理有数据的列(跳过全空白列) If lastRow >= 1 Then ' 转置列数据到目标行 wsTarget.Cells(targetRow, 1).Resize(1, lastRow).Value = _ Application.Transpose(wsSource.Cells(1, col).Resize(lastRow).Value) ' 目标行下移,准备下一列数据 targetRow = targetRow + 1 End If Next col End If Next wsSource MsgBox "数据转置完成!", vbInformation End Sub
关键说明
- 动态识别有效列/行:用
End(xlToLeft)和End(xlUp)自动定位最后有数据的列和行,无需手动指定范围,适配月度更新的新增数据 - 跳过空白列:通过判断
lastRow >=1过滤全空白列,避免无效转置 - 处理空白单元格:转置时会保留原单元格的空白状态,若需要替换空白为特定值(比如"无数据"),可在转置前添加循环处理:
' 示例:将空白单元格替换为"无数据" For row = 1 To lastRow If wsSource.Cells(row, col).Value = "" Then wsSource.Cells(row, col).Value = "无数据" End If Next row - 指定源工作表:如果不需要遍历所有工作表,可将
For Each wsSource In wb.Sheets改成指定集合,比如:Dim sourceSheets As Variant sourceSheets = Array("一月", "二月", "三月") ' 替换成你的源工作表名 For Each wsSourceName In sourceSheets Set wsSource = wb.Sheets(wsSourceName) ' 后续处理逻辑不变 Next wsSourceName
内容的提问来源于stack exchange,提问作者Aaron Dunn
相关产品推荐
相关产品推荐

