You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel VBA循环批量复制两个独立单元格至新工作簿问题

Excel VBA循环批量复制独立单元格数据到新建工作簿问题解决

需求

编写Excel VBA循环,批量将两个独立列(D列、AA列)的对应行数据,一次性复制到模板工作簿的指定单元格,另存为新工作簿。

原代码及问题

以下是初始代码,可运行但会重复获取相同单元格数据:

Dim ObjWorkbook As Workbook, PerWorkbook As Workbook
Set ObjWorkbook = Workbooks.Open( _
"A:\Master PAYE Costs Dec 23.xlsx")

Set PerWorkbook = Workbooks.Open( _
  "A:\Name Surname-Feb24-Timesheet 1.xlsx")

Dim cRng As Range, sRng As Range, c As Range
Dim Row As Range, totalRng As Range, cell As Range
Dim strName As String, pName As String

strName = "-Feb24-Timesheet"

Dim folderPath As String

folderPath = Application.ActiveWorkbook.Path


Set cRng = ObjWorkbook.Sheets("Payroll - Nov 23").Range("AA3:AA103")
Set sRng = ObjWorkbook.Sheets("Payroll - Nov 23").Range("D3:D103")
Set totalRng = Union(cRng, sRng)


For Each Row In totalRng.Rows
  For Each cell In Row.Cells
    Debug.Print cell.Value & strName
    PerWorkbook.Sheets("Timesheet").Range("B2") = cell.Value
    PerWorkbook.Sheets("Timesheet").Range("AM4") = cell.Value
    PerWorkbook.SaveCopyAs (folderPath & "\Timesht\" & cell.Value & strName & ".xlsx")
  Next cell
Next Row

问题原因:使用Union合并两列后,遍历每行的每个单元格时,会分别处理D列和AA列的单元格,导致每次循环只赋值单个单元格到B2和AM4,重复生成相同数据的文件。

更新后代码及错误

修改后的代码出现语法错误,提示「Invalid cell control variable reference」,错误位置为倒数第二行的Next cell语句:

For Each Row In totalRng.Rows
  For Each cell In Row.Cells
    Debug.Print cell.Value & strName
    PerWorkbook.Sheets("Timesheet").Range("B2") = cell.Value
  Next cell
  For Each cell2 In Row.Cells
    PerWorkbook.Sheets("Timesheet").Range("AM4") = cell2.Value
  Next cell2
  'ObjWorkbook.SaveCopyAs (
  PerWorkbook.SaveCopyAs (folderPath & "\Timesht\" & cell.Value & 
strName & ".xlsx")
  Next cell
Next Row

错误原因:代码末尾多了一个Next cell,没有对应的For Each cell循环,导致循环结构不匹配,触发语法错误。

最终解决方案

核心逻辑:直接按行索引对应获取D列和AA列的一组数据,赋值到模板工作簿后另存为新文件,避免使用Union导致的遍历混乱。

正确代码如下:

Dim ObjWorkbook As Workbook, PerWorkbook As Workbook
Dim wsPayroll As Worksheet
Dim lastRow As Long
Dim i As Integer
Dim strName As String
Dim folderPath As String
Dim empName As String
Dim payValue As String

' 打开源数据工作簿和模板工作簿
Set ObjWorkbook = Workbooks.Open("A:\Master PAYE Costs Dec 23.xlsx")
Set PerWorkbook = Workbooks.Open("A:\Name Surname-Feb24-Timesheet 1.xlsx")
' 绑定源数据工作表
Set wsPayroll = ObjWorkbook.Sheets("Payroll - Nov 23")

strName = "-Feb24-Timesheet"
' 获取保存路径
folderPath = Application.ActiveWorkbook.Path
' 获取数据最后一行(避免固定103行的硬编码)
lastRow = wsPayroll.Cells(wsPayroll.Rows.Count, "D").End(xlUp).Row

' 从第3行开始循环到最后一行
For i = 3 To lastRow
    ' 获取D列(姓名)和AA列(薪资数据)的值
    empName = wsPayroll.Cells(i, "D").Value
    payValue = wsPayroll.Cells(i, "AA").Value
    
    ' 跳过空值,避免生成无效文件
    If empName <> "" Then
        ' 赋值到模板工作簿的指定单元格
        PerWorkbook.Sheets("Timesheet").Range("B2").Value = empName
        PerWorkbook.Sheets("Timesheet").Range("AM4").Value = payValue
        
        ' 另存为新工作簿
        PerWorkbook.SaveCopyAs folderPath & "\Timesht\" & empName & strName & ".xlsx"
    End If
Next i

' 关闭工作簿(可选,避免占用资源)
ObjWorkbook.Close SaveChanges:=False
PerWorkbook.Close SaveChanges:=False

' 释放对象
Set wsPayroll = Nothing
Set ObjWorkbook = Nothing
Set PerWorkbook = Nothing

代码说明

  • 直接按行循环,同时获取D列和AA列的对应值,一次性完成两个单元格的赋值,避免重复操作
  • 添加空值判断,跳过无数据的行,防止生成空文件名的无效文件
  • 使用lastRow动态获取数据最后一行,替代固定的103行,提升代码灵活性
  • 循环结束后关闭工作簿并释放对象,避免内存占用

内容的提问来源于stack exchange,提问作者Geographos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 18:40:40