VBA编译错误:参数不是可选的

Mar*_*ese 5 vba access-vba access

我正在使用Access VBA,Compile error: Argument not optional每当我尝试将集合传递给函数时,我都会继续使用它.到底是怎么回事?

Private Sub btnTest_Click()
    Dim GarbageLanguages As New Collection
    GarbageLanguages.Add "VBA"
    PrintCollectionCount (GarbageLanguages)  '<-- error happens here
End Sub

Public Sub PrintCollectionCount(c As Collection)
    Debug.Print c.Count
End Sub
Run Code Online (Sandbox Code Playgroud)

Mar*_*ese 12

简答

从以下行中删除括号:

PrintCollectionCount (GarbageLanguages)
Run Code Online (Sandbox Code Playgroud)

答案很长

无论好坏(更糟糕的是),VBA都有功能和子程序:

  • 函数 - 必须返回值的 表达式
  • 子例程 - 不能返回值的语句

不幸的是,使用它们中的每个语法都需要略有不同 令人惊讶的是,这不是一个有效的子程序调用:

Subroutine(arguments)
Run Code Online (Sandbox Code Playgroud)

相反,您需要使用以下两个选项之一:

Call Subroutine(arguments)
Subroutine arguments
Run Code Online (Sandbox Code Playgroud)

更令人遗憾的是,当你使用错误的语法时,所得到的只是非常神秘的错误信息.最后,也很难习惯不使用括号,因为作为基本类型而不是对象的单个参数实际上工作正常:

Subroutine(SomeString)                ' works
Subroutine(SomeInteger)               ' works
Subroutine(SomeObject)                ' does not work
Subroutine(SomeString, SomeInteger)   ' does not work
Run Code Online (Sandbox Code Playgroud)

除了记住可怕的错误消息之外,您还可以尝试训练自己在子程序名称后自动插入空格时注意.这个:

Subroutine(argument)
Run Code Online (Sandbox Code Playgroud)

改为:

Subroutine (argument)  '<-- RED FLAG
Run Code Online (Sandbox Code Playgroud)