Vba 外部宏上的错误处理

Vba 外部宏上的错误处理,vba,excel,Vba,Excel,我只是想知道是否有可能对外部宏进行错误处理。基本上,我想要实现的是,我每天都有数千本excel工作簿,我想打开它们并从中运行宏(只需使用Application.run功能即可轻松完成) 我想实现的是,如果外部宏发生错误,我想运行错误解决函数 这就是我目前所拥有的 Dim str_SearchFile, str_FileName, str_SearchPath As String Dim wb_WorkBook As Workbook Application.ScreenUpdatin

我只是想知道是否有可能对外部宏进行错误处理。基本上,我想要实现的是,我每天都有数千本excel工作簿,我想打开它们并从中运行宏(只需使用Application.run功能即可轻松完成)

我想实现的是,如果外部宏发生错误,我想运行错误解决函数

这就是我目前所拥有的

Dim str_SearchFile, str_FileName, str_SearchPath As String
Dim wb_WorkBook As Workbook


    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    str_ThisBook = ActiveWorkbook.Name 'Set the current workbook for later reference
        str_SearchPath = Sheets("Control Panel").Range("E2")
        str_SearchFile = Sheets("Control Panel").Range("E2") & "\*.xls*" 'Sets the file type to search for
        str_NextFile = Dir(str_SearchFile, vbDirectory) 'Sets the amount of files in the directory matching the criterea (.xls)

        Do While Len(str_NextFile) > 0
            On Error Resume Next
            Set wb_WorkBook = Workbooks.Open(Filename:=str_SearchPath & "\" & str_NextFile, Password:="")
            If Err.Number = 0 Then
                On Error GoTo 0
                Application.Run ("'" & str_NextFile & "'!Export")
                str_FileName = str_SearchPath & "\Done" & "\" & str_NextFile
                wb_WorkBook.Save
                wb_WorkBook.Close
                FileCopy (str_SearchPath & "\" & str_NextFile), str_FileName
                Kill (str_SearchPath & "\" & str_NextFile)
            End If
            str_NextFile = Dir
        Loop

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

End Sub
欢迎任何建议


提前感谢您

您将无法以您正在尝试的方式实现此功能

表示它(添加了强调):

启用错误处理例程并指定 程序中的常规;也可用于禁用 错误处理例程

将程序定义为:

作为一个单元执行的语句的命名序列。例如 函数、属性和子类是过程的类型。过程名 始终在模块级别定义。所有可执行代码必须是 包含在程序中。程序不能嵌套在其他程序中 程序

这意味着在调用另一本书中的宏之前调用错误处理将在被调用的宏中被忽略(通过测试确认)


启用错误处理的唯一方法是在调用宏之前实际修改工作簿中的代码。。。这很复杂。作为参考,这里有一个网页给出了一个。

我处理这个问题的最简单方法是将外部工作簿的“导出”子函数更改为一个返回值(比如整数)的函数

然后,您可以将错误捕获放入该函数中,并根据过程的结果返回,例如:

0 = All Went Well
1 = Failed to do XXX
2 = Failed to do YYY
然后,您可以将代码更改为以下内容:

Select Case Application.Run ("'" & str_NextFile & "'!Export")
Case 0
   MsgBox "All Went Well"

Case 1
   MsgBox "Failed to do XXX"

Case 2
   MsgBox "Failed to do YYY"

End Select
这将允许您将错误捕获放在它所属的位置,并了解该过程是如何运行的


希望这能有所帮助

看来我必须按照“老派”的方式来做,然后手动处理出现的错误。对,除非你能让工作簿创建者按照John Bustos的建议修复导出宏。我认为你应该把精力集中在这一点上,因为坐着等待错误比把所有失败的文件放在一个\failed\文件夹中要慢得多。有趣的建议!如果我可以操纵外部vba,我将对此进行研究。虽然不是我创建的,但这仍然需要更新数千个工作簿中的方法,以捕获它们自己的错误,这样才能工作。如果您正在处理的工作簿都具有完全相同的宏,您可以在处理工作簿中创建该宏的一个版本,并将引用传递给要对其进行操作的工作簿。然后,您可以编辑它以捕获任何错误,而无需修改数千本现有工作簿中的任何代码。
Select Case Application.Run ("'" & str_NextFile & "'!Export")
Case 0
   MsgBox "All Went Well"

Case 1
   MsgBox "Failed to do XXX"

Case 2
   MsgBox "Failed to do YYY"

End Select