VBA脚本问题:复制数据至另一工作表首空白行而非对应行
问题分析与解决方案
你的问题核心是粘贴位置直接绑定了源工作表的循环行号r,而非动态获取目标工作表的首空白行位置。原代码中rgPaste等对象均通过& r指定行号,导致源第N行的数据必然对应目标第N行,完全忽略了目标工作表的实际空白行分布。
修改后的代码
Option Explicit Sub Übertragen() Dim wbSource As Workbook Dim wsSource As Worksheet Dim wbTarget As Workbook Dim wsTarget As Worksheet Dim lastRowSource As Long Dim currentTargetRow As Long Dim r As Long ' 绑定工作簿与工作表对象,简化重复引用 Set wbSource = Workbooks("A1") Set wsSource = wbSource.Worksheets("A2") Set wbTarget = Workbooks("B1") Set wsTarget = wbTarget.Worksheets("B2") ' 获取源数据表最后一行 lastRowSource = wsSource.Range("A" & wsSource.Rows.Count).End(xlUp).Row ' 获取目标表当前首空白行(从A列判断) currentTargetRow = wsTarget.Range("A" & wsTarget.Rows.Count).End(xlUp).Row + 1 For r = 2 To lastRowSource With wsSource If .Range("I" & r).Value Like "eingegangen*" And .Cells(r, "S").Value <> 1 Then ' 标记该行已处理 .Cells(r, "S").Value = 1 ' 直接赋值替代复制粘贴,提升运行效率 wsTarget.Cells(currentTargetRow, "G").Value = .Range("D" & r).Value wsTarget.Cells(currentTargetRow, "I").Value = .Range("E" & r).Value wsTarget.Cells(currentTargetRow, "L").Value = .Range("F" & r).Value wsTarget.Cells(currentTargetRow, "J").Value = .Range("H" & r).Value ' 填写固定字段内容 wsTarget.Cells(currentTargetRow, "B").Value = Date wsTarget.Cells(currentTargetRow, "C").Value = "status" wsTarget.Cells(currentTargetRow, "E").Value = "company name" ' 目标行号递增,确保下一条数据粘贴到新空白行 currentTargetRow = currentTargetRow + 1 End If End With Next r End Sub
关键修改说明
- 动态目标行管理:新增
currentTargetRow变量,初始化为目标表首空白行,每次粘贴后自动递增,彻底摆脱源行号的绑定。 - 对象绑定优化:将工作簿、工作表赋值给变量,避免重复书写长路径引用,提升代码可读性与运行效率。
- 替换复制粘贴:直接通过
Value属性赋值,替代剪贴板操作,既避免了剪贴板占用问题,又大幅提升运行速度。 - 强制变量声明:添加
Option Explicit,强制所有变量必须声明,避免因变量名拼写错误导致的隐性bug。
内容的提问来源于stack exchange,提问作者user22566014
相关产品推荐
相关产品推荐

