ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > VBA中ByVal和ByRef有什么区别?

VBA中ByVal和ByRef有什么区别?

作者:绿色风 分类: 时间:2022-08-17 浏览:226
楼主
amulee
Q:VBA中ByVal和ByRef有什么区别?
A:在VBA过程中,参数传递有两种方式:ByVal和ByRef。
ByRef:按地址传递,改变原先传递参数的变量的值。当没有任何声明的时候,采取此方式传递参数。ByRef常用在递归中。
ByVal:按值传递,仅将变量的值作为参数来传递,不会改变原先变量的值。

运行以下Main过程来体会一下吧。
  1. Sub Test1(ByVal Arg)    '按值传递,不会改变原先变量的值
  2.     Arg = Arg + 1
  3. End Sub
  4. Sub Test2(ByRef Arg)    '按地址传递,改变原先变量的值
  5.     Arg = Arg + 1
  6. End Sub
  7. Sub Main()
  8.     Dim AA
  9.     AA = 1
  10.     Test1 AA        '按值传递,只有Test2里面的Arg变成了2,而不会改变AA的值
  11.     MsgBox AA
  12.     Test2 AA        '按地址传递,改变了AA变量实际存储地址的值,增加了1
  13.     MsgBox AA
  14. End Sub
2楼
gvntw
Q:参数前的ByVal有何作用?
A:在参数前添加关键字ByVal,可以使调用的过程通过“数值”而不是“引用”来传递参数的值,如果不希望被调用的过程修改作为参数传递的变量值,可以使用该方法。
下面的代码供测试,过程test弹出的第1个对话框结果为10,第2个对话框结果为5。
  1. Sub test1(iNumber)
  2.     iNumber = iNumber * 2
  3. End Sub
  4. Sub test2(ByVal iNumber)
  5.     iNumber = iNumber * 2
  6. End Sub
  7. Sub test()
  8.     iNumber1 = 5
  9.     iNumber2 = 5
  10.     Call test1(iNumber1)
  11.     MsgBox iNumber1
  12.     Call test2(iNumber2)
  13.     MsgBox iNumber2
  14. End Sub
3楼
wise
Q:如何理解VBA中的按地址传递(byref)和按值传递(byval)?
A:参数传递分为按地址传递(byref)和按值传递(byval)
参数传递过程就是把你要运算的初始数值(实参)传递给运算的函数中的变量(形参)
ByVal:传送参数内存的一个拷贝给被调用者。也就是说,栈中压入的直接就是所传的值。
ByRef:传送参数内存的实际地址给被调用者。也就是说,栈中压入的是实际内容的地址。被调用者可以直接更改该地址中的内容。
如果学过C++的人,了解过形参和实参的原理的话,即可知道其区别。
  1. Function s1(ByVal dd1 As Long) As Long
  2.   s1 = dd1
  3.   dd1 = dd1 + 1
  4. End Function
  5. Function s2(ByRef dd2 As Long) As Long
  6.   s2 = dd2
  7.   dd2 = dd2 + 1
  8. End Function
  9. Private Sub Mytest()
  10.   Dim a As Long, b As Long, c As Long
  11.   c = 1234
  12.   a = s1(c)
  13.   Debug.Print a
  14.   Debug.Print c  '传值原数据没有改变
  15.   b = s2(c)
  16.   Debug.Print b
  17.   Debug.Print c  '传址原数据改变了1235
  18. End Sub
4楼
海洋之星
学习了,哈哈
5楼
海洋之星
学习了

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap