3

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

Application.Run ("'" & ActiveWorkbook & "'!Export")

我想要实现的是,如果该外部宏发生错误,我想运行错误解决功能。

这是我到目前为止所拥有的

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

非常欢迎任何建议!

先感谢您

4

2 回答 2

3

您将无法按照您尝试的方式使其工作。

MSDN on Error Statement表明它(强调添加):

启用错误处理例程并指定例程在过程中的位置;也可用于禁用错误处理例程。

VBE 术语表将程序定义为:

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

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

您能够启用错误处理的唯一方法是在调用宏之前实际修改工作簿中的代码......这非常复杂。供您参考,这里是一个网页,提供了从 VBA 编辑项目代码的示例

于 2012-10-26T13:30:49.203 回答
2

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

然后你可以做的就是将错误捕获放入该函数中,并根据它可以返回的过程的结果,说:

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

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

希望这可以帮助

于 2012-10-26T13:33:32.923 回答