基于文件名或其他标准调用子程序

我正在调用一个基于打开的工作簿的文件名称的子程序。 我有工作簿一个名为“SubModel_OtherAdmin”,其中我正在执行存储VBA逻辑(子例程,函数等)的子例程和工作簿B. 我在工作簿B中创build一个名为“Assumptions_OtherAdmin”的子例程。 而不是使用:

Call Assumptions_OtherAdmin 

我想根据工作簿A中的文件名调用特定的子例程。大图,工作簿A可以是其他工作簿,例如“SubModel_Marketing”或“SubModel_Revenue”等。每个工作簿都将具有自己的假设子例程名称,存储在工作簿B中

我最初的想法是定义一个string,然后使用Call String但是这导致了一个错误。 我的第二个想法是在工作簿B中的标签中build立一个表格/网格,其中存储子程序,将我将要处理的可能的文件名称与其各自的假设子程序名称链接起来。 例如,在B列第二行,我会把文件名“SubModel_OtherAdmin”,并在C列第二行,我会把“假设_OtherAdmin”等。 我试图集思广益,如果我应该创build一个函数调用子例程通过查找列B中的文件名称并使用同一行中列C中的名称。 我发现自己回到使用上面提到的Call String相同的错误。 我正在看的另一个途径是使用select Case,但是我陷入了规划过程。 任何想法或build议将不胜感激。

Call关键字只是一个不赞成/过时的调用过程的方式。

这个:

 Call Assumptions_OtherAdmin 

与此相同:

 Assumptions_OtherAdmin 

实际上没有理由使用Call ,只是因为该语言的旧版本需要它,而且出于向下兼容性的原因,它仍然存在。


你可以通过名称来调用一个过程,特别是在excel-vba中 。 它的工作方式取决于程序的位置。


标准模块

如果代码是标准代码模块中的Public过程,则由于Excel的Application对象具有Run方法,所以给定一个Workbook对象和一个String过程名称,可以这样做:

 Public Sub CallMacroByName(ByVal book As Workbook, ByVal procedure As String) Dim qualifiedName As String If InStr(1, procedure, "'!") = 0 Then qualifiedName = "'" & book.FullName & "'!" & procedure Else qualifiedName = procedure 'assume procedure is qualified already End If Application.Run qualifiedName End Sub 

你会这样做:

 Public Sub DoSomething() Dim book As Workbook Set book = ActiveWorkbook CallMacroByName book, "MyProcedure" End Sub 

如果您所拥有的只是工作簿的全名,则可以调整此代码,使其无需参考相关书籍即可正常工作。


类模块

如果您需要调用的过程是位于类模块中的对象成员,那么您需要更加努力,并传递公开要调用的成员的对象实例。 好处是无论您的主机应用程序是否支持Application.Run ,它都能正常工作,因为您将使用VBA.Interaction.CallByName标准库函数:

 Public Sub CallObjectMemberByName(ByRef instance As Object, ByVal procedure As String) 'assumes procedure isn't a property accessor: CallByName instance, procedure, VbMethod End Sub 

你会这样做:

 Public Sub DoSomething(ByRef owner As Class1) 'assumes owner instance is provided by something else CallObjectMemberByName owner, "MyProcedure" End Sub 

如果你想要调用的程序是Private ,那么你运气不好。