外部宏的错误处理

时间:2012-10-26 12:01:21

标签: vba excel-vba excel

我只是想知道是否可以对外部宏进行错误处理。基本上我想要实现的是我每天都有成千上万的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

非常欢迎任何建议!

提前谢谢

2 个答案:

答案 0 :(得分:3)

你无法按照自己的方式工作。

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

  

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

VBE Glossary将过程定义为:

  

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

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

您能够启用错误处理的唯一方法是在调用宏之前实际修改工作簿中的代码...这非常复杂。供您参考,这是一个提供example of editing project code from VBA的网页。

答案 1 :(得分: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

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

希望这会有所帮助