重点内容
适用版本
桌面版通用(Excel 365 / 2021 / 2019 等)。VBA 默认用 ByRef 传参数。
调用代码(按钮绑定的程序)
Dim x As Integer
x = 10
MsgBox Triple(x)
MsgBox x用 ByRef(传引用)
Function Triple(ByRef x As Integer) As Integer
x = x * 3
Triple = x
End Function结果:第一个消息框显示 30(三倍后的结果),第二个消息框也显示 30——因为 ByRef 传的是原始变量本身的引用,函数内部改了 x,外面的 x 也会跟着变。
用 ByVal(传值)
Function Triple(ByVal x As Integer) As Integer
x = x * 3
Triple = x
End Function结果:第一个消息框显示 30,第二个消息框显示 10——因为 ByVal 传的是原始变量的一份拷贝,函数内部怎么改这份拷贝,都不会影响到外面原本的 x。
ByRef / ByVal 怎么选
| 写法 | 效果 | 适合场景 |
|---|---|---|
ByRef(默认) | 函数内部改动会影响原始变量 | 需要函数「顺便修改」外部变量的值 |
ByVal | 函数内部只改动一份拷贝,原始变量不受影响 | 想保护原始变量,避免被函数意外改掉 |
学完你会
常见错误
- 以为 VBA 默认传值(ByVal),结果函数不小心把外部变量的值也改掉了——VBA 默认其实是 ByRef
- 明明想保护原始变量不被函数改动,却忘记显式写
ByVal,沿用了默认的ByRef行为 - 混用 ByRef 和 ByVal 却没有在函数声明时写清楚,之后回头看代码搞不清楚这个参数会不会被函数改动
Sources
Blog / Website: