我有以下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)
然后错误消失。这看起来很尴尬,因为我根本不需要修改消息,只想打印其中的字段。
有人可以告诉我我做错了吗?
答案 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
确实允许编译并删除错误。