You need to enable JavaScript to run this app. 如何用Excel VBA将两个工作表复制到新工作簿?含报错与代码名引用
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 17:06:03