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

无意中发现一个Excel VBA对待参数的一个"不正常"现象 。这种处理方式可能无意中导致程序结果错误,而且你很难发现你的错误所在:
Sub twotimes(t As Double)t = 2 * tEnd Sub Sub test()Dim t As Doublet = 123twotimes tMsgBox t' 输出 246t = 123twotimes (t)MsgBox t' 输出 123t = 123Call twotimes(t)MsgBox t' 输出 246End Subtest函数对于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 CollectionDim myObject As ObjectmyCollection.Add (myObject)myCollection.Add myObjectEnd Sub【不正常的Excel VBA函数参数处理现象】在函数调用时应该尽量避免第二种写法 。

    推荐阅读