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代码至关重要。
热门推荐
TikTok暂别美国,还有Lemon8,CupCut与Lark
探究古语词“耄耋”的含义与饕餮的联想
如何查询期刊的具体卷期信息?
植物的生长过程及其环境适应机制
《流浪地球3》三大变化:投资超过10亿,拆分上下两部
努尔哈赤的亲弟弟舒尔哈齐,大清二号人物,为什么会被囚禁至死
舒尔哈齐为什么会被亲哥哥幽禁而死?
黎曼猜想的新突破:数学家改进80多年未变的零点估计
太阳系:八大行星与神秘天体的宇宙家园
井陉之战:兵力悬殊下的以少胜多之战
江团生长环境条件是什么,有哪些养殖技巧?
桂圆:被誉为“水果中的黄芪”,对大脑和免疫都有益
刀郎成都演唱会:以"老师"之名致敬乐队成员
蓝莓对近视眼真的有用吗
跨境出口退税全流程解析:从资质审核到退税款到账的详细步骤!
【医疗问答】输液过程中能自行调节滴速吗?
中国有1000万老年人月退休金过万元?
三合一地坪漆好还是水性地坪漆好?
【Cortex-A9多核技术】揭秘并行处理的艺术:提升多核性能的终极策略
珠海各区开展多彩"三八"活动 展示女性风采
身柱穴:位置、功效与应用全解析
C语言中的union是什么,它与struct有何异同?
C++一分钟之-结构体与联合体(Union)
没出险!没违章!车险续保却涨价?车改后保费影响因素竟然这么多!
萧太后在辽朝的历史作用探析
辽国萧太后:摄政与扩张的铁腕女政治家
最新研究:基于文本的支持计划是戒烟最佳方式之一
“美丽中国,我是行动者”——个人低碳行为习惯养成研学考察活动成功举办
空调1匹等于多少瓦?一匹空调耗电量分析
从源头到工艺:内毒素控制与去除全解析