不正常的Excel VBA函数参数处理现象

无意中发现一个Excel VBA对待参数的一个"不正常"现象。这种处理方式可能无意中导致程序结果错误,而且你很难发现你的错误所在:

Sub twotimes(t As Double)
    t = 2 * t
End Sub 

Sub test()
    Dim t As Double

    t = 123
    twotimes t
    MsgBox t            ' 输出 246

    t = 123
    twotimes (t)
    MsgBox t            ' 输出 123 

    t = 123
    Call twotimes(t)
    MsgBox t            ' 输出 246
End Sub

test函数对于twotimes有三种调用方法,分别为 twotimes t,twotimes (t)和call twotimes(t)。它们是一样的吗?

运行test之后,第一种方法和第三种方法都输出了246。这个没有问题,因为VBA的参数默认传引用,twotimes函数会修改t的值。但第二种方法输出了123。我猜测是因为实际调用了twotimes((t)),从而把(t)传引用进入了twotimes的函数体,这个括号在运行时并没有被编译器扔掉,(t)是一个临时变量,和t被当作不同的变量。

事实上,空格后面的括号里的变量会被执行,然后返回默认参数。下面是一个更精妙的例子,客官们可以猜测发生什么:

Sub test()
    Dim myCollection As Collection
    Dim myObject As Object

    myCollection.Add (myObject)
    myCollection.Add myObject
End Sub

在函数调用时应该尽量避免第二种写法。

Q.E.D., ©zhiqiang, 2011.11.6。请参考右边的相关文章列表。


  • 评论由多说提供支持。该系统支持使用微薄、人人网和QQ的账户登陆,由各自网站直接认证,不会泄露你的密码。
  • 登陆后可选择分享评论到所绑定的社交网络,如微薄、人人和QQ空间。
  • 评论无法修改。如需修改,请删除原评论重新提交。
  • 评论支持LaTeX代码,行内公式请用\(a+b=c\),行间公式请用\[a+b=c\]。公式只支持英文字符。
Loading...
Loading...
Loading...