调用 Sub 和 Application.Run 之间的区别

Difference between Calling a Sub and Application.Run

在我的业务中,我们有几个团队处理非常简单的宏。我试图让它们彼此可读并采用某种类似的格式,以便新加入者可以开始处理数据。

我提到了简单的宏,因为没有人会使用带有参数的 Subs - 大多数都是从 Macro Recorder 派生的

半数团队使用:

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("") 的原因是什么?

它的每一次使用在速度和过程上都能被Call打败吗?

你也可以通过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

如果 subs 接受了一个 str 参数,你可以这样做:

for i = 1 to 4
  application.run("sub" & i, strVariable)
next i

如果我试图 运行 一个在另一个模块中私有的 sub,我会使用 Application.Run。如果我有某种模板,我想对用户隐藏宏,我会将其声明为私有的,这样他们就不能 run/see 宏对话框中的宏。

在模块 1 中我有

Private Sub priv()
  MsgBox “Private”
End Suv

在 module2 下面会给你一个 Sub or Function not defined 错误。

Sub callPriv()
  Call priv()
End Sub

但在模块 2 中,这将 运行 并显示消息框

Sub callPriv()
  Application.Run “priv”
End Sub

如果您在 sheet 或 thisWorkbook 模块中调用 sub,使用 Application.Run 也很有用。

我将其中的一些作为答案发布,因为我无法发表评论。

@Badja:你说……” 我知道如果你的 sub 没有参数,那么 Application.Run 就有用了 – ......“我不确定你是否可能暗示 Application 运行 可以有没有争论? - 事实并非如此。原则上,您可以在 Application.Run 中使用参数,就像在 Call 中一样。它的语法和一般工作方式可能比 Call 更难理解。我同意你的看法,关于 Application.Run 的文档非常稀少。

@Hasib_Ibradzic :我不知道您可以将 Call 函数与字符串一起使用。 ?? 据我所知,Application.Run 优于使用 Call 的优点之一是参数的宏名称部分被视为字符串,因此您可以使用变量构建该字符串。所以你不限于硬编码,我认为使用 Call

就是这种情况

@Dude_Scott :在您的示例中,我认为建议/注意包含模块代码名称是可取的。如果没有这个,如果您在不同的模块中有同名的 Sub 例程,您可能会遇到问题。 在您的示例中,建议这样做

Sub callPriv()
  Application.Run "Module1.priv"
End Sub 

_._____________

其他一些可能有用的注意事项:

如果您在另一个模块中有一个宏 Public,那么您可以从另一个模块调用它

例如。在我的(德语)Excel 我的第一个普通模块中,代码名称 Modul1,(英语 Excel,我认为通常默认为 Module1),这个

Public Sub PbicModule1() '
 MsgBox "Pubic Modul1"
End Sub

在我的第一个工作表 class 代码模块中,代码名称 Tabelle1(英文 Excel 我认为默认情况下通常是 Sheet1 ),我有这个

Public Sub PbicTabelle1() '
 MsgBox "Pubic Tabelle1"
End Sub

并且在我的 ThisWorkbook class 代码中,代码名称 DieseArbeitsmappe(在英语中 Excel,我认为默认情况下通常是 ThisWorkbook),我有这个

Public Sub PbicThisWorkbook() '
 MsgBox "Pubic ThisWorkbook"
End Sub

以下宏在任何模块中都有效

Private Sub CallMePubics()   '    
 Call Modul1.PbicModule1
 Call Tabelle1.PbicTabelle1
 Call DieseArbeitsmappe.PbicThisWorkbook
End Sub

如果调用的宏是私有的,最后一个宏将失败。

下面这个使用 Application.Run 的等效宏,无论被调用的宏是 Public 还是 Private

都可以工作
Private Sub AppRunMePubics()
 Application.Run Macro:="Modul1.PbicModule1"
 Application.Run Macro:="Tabelle1.PbicTabelle1"
 Application.Run Macro:="DieseArbeitsmappe.PbicThisWorkbook"
End Sub

因此,从中得出的结论是对 Dude_Scott 所说的内容略有补充: Application.Run 允许您从任何地方 运行,私人订阅和任何地方的 Public 订阅。 通话只允许您从任何地方 运行,Public 任何地方的潜艇

Ref:

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