You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将工作簿中除首工作表外的其余工作表复制到另一工作簿

解决VBA复制工作表时的"Object doesn't support this property or method"错误

问题说明

需求:将SD09_KW.xlsm中除第一个工作表外的所有工作表复制到Pending SD09工作簿,复制完成后关闭目标工作簿。

  • 初始代码问题:复制了源工作簿的所有工作表(包含首表),且错误复制了目标工作簿内的表。
  • 修改后代码在语句DataWorkbook.Sheets(i).copy After:=PendingWorkbook.Sheets(PendingWorkbook.Worksheets.Count)处报错:Object doesn't support this property or method。

错误原因

  1. 集合类型混淆:Sheets集合包含工作表、图表等所有表对象,Worksheets仅包含工作表。用Worksheets.Count作为索引去访问Sheets集合,若目标工作簿存在非工作表对象,会导致索引不匹配或引用错误类型的对象,触发属性/方法不支持的错误。
  2. 未定义依赖函数:代码中调用了SheetExists但未提供实现,会导致逻辑判断失效。
  3. 工作簿打开逻辑缺陷:直接用Workbooks.Open打开目标工作簿,若文件已处于打开状态会报错。

修正后的完整代码

Sub CopySD(sysnum As String)
    Dim DataWorkbook As Workbook, PendingWorkbook As Workbook
    Dim i As Long
    
    ' 打开或获取源工作簿
    On Error Resume Next
    Set DataWorkbook = Workbooks("SD093_KW.xlsm")
    On Error GoTo 0
    If DataWorkbook Is Nothing Then
        Set DataWorkbook = Workbooks.Open("C:\Users\Documents\SD093_KW.xlsm")
    End If
    
    ' 打开或获取目标工作簿
    On Error Resume Next
    Set PendingWorkbook = Workbooks("Pending SD093.xlsx")
    On Error GoTo 0
    If PendingWorkbook Is Nothing Then
        Set PendingWorkbook = Workbooks.Open("C:\Users\Documents\Pending SD093.xlsx")
    End If
    
    ' 复制源工作簿中除第一个工作表外的所有工作表
    For i = 2 To DataWorkbook.Worksheets.Count
        ' 检查目标工作簿中是否已存在同名工作表
        If Not SheetExists(DataWorkbook.Worksheets(i).Name, PendingWorkbook) Then
            ' 修正:使用Worksheets集合确保操作对象为工作表
            DataWorkbook.Worksheets(i).Copy After:=PendingWorkbook.Worksheets(PendingWorkbook.Worksheets.Count)
        End If
    Next i
    
    ' 保存并关闭目标工作簿
    PendingWorkbook.Close SaveChanges:=True
    
    ' 删除源工作簿中除第一个工作表外的所有表(按需保留)
    Application.DisplayAlerts = False
    For i = DataWorkbook.Worksheets.Count To 2 Step -1
        DataWorkbook.Worksheets(i).Delete
    Next i
    Application.DisplayAlerts = True
End Sub

' 实现SheetExists函数:检查指定工作簿中是否存在指定名称的工作表
Function SheetExists(sheetName As String, wb As Workbook) As Boolean
    Dim ws As Worksheet
    On Error Resume Next
    Set ws = wb.Worksheets(sheetName)
    On Error GoTo 0
    SheetExists = Not ws Is Nothing
End Function

关键修改点

  • 统一集合类型:将复制语句中的Sheets替换为Worksheets,确保操作对象均为工作表,避免类型不匹配。
  • 补充依赖函数:实现SheetExists函数,用于准确判断目标工作簿中是否已存在要复制的工作表。
  • 优化工作簿打开逻辑:先检查工作簿是否已打开,避免重复打开导致的错误。
  • 明确循环范围:使用DataWorkbook.Worksheets.Count确保只遍历源工作簿的工作表,排除非工作表对象的干扰。

内容的提问来源于stack exchange,提问作者user20114520

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:25:38