Microsoft Lab
全部软件
Excel函数与过程(Function and Sub)约 3 分钟

ByRef and ByVal 传值方式

重点内容


适用版本

桌面版通用(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:

  1. ByRef and ByVal
只记在你的浏览器里,换设备不会同步。