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

VBA宏曾正常运行,现报1004“应用程序定义或对象定义错误”

VBA宏触发1004错误的排查与修复方案

核心错误原因分析

调试指向的复制行触发1004错误,大概率是以下几种情况:

  • 打开的文件中没有名为"Summary"的工作表:代码默认所有目标文件都包含这个工作表,但如果某份文件的表被改名、删除,就会直接报错。
  • 遍历到非.xlsx格式文件:原代码用*.*遍历所有文件,可能打开了.csv、.txt等非Excel格式文件,这类文件里不存在"Summary"工作表,触发错误。
  • 目标列计算逻辑错误:当汇总表"TestData"的第一行完全为空时,Cells(1,1).End(xlToRight)会跳到Excel的最后一列(XFD列),此时emptyColumn +1会超出工作表列数上限,导致报错。
  • 汇总工作簿缺少"TestData"工作表:如果当前激活的工作簿里没有这个表,后续所有操作都会失效。

针对性修复方案

1. 只遍历.xlsx格式文件

将遍历文件的代码从:

mySceFileName = Dir(myFolderName & "*.*")

修改为:

mySceFileName = Dir(myFolderName & "*.xlsx")

避免打开非目标格式的文件。

2. 检查源文件的"Summary"表是否存在

打开文件后先做存在性判断,不存在则跳过该文件:

Dim summarySheet As Worksheet
On Error Resume Next
Set summarySheet = SceWb.Sheets("Summary")
On Error GoTo 0
If summarySheet Is Nothing Then
    MsgBox "文件" & mySceFileName & "中未找到Summary工作表,已跳过"
    SceWb.Close False
    mySceFileName = Dir
    GoTo NextLoop
End If

3. 修正空列计算逻辑

当第一行全空时,直接将目标列设为1,避免跳到最后一列:

emptyColumn = SummWb.Sheets("TestData").Cells(1, Columns.Count).End(xlToLeft).Column
If emptyColumn = 1 And SummWb.Sheets("TestData").Cells(1,1).Value = "" Then
    emptyColumn = 1
Else
    emptyColumn = emptyColumn + 1
End If

4. 提前验证汇总表"TestData"存在性

在代码开头添加检查,避免无意义的后续操作:

On Error Resume Next
Dim testDataSheet As Worksheet
Set testDataSheet = SummWb.Sheets("TestData")
On Error GoTo 0
If testDataSheet Is Nothing Then
    MsgBox "当前工作簿中未找到TestData工作表,请确认后重试"
    Application.ScreenUpdating = True
    Exit Sub
End If

优化后的完整代码

Sub SummariseDataCCETR13Test()
    Dim SummWb As Workbook
    Dim SceWb As Workbook
    Dim testDataSheet As Worksheet
    Dim summarySheet As Worksheet
    Dim myFolderName As String
    Dim mySceFileName As String
    Dim emptyColumn As Long
    Dim oldStatusBar As Boolean
    
    '选择目标文件夹
    With Application.FileDialog(msoFileDialogFolderPicker)
        .AllowMultiSelect = False
        If .Show <> -1 Then Exit Sub '用户取消选择则退出
        myFolderName = .SelectedItems(1)
    End With
    If Right(myFolderName, 1) <> "\" Then myFolderName = myFolderName & "\"
    
    '环境设置
    Application.ScreenUpdating = False
    oldStatusBar = Application.DisplayStatusBar
    Application.DisplayStatusBar = True
    Set SummWb = ActiveWorkbook
    
    '检查汇总表是否存在
    On Error Resume Next
    Set testDataSheet = SummWb.Sheets("TestData")
    On Error GoTo 0
    If testDataSheet Is Nothing Then
        MsgBox "当前工作簿中未找到TestData工作表,请确认后重试"
        GoTo Cleanup
    End If
    
    '遍历.xlsx文件
    mySceFileName = Dir(myFolderName & "*.xlsx")
    Do While mySceFileName <> ""
        Application.StatusBar = "Processing: " & mySceFileName
        Set SceWb = Workbooks.Open(myFolderName & mySceFileName)
        
        '检查源文件是否有Summary工作表
        On Error Resume Next
        Set summarySheet = SceWb.Sheets("Summary")
        On Error GoTo 0
        If summarySheet Is Nothing Then
            MsgBox "文件" & mySceFileName & "中未找到Summary工作表,已跳过"
            SceWb.Close False
            mySceFileName = Dir
            GoTo NextLoop
        End If
        
        '计算目标空列
        emptyColumn = testDataSheet.Cells(1, Columns.Count).End(xlToLeft).Column
        If emptyColumn = 1 And testDataSheet.Cells(1, 1).Value = "" Then
            emptyColumn = 1
        Else
            emptyColumn = emptyColumn + 1
        End If
        
        '复制数据
        summarySheet.Range("A14:B150").Copy testDataSheet.Cells(1, emptyColumn)
        
        '关闭源文件
        SceWb.Close False
NextLoop:
        mySceFileName = Dir
    Loop
    
Cleanup:
    '恢复环境设置
    Application.StatusBar = False
    Application.DisplayStatusBar = oldStatusBar
    SummWb.Activate
    'SummWb.Save '需要自动保存则取消注释
    Application.ScreenUpdating = True
End Sub

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:37:06