调用有时不存在的子或函数

时间:2018-04-19 16:23:04

标签: vba

我试图创建一个宏(在PERSONAL.XLSB中),每次打开工作簿时,它都会检查一个条件以及它是否为真(这意味着打开的工作簿包含一个特定的子),它称之为Sub。

Option Explicit

Private WithEvents App As Application

Private Sub Workbook_Open()

   Set App = Application

End Sub

Private Sub App_WorkbookOpen(ByVal Wb As Workbook)

   If condition Then Call Specific_Sub

End Sub

当我打开包含该Sub的文件时它运行正常,但是,如果Sub不在文件中,编译器会自然地返回错误“Sub or Function not defined”。

我正在努力寻找一种方法来处理错误,但是On error GoTo不起作用,因为编译器错误在运行时之前,所以它没有被执行。 我想我必须以不同的方式做到这一点,但我无法想象如何做到这一点,任何帮助或想法? 非常感谢!

2 个答案:

答案 0 :(得分:1)

感谢答案,我发现最好的方法是使用Application.Run。为了使代码尽可能简单,我只是将最后一部分改为:

Private Sub App_WorkbookOpen(ByVal Wb As Workbook)

   On Error Resume Next

   If condition Then
      Application.Run ("'" & ActiveWorkbook.FullName & "'!" & "Specific_Sub")
   End If

End Sub

谢谢大家。

答案 1 :(得分:0)

我从几个网站拼凑了这个。关键是您的子例程名称在变量和应用程序中。 run使用变量。这会超过您遇到的编译器错误

Sub SubExists()
        Dim ByModule As Object
        Dim ByModuleName As String
        Dim BySub As String
        Dim ByLine As Long
        '
        'Module and sub names
        ByModuleName = "Module1"
        BySub = "Specific_Sub"

        On Error Resume Next
        Set ByModule = ActiveWorkbook.VBProject.vbComponents(ByModuleName).CodeModule
        ByLine = ByModule.ProcStartLine(BySub, vbext_pk_Proc)
        If Err.Number = 0 Then
            Application.Run BySub
        End If
    End Sub

Private Sub App_WorkbookOpen(ByVal Wb As Workbook)

   SubExists

End Sub