我正在使用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
答案 0 :(得分:10)
从以下行中删除括号:
PrintCollectionCount (GarbageLanguages)
无论好坏(更糟糕的是),VBA都有功能和子程序:
不幸的是,使用它们每个都需要稍微不同的语法。令人惊讶的是,这不是一个有效的子程序调用:
Subroutine(arguments)
相反,您需要使用以下两个选项之一:
Call Subroutine(arguments)
Subroutine arguments
更令人遗憾的是,当你使用错误的语法时,所得到的只是非常神秘的错误信息。最后,也很难习惯不使用括号,因为作为基本类型而不是对象的单个参数实际上工作正常:
Subroutine(SomeString) ' works
Subroutine(SomeInteger) ' works
Subroutine(SomeObject) ' does not work
Subroutine(SomeString, SomeInteger) ' does not work
除了记住可怕的错误消息之外,您还可以尝试训练自己在子程序名称后自动插入空格时注意。这样:
Subroutine(argument)
改为:
Subroutine (argument) '<-- RED FLAG