VBA实现动态数据源到不规则表单的批量数据复制需求
批量处理动态数据并生成总计的VBA方案
完整代码
Sub sbBatchCopyRangeToForm() Dim wsSource As Worksheet Dim wsTarget As Worksheet Dim lastSourceRow As Long Dim sourceRow As Long Dim targetStartRow As Long ' 初始化工作表对象(避免重复引用,提升稳定性) Set wsSource = ThisWorkbook.Sheets("51") Set wsTarget = ThisWorkbook.Sheets("Add 51") ' 获取源数据最后一行(动态判断数据范围,假设表头在第1行,数据从第2行开始) lastSourceRow = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row ' 设置目标表单的起始行(对应你最初的D10/A11位置) targetStartRow = 10 ' 循环遍历所有源数据行(从第2行开始,跳过表头) For sourceRow = 2 To lastSourceRow ' 单个源数据行对应目标表单的两行(targetStartRow 和 targetStartRow+1) ' 直接赋值替代Copy/Paste,提升效率且避免剪贴板冲突 wsTarget.Cells(targetStartRow + 1, "A").Value = wsSource.Cells(sourceRow, "H").Value ' 源H列→目标A11(对应startRow+1) wsTarget.Cells(targetStartRow + 1, "B").Value = wsSource.Cells(sourceRow, "C").Value ' 源C列→目标B11 wsTarget.Cells(targetStartRow, "D").Value = wsSource.Cells(sourceRow, "E").Value ' 源E列→目标D10(对应startRow) wsTarget.Cells(targetStartRow + 1, "D").Value = wsSource.Cells(sourceRow, "F").Value ' 源F列→目标D11 wsTarget.Cells(targetStartRow + 1, "E").Value = wsSource.Cells(sourceRow, "D").Value ' 源D列→目标E11 wsTarget.Cells(targetStartRow + 1, "I").Value = wsSource.Cells(sourceRow, "I").Value ' 源I列→目标I11 ' 目标行下移2行,准备处理下一条源数据 targetStartRow = targetStartRow + 2 Next sourceRow ' 添加总计行(以统计I列数值为例,可根据需求修改) Dim totalRow As Long totalRow = targetStartRow ' 总计行放在最后一条数据的下一行 wsTarget.Cells(totalRow, "A").Value = "总计" ' 计算I列从第11行到最后一条数据行的总和 wsTarget.Cells(totalRow, "I").Formula = "=SUM(I11:I" & (totalRow - 1) & ")" End Sub
关键改进点说明
- 工作表对象初始化:用
Set定义wsSource和wsTarget,避免重复调用Sheets("xxx"),减少出错概率,代码更易维护。 - 动态获取数据范围:通过
wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row自动识别源数据的最后一行,适配每月变化的数据集。如果源数据的表头列不是A列,只需将代码中的"A"替换为源数据实际有值的列即可。 - 循环批量处理:
For sourceRow = 2 To lastSourceRow遍历所有源数据行,每次处理后将目标起始行下移2行,完美匹配"单源数据行对应双表单行"的需求。 - 直接赋值替代复制粘贴:跳过
Copy/PasteSpecial操作,直接给单元格赋值,运行速度更快,同时避免剪贴板占用冲突。 - 自动生成总计行:在所有数据处理完成后,自动计算指定列的总和并写入总计行,可根据表单需求修改统计的列和公式。
内容的提问来源于stack exchange,提问作者Byg One
相关产品推荐
相关产品推荐

