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

如何通过VBA循环行实现同一工作簿内Sheet1数据复制到Sheet2

问题需求

需要实现同一工作簿内用Sheet1的数据填充Sheet2,具体场景示例如下:
数据示例

填充规则

  • Sheet1每一行的C列条目先复制到Sheet2,同时复制该行对应的A、B、E列关联信息
  • 紧接着同一行的D列条目复制到Sheet2的下一行,同样携带对应A、B、E列关联信息
  • 循环操作直到Sheet1所有行的数据都处理完毕

注:宏按钮放在其他工作表中,代码需要显式引用每个工作表,避免出现活动工作表指向错误的问题。

原代码问题说明

你提供的原始代码核心问题是赋值方向颠倒,把Sheet2的值赋值给了Sheet1,和需求完全相反;同时使用了低效的Select、ActiveCell操作,还存在未限定工作表归属的Range引用,按钮放在其他工作表时极易出现执行错误。

修正后可用VBA代码

Sub 按规则拆分填充Sheet2()
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim NumRows As Long, i As Long, j As Long
    ' 显式定义工作表,避免按钮在其他表时引用错误
    Set ws1 = ThisWorkbook.Worksheets("Sheet1")
    Set ws2 = ThisWorkbook.Worksheets("Sheet2")
    ' 关闭屏幕更新提升运行速度
    Application.ScreenUpdating = False
    ' 获取Sheet1 C列有效数据行数
    NumRows = ws1.Range("C" & ws1.Rows.Count).End(xlUp).Row
    ' Sheet2从第4行开始写入,和原代码初始写入位置保持一致
    j = 4
    ' 遍历Sheet1所有数据行
    For i = 2 To NumRows
        ' 写入C列对应条目
        ws2.Cells(j, "A").Value = ws1.Cells(i, "A").Value
        ws2.Cells(j, "B").Value = ws1.Cells(i, "B").Value
        ws2.Cells(j, "C").Value = ws1.Cells(i, "C").Value
        ws2.Cells(j, "D").Value = ws1.Cells(i, "E").Value
        j = j + 1
        ' 写入D列对应条目
        ws2.Cells(j, "A").Value = ws1.Cells(i, "A").Value
        ws2.Cells(j, "B").Value = ws1.Cells(i, "B").Value
        ws2.Cells(j, "C").Value = ws1.Cells(i, "D").Value
        ws2.Cells(j, "D").Value = ws1.Cells(i, "E").Value
        j = j + 1
    Next i
    ' 恢复屏幕更新
    Application.ScreenUpdating = True
End Sub

优化点说明

  • 提前绑定工作表对象,无论宏按钮放在哪个工作表都能正确识别目标表
  • 去掉了界面操作类语句,运行时不会跳转工作表,执行效率更高
  • 自动识别有效数据行数,不需要额外判断空行终止条件
  • 字段对应关系和原代码保持一致,可直接适配你的原有业务逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:15:06