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

VBA代码将数据写入源工作簿而非汇总工作簿问题求助

问题排查与修正方案

嘿,你的问题根源其实是没有明确指定数据写入的目标工作簿/工作表,VBA默认会使用当前激活的工作簿来执行Cells这类操作——哪怕你打开了汇总工作簿,只要没限定对象归属,就很容易把数据写到源工作簿里。

具体错误点拆解

  • 你用MyData.Worksheets("Sheet1").Select选中了汇总表的Sheet1,但后续的Worksheets("Sheet1").Range("a1").Select、RowCount = Worksheets("Sheet1").Cells(...)以及Cells(RowCount, "b") = Assignment都没指定父工作簿,VBA会自动绑定到ThisWorkbook(也就是你的源工作簿WB1)。
  • Select这类操作本身就不稳定,一旦代码执行时窗口被手动切换,直接会导致引用对象出错,这也是VBA新手常踩的坑。

修正后的代码

我帮你重写了代码,去掉了不必要的Select操作,并且给所有对象都加了明确归属,彻底解决写入错位的问题:

Sub TransferData()
    Dim WB1 As Workbook
    Dim MyData As Workbook
    Dim Assignment As String
    Dim RowCount As Long ' 用Long代替Integer,避免行数超过32767时溢出
    Dim targetSheet As Worksheet
    
    Set WB1 = ThisWorkbook
    ' 明确指定源数据所在的工作表,避免默认引用错误
    Assignment = WB1.Worksheets("Sheet1").Cells(45, "C").Value
    WB1.Save
    
    ' 打开汇总工作簿(记得替换成你的实际文件路径)
    Set MyData = Workbooks.Open("C:\你的汇总文件路径\汇总工作簿.xlsx")
    ' 定义目标工作表对象,后续直接引用更清晰
    Set targetSheet = MyData.Worksheets("Sheet1")
    
    ' 计算目标表的第一个空行(从C列判断)
    RowCount = targetSheet.Cells(targetSheet.Rows.Count, "C").End(xlUp).Row + 1
    
    ' 明确指定写入目标工作表
    targetSheet.Cells(RowCount, "B").Value = Assignment
    
    MyData.Save
    ' 可选:如果需要自动关闭汇总工作簿,可添加下面一行
    ' MyData.Close SaveChanges:=False ' 已经Save过,这里设为False即可
End Sub

关键优化细节

  • 所有单元格引用都绑定到具体的工作簿/工作表对象,彻底杜绝默认引用的歧义。
  • 用Long类型存储行数,Excel的最大行数远超过Integer的上限(32767),避免出现溢出错误。
  • 移除所有Select操作,让代码执行更稳定、速度更快。
  • 新增targetSheet对象变量,让代码逻辑更简洁易读。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:25:27