如何避免VBA函数间同名参数的引用冲突?
VBA对象参数互不影响的解决方法
你遇到的问题本质是VBA中对象类型参数默认按引用(ByRef)传递:当test1把pObj传给test2时,传递的是对象引用的内存地址,test2中修改这个引用(设为Nothing)会直接作用于test1里的原变量。
无需重命名参数的话,有两种简单的解决方式:
1. 显式声明test2的参数为按值传递(ByVal)
修改test2的参数定义,加上ByVal关键字,这样test2接收的是原引用的副本,修改副本不会影响test1中的变量:
Function test2(Optional ByVal pObj As Object = Nothing) If pObj Is Nothing Then Set pObj = ActiveWorkbook End If Set pObj = Nothing End Function
2. 调用test2时强制按值传递参数
如果不想修改test2的参数声明,在test1调用test2时,用双层括号把参数括起来,强制按值传递:
Function test1(Optional pObj As Object = Nothing) If pObj Is Nothing Then Set pObj = ActiveWorkbook End If Call test2((pObj)) ' 双层括号强制按值传递 Set pObj = Nothing End Function
这两种方式都能让两个函数的pObj变量互不影响,核心都是让test2操作的是原引用的副本而非原引用本身。
内容的提问来源于stack exchange,提问作者Mr. Tacio
相关产品推荐
相关产品推荐

