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

作者: , 共 850 字 , 共阅读 0

无意中发现一个 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.

类似文章:
编程 » Excel, VBA
VBA 的 Date 类型比较奇怪。
编程 » Excel, VBA
最近学到一招,效果不错~
相似度: 0.152
编程 » Excel, VBA
Excel VBA 出错时给出的错误信息极少,需要充分利用各种工具来进行调试。
编程 » Excel, VBA
某些时候需要打开 Excel 文件来获取或者写入数据,但又不希望跳出打开的 Excel 文件窗口,可以用下面的代码:
编程 » Excel, lotus, VBA
公司使用 Lotus ,我每天都通过 Excel 编写 VBA 代码自动调用 Lotus 发送邮件,发现一个奇怪的现象。一般我们通过下面的 VBA 代码指定邮件收件人:
编程 » VBA, Excel
如果不提供错误处理方法,VBA在出错时会停留在出错之处。Excel/VBA 提供On Error关键词来处理程序运行过程中的错误,具体有下面两种用法:
编程 » Excel, VBA
效果图:
编程 » C++, C++11
花括号初始化是C++11引入的一种初始化方法。
编程 » Excel
在编辑 Excel 文件时经常遇到的一个问题是,我这边用得好好地,换台机器就变了个样,或者根本用不了。下面是我在日常工作中总结的一些避免这些情况的小技巧。
2014-03-25 更新:我已经将该类修改成函数形式,并增加新功能,参见更新 Excel 的数据库查询函数库
毛毛虫爬棍子,有三个变体:
编程 » Matlab, 编译器
现在比较新的电脑基本上都是 64 位的 CPU , Matlab 也是 64 位的版本,但 64 位的 Matlab 没有自带编译器,需另行安装编译器。下面是方法之一: