在VBA中调用Sub

reg*_*gie 40 vba call syntax-error

这是我的简化脚本:

    Sub SomeOtherSub(Stattyp As String)
        'Daty and the other variables are defined here

        CatSubProduktAreakum(Stattyp, Daty + UBound(SubCategories) + 2)

    End Sub

    Sub CatSubProduktAreakum(Stattyp As String, starty As Integer)

    'some stuff

    End Sub
Run Code Online (Sandbox Code Playgroud)

CatSubProduktAreakum的调用标记为红色,表示为"语法错误".我不明白这个错误.这是一个带有两个参数的简单子例程调用.为什么VBA不接受电话?

ipr*_*101 65

试试 -

Call CatSubProduktAreakum(Stattyp, Daty + UBound(SubCategories) + 2)
Run Code Online (Sandbox Code Playgroud)

至于原因,这来自MSDN通过这个问题 - Call关键字在VB6中做了什么?

调用过程时,不需要使用Call关键字.但是,如果使用Call关键字调用需要参数的过程,则必须将参数列表括在括号中.如果省略Call关键字,则还必须省略argumentlist周围的括号.如果使用Call语法调用任何内部函数或用户定义函数,则会丢弃函数的返回值.

  • @reggie只要你跳过括号`Mysub arg1,arg2,arg3`就可以调用没有调用的子.但是,你需要阅读ByVal和ByRef. (3认同)
  • 这就是我讨厌VBA的原因. (3认同)
  • 谢谢,这似乎有效。如果我仅使用一个参数调用子例程(并且仅使用一个参数定义它),那么我可以仅通过其名称(和括号中的参数)来调用它。为什么不能仅用两个参数调用Sub? (2认同)

Sam*_*Sam 9

对于仍然来到这篇文章的人,另一种选择是简单地省略括号:

Sub SomeOtherSub(Stattyp As String)
    'Daty and the other variables are defined here

    CatSubProduktAreakum Stattyp, Daty + UBound(SubCategories) + 2

End Sub
Run Code Online (Sandbox Code Playgroud)

Call关键字仅在VBA真正的向后兼容性和实际上是不需要的.

但是,如果您决定使用Call关键字,则必须更改语法以适应.

'// With Call
Call Foo(Bar)

'// Without Call
Foo Bar
Run Code Online (Sandbox Code Playgroud)

两者都会做同样的事情.


话虽这么说,可能有一些情况要注意哪些地方不必要地使用括号会导致你不想要的东西被评估(正如在VBA中这样括号)所以考虑到这一点,更好的选择可能是省略Call关键字和括号