作者:绿色风
分类:
时间:2022-08-17
浏览:226
楼主 amulee |
Q:VBA中ByVal和ByRef有什么区别? A:在VBA过程中,参数传递有两种方式:ByVal和ByRef。 ByRef:按地址传递,改变原先传递参数的变量的值。当没有任何声明的时候,采取此方式传递参数。ByRef常用在递归中。 ByVal:按值传递,仅将变量的值作为参数来传递,不会改变原先变量的值。
运行以下Main过程来体会一下吧。
- Sub Test1(ByVal Arg) '按值传递,不会改变原先变量的值
- Arg = Arg + 1
- End Sub
- Sub Test2(ByRef Arg) '按地址传递,改变原先变量的值
- Arg = Arg + 1
- End Sub
- Sub Main()
- Dim AA
- AA = 1
- Test1 AA '按值传递,只有Test2里面的Arg变成了2,而不会改变AA的值
- MsgBox AA
- Test2 AA '按地址传递,改变了AA变量实际存储地址的值,增加了1
- MsgBox AA
- End Sub
|
2楼 gvntw |
Q:参数前的ByVal有何作用? A:在参数前添加关键字ByVal,可以使调用的过程通过“数值”而不是“引用”来传递参数的值,如果不希望被调用的过程修改作为参数传递的变量值,可以使用该方法。 下面的代码供测试,过程test弹出的第1个对话框结果为10,第2个对话框结果为5。
- Sub test1(iNumber)
- iNumber = iNumber * 2
- End Sub
- Sub test2(ByVal iNumber)
- iNumber = iNumber * 2
- End Sub
- Sub test()
- iNumber1 = 5
- iNumber2 = 5
- Call test1(iNumber1)
- MsgBox iNumber1
- Call test2(iNumber2)
- MsgBox iNumber2
- End Sub
|
3楼 wise |
Q:如何理解VBA中的按地址传递(byref)和按值传递(byval)? A:参数传递分为按地址传递(byref)和按值传递(byval) 参数传递过程就是把你要运算的初始数值(实参)传递给运算的函数中的变量(形参) ByVal:传送参数内存的一个拷贝给被调用者。也就是说,栈中压入的直接就是所传的值。 ByRef:传送参数内存的实际地址给被调用者。也就是说,栈中压入的是实际内容的地址。被调用者可以直接更改该地址中的内容。 如果学过C++的人,了解过形参和实参的原理的话,即可知道其区别。
- Function s1(ByVal dd1 As Long) As Long
- s1 = dd1
- dd1 = dd1 + 1
- End Function
- Function s2(ByRef dd2 As Long) As Long
- s2 = dd2
- dd2 = dd2 + 1
- End Function
- Private Sub Mytest()
- Dim a As Long, b As Long, c As Long
- c = 1234
- a = s1(c)
- Debug.Print a
- Debug.Print c '传值原数据没有改变
- b = s2(c)
- Debug.Print b
- Debug.Print c '传址原数据改变了1235
- End Sub
|
4楼 海洋之星 |
学习了,哈哈 |
5楼 海洋之星 |
学习了 |
免责声明
有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素,
经与ExcelTip.Net站长Apolloh商议并征得其同意,
现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示,
供有需要的人士查询使用,也慰缅曾经的论坛时代。
所示各个帖子的原作者如对版权有异议,
可与本人沟通提出,或于本站点留言,我们会尽快处理。
在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一