2012-10-26 63 views
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 

任何意见是非常欢迎!

预先感谢您

+0

如果你正在处理的工作簿中所有具有完全相同的宏,你可以在你的处理工作簿中创建一个版本的它,并通过它,你希望它运行到工作簿引用。然后,您可以对其进行编辑以捕获任何错误,而无需更改数千个现有工作簿中的任何代码。 –

回答

3

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

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

使一个错误处理例程,并指定 例程的过程内的位置;也可以用来禁用一个错误处理程序 。

VBE Glossary限定过程为:

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

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

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

+0

看来,我将不得不做这个“旧学校”,出现什么错误然后手动处理它。 –

+0

没错,除非你可以让工作簿创建者根据John Bustos的建议来修复Export宏。我认为你应该把精力集中在这一点上,因为不必将所有失败的文件放在\ Failed \文件夹中,坐下来等待错误的时间效率要低得多。 –

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 

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

希望这有助于

+0

有趣的建议!我会研究这个,如果我可以操纵外部vba。虽然它不是由我创建的嘻嘻 –

+0

这仍然需要更新数千个工作簿中的方法来捕获他们自己的错误才能使其工作。 –