Excel 调用Sub和Application.Run之间的区别
在我的业务中,我们有几个团队处理非常简单的宏。我正试图使它们彼此可读,并以某种类似的格式,这样新加入者就可以开始处理数据了 我提到了简单的宏,因为没有人会使用带参数的sub,大多数都是从宏记录器派生的 一半的团队使用:Excel 调用Sub和Application.Run之间的区别,excel,vba,method-call,Excel,Vba,Method Call,在我的业务中,我们有几个团队处理非常简单的宏。我正试图使它们彼此可读,并以某种类似的格式,这样新加入者就可以开始处理数据了 我提到了简单的宏,因为没有人会使用带参数的sub,大多数都是从宏记录器派生的 一半的团队使用: Sub button() Call sub1() Call sub2() Call sub3() Call sub4() End Sub 而另一半则使用 Sub button() Application.Run("sub1") Application.Run("sub2"
Sub button()
Call sub1()
Call sub2()
Call sub3()
Call sub4()
End Sub
而另一半则使用
Sub button()
Application.Run("sub1")
Application.Run("sub2")
Application.Run("sub3")
Application.Run("sub4")
End Sub
我知道,如果您的sub没有参数,那么Application.Run就有了用途——但因为它几乎没有任何符号——人们仍然使用Application.Run(“”
)有什么原因吗
是否可以通过调用
在速度和过程上击败它的每次使用?您也可以通过application.run传递参数。我在循环宏时使用它。在上面的示例中,无需编写以下内容:
Sub button()
Call sub1()
Call sub2()
Call sub3()
Call sub4()
End Sub
for i = 1 to 4
application.run("sub" & i)
next i
你可以这样写:
Sub button()
Call sub1()
Call sub2()
Call sub3()
Call sub4()
End Sub
for i = 1 to 4
application.run("sub" & i)
next i
如果SUB采用str参数,则可以执行以下操作:
for i = 1 to 4
application.run("sub" & i, strVariable)
next i
如果我试图运行另一个模块中的专用子模块,我将使用应用程序。运行。如果我有一个某种类型的模板,我想对用户隐藏宏,我会将其声明为私有,这样他们就不能从“宏”对话框中运行/查看宏
在模块1中,我有
Private Sub priv()
MsgBox “Private”
End Suv
在模块2中,下面将给出一个子模块或未定义的函数
错误
Sub callPriv()
Call priv()
End Sub
但在模块2中,这将运行并显示消息框
Sub callPriv()
Application.Run “priv”
End Sub
如果要调用工作表或thisWorkbook模块中的子模块,则使用Application.Run也很有用 我将其中一些作为回答,因为我无法发表评论
@Badja:你说……“我知道如果你的sub没有参数,那么Application.Run就有用处——…”我不确定你是否暗示Application.Run可以没有参数事实并非如此。原则上,您可以对应用程序使用参数。就像对调用一样运行。它的语法和一般工作方式可能比Call更难理解。我同意你的观点,关于Application.Run的文档非常稀少
@Hasib_Ibradzic:我不知道你可以用字符串调用函数??
据我所知,Application.Run-over使用Call的优点之一是,参数中的宏名称部分被视为一个sting,这样您就可以用变量构建该字符串。因此,您不局限于硬编码,我认为使用Call就是这样
@Dude_Scott:在您的示例中,我认为建议/注意包含模块代码名是明智的。如果没有这一点,如果在不同的模块中有同名的子例程,您可能会遇到问题。
在您的示例中,这样做可能是明智的
Sub callPriv()
Application.Run "Module1.priv"
End Sub
______________
其他一些可能有用的注意事项:
如果在另一个公共模块中有宏,则可以从另一个模块调用它
比如说。在我的(德语)Excel中,我的第一个普通模块中有代码名Module1
,(在英语Excel中,我认为默认情况下通常是Module1
),这是
在我的第一个工作表类代码模块中,代码名Tabelle1
(在英语Excel中,我认为默认情况下通常是Sheet1
),我有
Public Sub PbicTabelle1() '
MsgBox "Pubic Tabelle1"
End Sub
Public Sub PbicThisWorkbook() '
MsgBox "Pubic ThisWorkbook"
End Sub
在我的ThisWorkbook类代码中,代码名DieseArbeitsmappe
(在英语Excel中,我认为这通常是默认的ThisWorkbook
),我有这个
Public Sub PbicTabelle1() '
MsgBox "Pubic Tabelle1"
End Sub
Public Sub PbicThisWorkbook() '
MsgBox "Pubic ThisWorkbook"
End Sub
以下宏在任何模块中都可以工作
Private Sub CallMePubics() ' https://stackoverflow.com/questions/55266228/difference-between-calling-a-sub-and-application-run
Call Modul1.PbicModule1
Call Tabelle1.PbicTabelle1
Call DieseArbeitsmappe.PbicThisWorkbook
End Sub
如果调用的宏是私有的,则最后一个宏将失败
无论被调用的宏是公共的还是私有的,使用Application.Run的以下等效宏都将起作用
Private Sub AppRunMePubics()
Application.Run Macro:="Modul1.PbicModule1"
Application.Run Macro:="Tabelle1.PbicTabelle1"
Application.Run Macro:="DieseArbeitsmappe.PbicThisWorkbook"
End Sub
因此,由此得出的结论稍微补充了杜德·斯科特所说的:
Run允许您从任何地方运行任何地方的私有Sub和公共Sub。
Call只允许您从任何地方运行,任何地方的公共Sub
Ref:
https://stackoverflow.com/questions/31439866/multiple-variable-arguments-to-application-ontime
http://excelmatters.com/2017/04/07/passing-arguments-byref-using-run/
Example Workbook with my coding: MainFile.xls : https://app.box.com/s/prqhroiqcb0qccewz5si0h5kslsw5i5h
http://www.tushar-mehta.com/publish_train/xl_vba_cases/1022_ByRef_Argument_with_the_Application_Run_method.shtml
是的,我在记下名称,但是通过数组运行它们会减少代码中的废话。我永远不会明白为什么子例程应该有像sub1
这样的名称。。。你把检查子例程是否存在的动作从编译时移到运行时。我不知道你可以使用带字符串的调用函数。。。。我认为application.run
的全部目的是能够将sub作为字符串传递。我必须测试一下你是怎么做的。我没有读过这篇文章就发布了答案,所以被删除了,我只是在备份Application.Run(x)
,其中x可以是vbaproject.method
path,处理稍后在代码运行时确定要运行的例程的位置的调用。例如,我可以有三个按钮,分别将不同的字符串传递给一个具有Application.Run(string)
的方法。。。而callsub1
只是简单的硬编码Call
需要一个编译时已知的函数Application.Run
接受一个通过名称标识函数的字符串参数。Call
不推荐使用。不用了,回答得很好!很好地使用了Application.Run()
。如果您的一般方法是所有Sub
s都是公共的呢?由于只有用户接触宏,因此CreatorCall可能是最好的,因为您没有让VBA计算字符串。你可以通过谷歌Call
找到大量关于这方面的信息。不应该用那个词。只需使用priv()
@AJD@Badja是的,您可以避免使用Call
,但由于OP提到他希望使代码可读,这确实有助于这一努力。遗漏可能会给没有经验的人带来一些困惑VBA@Dude_Scott-使用Call
突出显示了对VBA缺乏经验的人(只是复制代码而不知道它是什么)