Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 调用Sub和Application.Run之间的区别_Excel_Vba_Method Call - Fatal编程技术网

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

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,大多数都是从宏记录器派生的

一半的团队使用:

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缺乏经验的人(只是复制代码而不知道它是什么)