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

时间:2018-02-15 22:59:07

标签: 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

1 个答案:

答案 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