byref和byval:一文读懂按地址传递(默认)和按值传递——vba
创作时间:
作者:
@小白创作中心
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传递过程如下:
- 主程序将变量的内存地址传递给子程序
- 子程序通过该地址直接操作主程序中的变量
- 主程序输出的是修改后的值
ByVal:按值传递
与ByRef不同,ByVal传递的是变量的副本,而不是变量的地址。这意味着子程序只能操作变量的副本,而不会影响主程序中的原始变量。如果需要在子程序中返回修改后的值,可以在子程序中设置输出参数。
ByVal传递过程如下:
- 主程序将变量的值复制一份传递给子程序
- 子程序对副本进行操作
- 主程序输出的仍是原值
代码示例
下面通过一个具体的代码示例来说明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代码至关重要。
热门推荐
家庭用什么冰箱最实用?家用冰箱怎么选最好?
如何选择高效保鲜的家庭冰箱:容量、技术与环保全面解析
最新研究:代谢组学结合质谱成像揭示黄葵胶囊治疗2型糖尿病肾病的疗效和机制
23省份人口年报:广东广西贵州为生育主力军 东三省十年缩减超千万人
2025重庆主城周边自驾一日游小众景点推荐(附路线)
高邮:“江苏绿心”澎湃绿色发展新动能
手套出口攻略:如何根据材质和用途精准归类?
买菜小技巧,虾选“直的”还是“弯的”,很多人不会选难怪不新鲜
光污染:原因、健康影响和解决方案
吃韭菜的好处与功效
红楼梦中李纨的命运有何变化?贾府抄家后的结局如何?
图书管理员素质项目:从信息素养到终身学习
图书馆管理员坐服务台需要哪些技能
鱼缸过滤方式全解析:原理、使用方法及优缺点
2024服贸会 | 探讨AI大模型在医疗健康及生命科学领域的应用挑战及未来前景
《传说之下》测评:颠覆传统RPG玩法的游戏体验
感冒发烧多喝水,喝的是什么水?
显卡驱动问题解决:实用技巧大全汇总
亿田集成灶拆机清洁方法(轻松学会拆卸和清洁亿田集成灶)
庆历新政:北宋仁宗时期的改革壮举
每天吃这种水果,死亡风险下降43%,冠心病风险下降21%?
泰国试管婴儿与国内技术对比:成功率、费用及政策差异解析
探秘水乡画卷,江苏同里古镇的旅游胜地
做红烧肉时,用冰糖还是白糖?多数人不懂,难怪肉不香不红还发黑
做红烧肉时,用冰糖还是白糖?多数人不懂,难怪肉不香不红还发黑
稳压管在电源电路中的关键作用与设计要点
免疫检查点抑制剂毒性的免疫机制
浓鲜豆腐海鲜汤的美味享受
掌握这4个人际关系原则,让沟通更顺畅!
调侃的艺术:如何在幽默中拉近朋友间的距离