调用子程序和Application.Run之间的区别

时间:2019-03-20 16:55:11

标签: excel vba method-call

在我的企业中,我们有一些团队在非常简单的宏上工作。我正在尝试使它们彼此之间以相似的格式相互可读,以便新的连接器可以开始处理数据。

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

一半的团队使用:

target=android-27
android.library.reference.1=CordovaLib
android.library.reference.2=app
cordova.system.library.1=com.google.android.gms:play-services-analytics:16.0.8
cordova.gradle.include.1=cordova-support-google-services/myApp-build.gradle
cordova.gradle.include.2=phonegap-plugin-multidex/myApp-multidex.gradle
cordova.system.library.2=com.android.support:support-v13:27.+
cordova.system.library.3=me.leolin:ShortcutBadger:1.1.17@aar
cordova.system.library.4=com.google.firebase:firebase-messaging:17.0.0

另一半使用

Sub button()

Call sub1()
Call sub2()
Call sub3()
Call sub4()

End Sub

我知道,如果您的子程序没有参数,那么Application.Run会有用处-但由于几乎没有任何记号-人们仍然使用Sub button() Application.Run("sub1") Application.Run("sub2") Application.Run("sub3") Application.Run("sub4") End Sub 吗?

Application.Run("")会在速度和过程上击败它吗?

3 个答案:

答案 0 :(得分:4)

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

如果潜艇采用了str参数,则可以执行以下操作:

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

答案 1 :(得分:1)

如果我尝试运行另一个模块中私有的子项,则使用Application.Run。如果我有某种模板要在其中向用户隐藏宏,则将其声明为私有,以便他们无法从那里的宏对话框运行/查看宏。

在module1中,我有

Private Sub priv()
  MsgBox “Private”
End Suv

在module2中,以下将给您一个Sub or Function not defined错误。

Sub callPriv()
  Call priv()
End Sub

但是在module2中,它将运行并显示消息框

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

使用Application.Run也很有用,如果您要在工作表或thisWorkbook模块中调用一个子项。

答案 2 :(得分:0)

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

@ Badja:您说的是…。” 我知道,如果您的子程序没有参数,那么Application.Run会有用– ……”我不确定您是否暗示Application Run可以没有参数? - 事实并非如此。原则上,您可以在Application.Run中使用参数,就像在Call中一样。它的语法和常规工作可能比使用Call难理解。我同意您的看法,有关Application.Run的文档非常少。

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

就是这种情况

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

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

_._____________

一些其他可能需要注意的事情:

如果在另一个公共模块中有一个宏,则可以从另一个模块中调用它

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

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

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

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

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

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

如果被调用的宏是Private,则最后一个宏将失败。

以下与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允许您从任何地方运行私有子项和公共子项。 通话只允许您从任何地方运行

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