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代码至关重要。
热门推荐
上海市第八人民医院专家提醒:食品中毒高发期,这些预防要点请收好
如何查询车辆事故记录和4S店维修历史?
汽修入门指南:让你成为车神
芬兰北部西达博物馆:展现萨米文化与极北自然的互动
挪威萨米人:在现代化浪潮中守护极地文明
大连10处小众景点全攻略:从文艺沙滩到创意园区
年味照片怎么拍?这样拍照很好看,红红火火过大年
赏花灯、吃元宵、猜灯谜、闹社火 各地元宵节民俗活动“热火朝天”引客来
端午情浓,解锁校园里的幸福味道
天一阁打卡,宁波完美游宿指南
南极“暖男”企鹅:零下几十度也能过冬的生存秘诀
香港维港&上海宝山滨江:新年烟花最佳观赏地
从辛弃疾到长江艺术季:烟花的古今绝美演绎
食管糜烂怎么办?
从凉拌到炖汤:海带的六种美味做法与食用指南
海带:餐桌上的“含碘冠军”,兼具多重健康功效
海带:餐桌上的“含碘冠军”,科学选购与创意烹饪指南
宿舍放鞭炮被罚,校规到底严不严?
社区甲状腺结节筛查,你做了吗?
甲状腺结节治疗迎来重大突破:靶向药物展现惊人疗效
芋头与甲状腺结节:科学解读其辅助调理作用
甲状腺结节医保报销,你真的懂吗?
江西发布物业服务调查报告:物业费高的小区,业主满意度更低
多地调整燃放政策:传统与现代如何平衡?
佛山春节放鞭炮新规出炉!29个燃放点全攻略
春节全域禁燃禁放:传统与现代的碰撞
甜咸还是麻辣?红烧茄子与剁椒茄子的口味之争
“落苏”的故事:茄子在中国的多样烹饪与文化
豆瓣酱炒茄子:这样做既美味又健康
正确使用胃药:从选药到服用的完整指南