首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在VB/VBA中使用"CallByName“调用模块中包含的子函数或函数

在VB/VBA中使用"CallByName“调用模块中包含的子函数或函数
EN

Stack Overflow用户
提问于 2010-04-23 07:21:17
回答 5查看 71.4K关注 0票数 11

使用CallByName调用classModule中的函数很容易,那么标准模块中的函数又如何呢?

代码语言:javascript
复制
''#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
EN

回答 5

Stack Overflow用户

发布于 2012-10-25 00:41:47

我认为jtolle的回应最好地解决了这个问题--对Application.Run的简单引用可能就是答案。提问者不想简单地使用func1或Module1.func1 -人们首先想要使用CallByName的原因是在编译时不知道所需的function.sub名称。在这种情况下,Application.Run确实可以工作,例如:

代码语言:javascript
复制
Dim ModuleName As String
Dim FuncName As String
Module1Name = "Module1"
FuncName = "func1"
Application.Run ModuleName & "." & FuncName

您还可以在ModuleName前面加上项目名称,并添加另一个句点".“。不幸的是,Application.Run不返回任何值,所以虽然您可以调用函数,但不会获得它的返回值。

票数 4
EN

Stack Overflow用户

发布于 2010-04-23 07:35:27

CallByName仅适用于类对象。

如果你的子例程在一个标准模块中,你可以这样做:

代码语言:javascript
复制
Sub Main()
    Module1.Func1
End Sub

如果它是一个函数,那么您可能希望捕获返回值;如下所示:

代码语言:javascript
复制
Sub Main()
    Dim var
    var = Module1.Func1
End Sub
票数 2
EN

Stack Overflow用户

发布于 2020-01-04 01:06:35

尽管这是一个在标准模块中为CallByName提出的老问题和OP,但正确的建议散布在答案和评论中,其中一些可能不那么准确,至少在2020年是这样。正如SlowLearner声明的那样,Application.run确实返回了一个变量,在这种情况下,下面的两个分支是等价的,除了通过处理错误之外,就像在Horowitz的答案周围注释的那样:

代码语言:javascript
复制
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方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2695198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档