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
相关产品推荐
相关产品推荐

