将对象传递给Excel VBA Sub会导致Argument不可选错误

时间:2012-10-29 14:46:27

标签: excel-vba vba excel

我有以下Sub:

Public Function Log(sdsMessage As CStandardPropertySet2)
' Only print the fields contained int he sdsMessage
End Function

我这样用它:

Log(anSdsMessage)

然而,这会导致Argument not optional错误。

但如果我有这样的子:

Public Function Log(sdsMessage As CStandardPropertySet2) As CStandardPropertySet2
' Only print the fields contained int he sdsMessage
Set Log = sdsMessage
End Function

Set anSdsMessage = Log(anSdsMessage)

然后错误消失。这看起来很尴尬,因为我根本不需要修改消息,只想打印其中的字段。

有人可以告诉我我做错了吗?

1 个答案:

答案 0 :(得分:2)

这是令人困惑的VBA语法。如果你是jsut调用Log作为方法并且没有返回类型,则省略括号。

所以Log anSdsMessage没有设置返回值

和(正确的,因为你已经设置)Set anSdsMessage = Log(anSdsMessage)当设置了返回值时。

解决丹尼尔的评论

我可以写这段代码

Public Function Log(sdsMessage As Collection)
' Only print the fields contained int he sdsMessage
End Function

Sub tester()
    Dim o As Collection
    Set o = New Collection
    Log (o)
End Sub

并尝试运行tester sub并收到错误消息“Compile error:Argument not optional”

删除括号并运行Log o确实允许编译并删除错误。