调用 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
在我的业务中,我们有几个团队处理非常简单的宏。我试图让它们彼此可读并采用某种类似的格式,以便新加入者可以开始处理数据。
我提到了简单的宏,因为没有人会使用带有参数的 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