Excel VBA双工作簿切换遍历工作表复制数据问题求助
VBA跨工作簿拷贝工作表修正方案
修正后完整代码
Sub Test1() Dim WshtNames As Variant Dim WshtNameCrnt As Variant Dim WB1 As Workbook Dim WB2 As Workbook ' 显式绑定运行宏的ORG文件 Set WB1 = ThisWorkbook ' 打开存放数据的NOT_ORG文件 Set WB2 = Workbooks.Open("C:\NOT_ORG.xlsx") ' 指定需要匹配的工作表名数组 WshtNames = Array("2", "3") For Each WshtNameCrnt In WshtNames ' 判断WB2中是否存在对应工作表,避免不存在时报错 Dim wsExists As Boolean wsExists = False On Error Resume Next wsExists = Not WB2.Worksheets(WshtNameCrnt) Is Nothing On Error GoTo 0 If wsExists Then ' 复制WB2对应工作表的内容,当前为复制A1单元格,可按需调整范围 WB2.Worksheets(WshtNameCrnt).Range("A1").Copy ' 在WB1中新建带_new后缀的工作表 Dim newWs As Worksheet Set newWs = WB1.Sheets.Add newWs.Name = WshtNameCrnt & "_new" ' 粘贴内容到新表 newWs.Range("A1").PasteSpecial Paste:=xlPasteAll ' 清空剪贴板 Application.CutCopyMode = False End If Next WshtNameCrnt ' 可选:处理完成后自动关闭NOT_ORG文件,不保存修改 ' WB2.Close SaveChanges:=False End Sub
核心调整说明
- 用
ThisWorkbook替代ActiveWorkbook绑定运行宏的ORG文件,避免文件切换时绑定对象偏移出错 - 所有工作表、单元格操作都显式指定所属工作簿,不会出现默认引用当前激活文件的逻辑混乱
- 新增工作表存在性校验逻辑,避免数组中指定的工作表名在NOT_ORG文件不存在时触发运行时错误
- 去掉了冗余的
Activate、Select操作,VBA操作单元格无需选中对象,显式引用即可,运行效率更高、稳定性更强
如果需要复制整张工作表的全部内容而非仅A1单元格,可将复制行替换为WB2.Worksheets(WshtNameCrnt).UsedRange.Copy,仅拷贝有数据的区域,运行效率更高
内容的提问来源于stack exchange,提问作者eM_Sk
相关产品推荐
相关产品推荐

