问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

byref和byval:一文读懂按地址传递(默认)和按值传递——vba

创作时间:
2025-03-17 23:18:42
作者:
@小白创作中心

byref和byval:一文读懂按地址传递(默认)和按值传递——vba

引用
CSDN
1.
https://m.blog.csdn.net/yongshiqq/article/details/137816623

在VBA编程中,参数传递是一个基础但重要的概念。本文将通过对比ByRef(按地址传递)和ByVal(按值传递)两种方式,帮助读者深入理解它们的区别和应用场景。

在VBA中,函数或子程序的参数传递主要分为两种方式:ByRef(按地址传递)和ByVal(按值传递)。这两种方式在数据传递和修改方面有着本质的区别。

ByRef:按地址传递

ByRef是VBA默认的参数传递方式。当使用ByRef传递参数时,主程序会将变量的内存地址传递给被调用的子程序。这意味着子程序可以直接访问和修改主程序中的变量,回调时主程序的变量值会受到影响。

具体来说,ByRef传递过程如下:

  1. 主程序将变量的内存地址传递给子程序
  2. 子程序通过该地址直接操作主程序中的变量
  3. 主程序输出的是修改后的值

ByVal:按值传递

与ByRef不同,ByVal传递的是变量的副本,而不是变量的地址。这意味着子程序只能操作变量的副本,而不会影响主程序中的原始变量。如果需要在子程序中返回修改后的值,可以在子程序中设置输出参数。

ByVal传递过程如下:

  1. 主程序将变量的值复制一份传递给子程序
  2. 子程序对副本进行操作
  3. 主程序输出的仍是原值

代码示例

下面通过一个具体的代码示例来说明ByRef和ByVal的区别:

Sub TestByRefByVal()
    Dim x As Integer
    Dim y As Integer
    x = 1
    y = 1
    
    ' 调用ByRef方式的子程序
    Call ChangeByRef(x, y)
    MsgBox "ByRef调用后:" & vbCr & "x=" & x & "    y=" & y
    
    ' 调用ByVal方式的子程序
    Call ChangeByVal(x, y)
    MsgBox "ByVal调用后:" & vbCr & "x=" & x & "    y=" & y
End Sub

Sub ChangeByRef(ByRef a As Integer, ByRef b As Integer)
    a = 10
    b = 20
End Sub

Sub ChangeByVal(ByVal a As Integer, ByVal b As Integer)
    a = 10
    b = 20
End Sub

运行结果如下:

从运行结果可以看出:

  • ByRef方式调用后,主程序中的变量x和y都被修改为10和20
  • ByVal方式调用后,主程序中的变量x和y保持不变,仍然是1和1

总结

ByRef和ByVal是VBA中两种重要的参数传递方式,它们在数据传递和修改方面有着本质的区别。ByRef适合需要在子程序中修改主程序变量的场景,而ByVal则适用于需要保持主程序变量不变的场景。理解这两种传递方式的区别,对于编写高效、稳定的VBA代码至关重要。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号