如何用Excel VBA将两个工作表复制到新工作簿?含报错与代码名引用
VBA 多工作表批量复制到新工作簿(基于代码名实现)
原代码报错原因
「运行时错误13:类型不匹配」的核心触发点为:
- 错误使用
Workbooks(NewBook)作为集合入参:Workbooks集合仅支持传入工作簿名称字符串、工作簿索引数字获取对应对象,直接传入已实例化的Workbook对象,必然触发类型不匹配报错 - 冗余逻辑的潜在问题:代码中重复给
MyBook赋值、逐表复制时将后插入的表放到新工作簿最前端,最终会导致表顺序和预期相反,属于无意义的额外操作
基于工作表代码名的实现方案
工作表代码名(CodeName)是VBA工程内的固定标识,不会随工作表显示名修改、前后顺序调整而变化,是比表名、数字索引更可靠的引用方式。
具体实现代码:
Sub CopyBillStatAndCosts() ' Array内替换为对应两个目标工作表的代码名 ' 未自定义代码名时,原索引为9、11的工作表默认代码名即为Sheet9、Sheet11 Dim targetSheets As Variant targetSheets = Array(Sheet9, Sheet11) ' 无参数调用Copy方法时,会自动将选中的工作表复制到全新独立工作簿 ThisWorkbook.Sheets(targetSheets).Copy ' 清理新工作簿默认生成的空白Sheet On Error Resume Next ActiveWorkbook.Sheets("Sheet1").Delete On Error GoTo 0 End Sub
实现说明
- 代码名支持自定义:在VBA编辑器左侧工程资源管理器选中目标工作表,在属性窗口修改
(名称)项,即可将默认的SheetX改为辨识度更高的标识(比如wsBillStat、wsCost),后续代码直接引用自定义名称即可,无需记忆表的索引位置 - 相比靠工作表显示名复制的基础写法:该实现不会因为用户误改工作表名称触发报错,稳定性更高
- 批量复制的表顺序完全和数组内的排列顺序一致,不会出现逐表粘贴导致的顺序颠倒问题
内容的提问来源于stack exchange,提问作者Rycliff
相关产品推荐
相关产品推荐

