vba - 子例程将无法编译

标签 vba ms-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

最佳答案

简短答案

从以下行中删除括号:

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
    

    关于vba - 子例程将无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48817661/

    相关文章:

    arrays - 如何使用函数返回的字符串数组?

    ms-access - 设置 rs = 无 : useful before closing form ?

    c# - Dapper 和 Access 返回空白值

    ms-access - 通过 ADOX 添加带有自动编号主键的 Access 表

    c# - 使用 C# 和 asp.net 将 sql 插入 access db 时出现语法错误

    excel - 将图表导出为图像 - 只需单击按钮

    Excel vba - 禁用鼠标事件

    excel - VBA-excel中的正确数字格式

    vba - 如何在 Excel VBA 用户窗体中创建两列查找组合框

    vb.net - "Keyword not supported: provider"连接到VS08上的Access数据库