EP04. “ByRef and ByVal 传值方式”
🔒 登录后可标记已读- VBA 的程序(Function/Sub)之间传递参数有两种方式:
ByRef(传引用,默认方式)和ByVal(传值) - 讲两者的差别——传引用会连原始变量的值一起改掉,传值则不会
- 用同一个
Triple函数分别示范两种写法的结果差异 - 前置知识:基本的 Function 写法
重点内容
适用版本
桌面版通用(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 | 函数内部只改动一份拷贝,原始变量不受影响 | 想保护原始变量,避免被函数意外改掉 |
学完你会
- ✅ 分辨
ByRef和ByVal对原始变量的不同影响 - ✅ 知道 VBA 参数默认是
ByRef,不写关键字也一样有「改动外部变量」的风险 - ✅ 需要保护原始变量时,显式加上
ByVal
常见错误
- 以为 VBA 默认传值(ByVal),结果函数不小心把外部变量的值也改掉了——VBA 默认其实是 ByRef
- 明明想保护原始变量不被函数改动,却忘记显式写
ByVal,沿用了默认的ByRef行为 - 混用 ByRef 和 ByVal 却没有在函数声明时写清楚,之后回头看代码搞不清楚这个参数会不会被函数改动
Sources
Blog / Website: