为何传入VBA函数的局部变量未被返回却发生值修改?
为什么VBA中修改函数参数会同步改变原变量?
这其实是VBA参数传递的默认规则在搞鬼,很多刚上手VBA的开发者都会碰到这个坑!
核心原因:默认按引用(ByRef)传递参数
在VBA里,如果你的函数/子过程参数没有显式标注ByVal(按值传递),默认都是ByRef(按引用传递)。这意味着你传递给函数的不是变量的副本,而是变量的内存地址引用——函数里对参数的修改,直接作用在原变量的内存空间上,自然会同步改变原变量的值。
针对你的代码场景
看你的Filling函数定义:
Function Filling(Cont As String, whatev As String)
这里的Cont参数没有指定传递方式,所以默认是ByRef。当你在函数里执行Cont = "_ _ _ _ _ _ _ _ _ _"时,本质上是直接修改了原变量strCont指向的内存内容,所以原变量会立刻同步变化,这和函数有没有返回值完全没关系。
为什么字符串也会这样?
可能你会疑惑:字符串不是值类型吗?怎么会被引用修改?其实VBA对字符串的引用传递做了特殊优化——它传递的是字符串的指针(而非复制整个字符串内容),所以修改函数内的参数变量,就是直接修改原变量指向的字符串数据。
更规范的解决方法
你已经通过传递副本解决了问题,其实更简单的方式是给参数加上ByVal,强制按值传递:
Function Filling(ByVal Cont As String, whatev As String)
这样函数收到的就是strCont的独立副本,修改Cont只会影响函数内部,原变量strCont完全不受影响。
内容的提问来源于stack exchange,提问作者bookman B.
相关产品推荐
相关产品推荐

