MICROSOFT

EP04. “ByRef and ByVal 传值方式”

首页 Microsoft 工具 Excel · VBA · Function and Sub · EP04
约 3 分钟· #EP04#Excel#Function and Sub
🔒 登录后可标记已读
  • 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函数内部只改动一份拷贝,原始变量不受影响想保护原始变量,避免被函数意外改掉

学完你会

  • ✅ 分辨 ByRefByVal 对原始变量的不同影响
  • ✅ 知道 VBA 参数默认是 ByRef,不写关键字也一样有「改动外部变量」的风险
  • ✅ 需要保护原始变量时,显式加上 ByVal

常见错误

  • 以为 VBA 默认传值(ByVal),结果函数不小心把外部变量的值也改掉了——VBA 默认其实是 ByRef
  • 明明想保护原始变量不被函数改动,却忘记显式写 ByVal,沿用了默认的 ByRef 行为
  • 混用 ByRef 和 ByVal 却没有在函数声明时写清楚,之后回头看代码搞不清楚这个参数会不会被函数改动

Sources

Blog / Website:

  1. ByRef and ByVal