VBA新手求助:复制多工作表数据至主表的代码运行中断
问题排查与修正方案
先看你代码中断的那一行,问题很明确:你试图把一个行号数字赋值给Range类型的变量PasteRg,这属于类型不匹配,VBA必然会报错中断。我们一步步梳理并修正所有问题:
核心错误点拆解
- 类型不匹配:
CorpFile.Cells(Rows.Count, 1).End(xlUp).Row + 1返回的是整数(目标粘贴行的行号),但PasteRg被声明为Range对象,不能直接把数字赋值给它,需要将行号转换为对应的Range对象。 - 遍历对象错误:
For Each Sheet In ThisWorkbook写法有误,ThisWorkbook是工作簿对象,你需要遍历它的Sheets集合,应该写成For Each Sheet In ThisWorkbook.Sheets。 - 判断逻辑错误:
If ActiveSheet.Name <> CorpFile Then里,CorpFile是工作表对象,应该和它的名称做比较,即Sheet.Name <> CorpFile.Name;而且循环里不该用ActiveSheet,要用循环变量Sheet指代当前遍历的工作表,否则只会复制初始激活的表数据。 - 变量作用域错误:你在循环外就把
CopyRg设为ActiveSheet.UsedRange,这样循环里始终只会复制初始激活表的内容,无法遍历处理每个工作表。
修正后的完整代码
Sub CallData() Dim CorpFile As Worksheet, currentSheet As Worksheet Dim CopyRg As Range, PasteRg As Range ' 定位主数据表 Set CorpFile = ThisWorkbook.Sheets("MasterData") ' 遍历工作簿中所有工作表 For Each currentSheet In ThisWorkbook.Sheets ' 跳过主数据表本身,避免重复复制 If currentSheet.Name <> CorpFile.Name Then ' 获取当前工作表的已使用数据区域 Set CopyRg = currentSheet.UsedRange ' 定位主数据表的下一个空行(A列),转换为合法的Range对象 Set PasteRg = CorpFile.Cells(CorpFile.Rows.Count, 1).End(xlUp).Offset(1, 0) ' 复制并粘贴数据(用Destination参数更简洁,也可按需改用PasteSpecial控制格式) CopyRg.Copy Destination:=PasteRg End If Next currentSheet MsgBox "数据合并完成!", vbInformation End Sub
关键修正细节说明
- 修正PasteRg赋值:用
Offset(1, 0)获取下一个空行的Range对象,替代直接取行号的写法,保证类型匹配。 - 规范遍历逻辑:用
currentSheet作为循环变量,遍历ThisWorkbook.Sheets,确保每个工作表都被处理。 - 优化判断条件:直接比较工作表名称,避免对象与字符串的错误对比。
- 调整CopyRg位置:将
CopyRg的赋值放在循环内,每次遍历新工作表时重新获取该表的已使用区域,确保复制的是当前表的数据。 - 添加友好提示:最后用
MsgBox提示操作完成,提升使用体验。
另外作为VBA新手,建议在模块顶部添加Option Explicit,它会强制你声明所有变量,能避免很多因变量名拼写错误导致的隐性问题。
内容的提问来源于stack exchange,提问作者Ajit Kumar
相关产品推荐
相关产品推荐

