使用CallByName调用classModule中的函数很容易,那么标准模块中的函数又如何呢?
''#inside class module
''#classModule name: clsExample
Function classFunc1()
MsgBox "I'm class module 1"
End Function
''#
''#inside standard module
''#Module name: module1
Function Func1()
MsgBox "I'm standard module 1"
End Function
''#
''# The main sub
Sub Main()
''# to call function inside class module
dim clsObj as New clsExample
Call CallByName(clsObj,"ClassFunc1")
''# here's the question... how to call a function inside a standard module
''# how to declare the object "stdObj" in reference to module1?
Call CallByName(stdObj,"Func1") ''# is this correct?
End Sub发布于 2012-10-25 00:41:47
我认为jtolle的回应最好地解决了这个问题--对Application.Run的简单引用可能就是答案。提问者不想简单地使用func1或Module1.func1 -人们首先想要使用CallByName的原因是在编译时不知道所需的function.sub名称。在这种情况下,Application.Run确实可以工作,例如:
Dim ModuleName As String
Dim FuncName As String
Module1Name = "Module1"
FuncName = "func1"
Application.Run ModuleName & "." & FuncName您还可以在ModuleName前面加上项目名称,并添加另一个句点".“。不幸的是,Application.Run不返回任何值,所以虽然您可以调用函数,但不会获得它的返回值。
发布于 2010-04-23 07:35:27
CallByName仅适用于类对象。
如果你的子例程在一个标准模块中,你可以这样做:
Sub Main()
Module1.Func1
End Sub如果它是一个函数,那么您可能希望捕获返回值;如下所示:
Sub Main()
Dim var
var = Module1.Func1
End Sub发布于 2020-01-04 01:06:35
尽管这是一个在标准模块中为CallByName提出的老问题和OP,但正确的建议散布在答案和评论中,其中一些可能不那么准确,至少在2020年是这样。正如SlowLearner声明的那样,Application.run确实返回了一个变量,在这种情况下,下面的两个分支是等价的,除了通过处理错误之外,就像在Horowitz的答案周围注释的那样:
Dim LoadEnumAndDataFrom as Variant
'FunctionName returns a Variant Array
if fCallByName then
LoadEnumAndDataFrom = CallByName(ClassObj, "FunctionNameAtClass", VbMethod)
else
'After moving back function for a standard module
LoadEnumAndDataFrom = Application.Run("StandardModuleName" & "." & "FunctionNameAtStandard")
endif我实际上只是在上面这样做,没有任何错误,在Word,Excel和Access中测试,两者都返回相同的数组。
不幸的是,有一个例外:Outlook的对象模型受到过多的保护,并且它没有Run方法。
https://stackoverflow.com/questions/2695198
复制相似问题