我试图创建一个宏(在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
不起作用,因为编译器错误在运行时之前,所以它没有被执行。
我想我必须以不同的方式做到这一点,但我无法想象如何做到这一点,任何帮助或想法?
非常感谢!
答案 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