如何在Excel中批量重复工作表行(每行重复57次)
高效实现Excel每行重复指定次数的方案
问题背景
现有含39列的Excel工作表,共5000+条记录,需要将每行重复57次,最终每条记录保留58份副本。当前使用的VBA代码仅能在每行下方插入57个空白行,操作繁琐且效率极低,需更高效的实现方式。
原数据示例:每行包含39列结构化数据
期望效果示例:每行原始记录后跟随57条完全相同的副本
原代码低效原因
当前代码存在两个核心问题:
- 逐列循环执行插入操作,总共执行39次大循环,每次循环都要操作数千行,IO开销极大
- 仅插入空白行,未自动填充原始数据,后续还需额外操作完成复制,完全没达到最终需求
高效VBA解决方案
以下代码通过数组批量处理实现,直接生成目标数据后一次性写入工作表,避免频繁的Excel界面交互,处理5000+行数据仅需几秒:
Sub BatchDuplicateRows() Dim ws As Worksheet Dim originalData As Variant, targetData As Variant Dim lastRow As Long, lastCol As Long Dim repeatTimes As Long Dim i As Long, j As Long, k As Long ' 配置参数 Set ws = ThisWorkbook.Sheets("MasterSheet") ' 目标工作表 repeatTimes = 57 ' 重复次数(最终每条共58份) ' 关闭屏幕更新与事件,提升速度 Application.ScreenUpdating = False Application.EnableEvents = False ' 获取原始数据范围 lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column originalData = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol)).Value ' 初始化目标数组 ReDim targetData(1 To lastRow * (repeatTimes + 1), 1 To lastCol) ' 填充目标数组 For i = 1 To lastRow For k = 0 To repeatTimes For j = 1 To lastCol targetData((i - 1) * (repeatTimes + 1) + k + 1, j) = originalData(i, j) Next j Next k Next i ' 将目标数组写入工作表(可选择覆盖原数据或写入新工作表) ' 方案1:覆盖原数据 ws.Range("A1").Resize(UBound(targetData, 1), UBound(targetData, 2)).Value = targetData ' 方案2:写入新工作表(取消注释使用) ' Dim newWs As Worksheet ' Set newWs = ThisWorkbook.Sheets.Add(After:=ws) ' newWs.Range("A1").Resize(UBound(targetData, 1), UBound(targetData, 2)).Value = targetData ' 恢复系统设置 Application.ScreenUpdating = True Application.EnableEvents = True MsgBox "批量重复完成!共生成" & UBound(targetData, 1) & "行数据" End Sub
代码说明
- 先将原始数据读取到内存数组,避免反复读取工作表
- 根据重复次数计算目标数据的总行数,创建对应的内存数组
- 循环将每行原始数据复制到目标数组的对应位置
- 一次性将目标数组写入工作表,仅一次IO操作,效率拉满
- 关闭屏幕更新和事件触发,进一步提升运行速度
替代方案:Power Query(无需编程)
如果不熟悉VBA,可使用Excel内置的Power Query工具,步骤如下:
- 选中原始数据范围,点击「数据」选项卡 → 「从表格/区域」(Excel会自动识别数据并导入Power Query编辑器)
- 在Power Query编辑器中,选中所有列,点击「转换」选项卡 → 「重复行」
- 在弹出的窗口中输入57(重复次数),点击确定
- 点击「主页」选项卡 → 「关闭并上载」,将处理后的数据导入新工作表
这种方法无需编写代码,操作直观,处理大数据量同样高效。
内容的提问来源于stack exchange,提问作者EuanM28
相关产品推荐
相关产品推荐

