如何使用VBA将以##为分隔符的每组行数据转置为多列
VBA实现按##分组行转多列方案
实现逻辑
- 遍历原始数据首列所有行,自动识别
##分组标记 - 每识别到一个
##,就开启一行新的输出记录,第一列固定为## - 自动收集该
##之后、下一个##之前的所有非空内容,去除单元格首尾空格后依次填充到当前输出行的后续列 - 关闭屏幕更新优化运行效率,适配10000行级数据秒级处理
完整VBA代码
Sub 按##分组转置多列() Dim srcSheet As Worksheet, outSheet As Worksheet Dim lastRow As Long, i As Long, outRow As Long, outCol As Long Dim isCollecting As Boolean ' 配置工作表:srcSheet为原始数据所在表,outSheet为结果输出表,可修改表名匹配你的文件 Set srcSheet = ThisWorkbook.Worksheets("Sheet1") Set outSheet = ThisWorkbook.Worksheets("Sheet2") ' 获取原始数据最后一行行号 lastRow = srcSheet.Cells(Rows.Count, 1).End(xlUp).Row outRow = 0 isCollecting = False ' 关闭屏幕更新提升运行速度 Application.ScreenUpdating = False outSheet.Cells.Clear ' 清空输出表原有内容 For i = 1 To lastRow Dim cellVal As String ' 去除单元格首尾空格,不需要的话可以删掉Trim() cellVal = Trim(srcSheet.Cells(i, 1).Value) If cellVal = "##" Then ' 碰到分组标记,新增输出行 outRow = outRow + 1 outCol = 1 outSheet.Cells(outRow, outCol).Value = "##" outCol = outCol + 1 isCollecting = True ElseIf isCollecting And cellVal <> "" Then ' 收集分组内非空内容,填充到后续列 outSheet.Cells(outRow, outCol).Value = cellVal outCol = outCol + 1 End If Next i Application.ScreenUpdating = True MsgBox "转置完成,共处理" & outRow & "组数据" End Sub
使用步骤
- 打开目标Excel文件,按
Alt+F11调出VBA编辑器 - 右键左侧工程列表中的当前工作簿,选择「插入」-「模块」
- 将上述代码粘贴到弹出的模块编辑窗口中
- 修改代码中
srcSheet和outSheet后的工作表名称,和你实际的表名保持一致 - 按
F5运行代码,等待完成提示弹窗即可
自定义调整说明
- 若需要保留单元格原始的前导、后置空格,删除代码中
cellVal = Trim(srcSheet.Cells(i, 1).Value)里的Trim()函数即可 - 若需要保留分组内的空行参与转置,删除判断条件里的
And cellVal <> ""即可
内容的提问来源于stack exchange,提问作者alpha
相关产品推荐
相关产品推荐

