VBA中ByVal和 ByRef有什么区别?

 我来答
Di_Foil
2015-07-27 · TA获得超过548个赞
知道小有建树答主
回答量:199
采纳率:40%
帮助的人:136万
展开全部

ByRef:

按地址传递(ByRef),是指主程序直接将数据交给子过程(过程中定义传递方式),在过程中修改、调试、返回给主程序,主程序输出的是修改后的值。

例如:如果我在参数中设为ByRef,那么ByRef的这个变量我可以改变它的值


ByVal:


按值传递(Byval),是指将主程序的值(副本一份)给子过程,过程对副本操作,主程序输出的仍是原值。若想输出值传递后的值,可在子过程中设置输出。

例如:如果我在参数中设为ByRef,那么ByRef的这个变量我不可以改变它的值,改变的只是它的副本,没有任何意义


下面是一个实例:


Sub Test(ByRef a As Integer, ByVal b As Integer) 
'注意,此处a是按地址传递,b是按值传递
a = 3
b = 4
End Sub

'这里是主程序
Sub Main()
Dim a As Integer
Dim b As Integer
a = 1
b = 2
Test(a, b)
MsgBox ("a=" & a & ";b=" & b)
End Sub

以上代码运行之后的结果是

a=3;b=2

这说明,ByRef 可以改变传入的值,而ByVal不行

盖纸514599
2013-08-24 · 超过59用户采纳过TA的回答
知道答主
回答量:124
采纳率:33%
帮助的人:60.7万
展开全部
ByVal表示该参数按值传递。 ByRef表示该参数按地址传递。ByRef 是 Visual Basic 的缺省选项。 按值:一种将参数值而不是将地址传递给过程的方式,这就使过程访问到变量的复本。结果,过程不可改变变量的真正值。 按地址:一种将参数地址而不是将值传递给过程的方式,这就使过程访问到实际的变量。结果,过程可改变变量的真正值。除非另作说明,否则按地址传递参数。 简明一点说:以ByVal传递给过程,过程里有代码对这个变量做了更改,在过程结束返回后这个变量还是调用过程前的值,不会变化。以ByRef传递给过 程,过程里有代码对这个变量做了更改,在过程结束返回后这个变量的值就是过程里改成的那个值。 下面举个例子: (1)ByVal示例 Sub TmpByVal() Dim a As Stringa = "2"Call FunByVal(a) MsgBox CStr(a)End SubFunction FunByVal(ByVal a)a = "3"End Function (2)ByRef示例 Sub TmpByRef() Dim a As Stringa = "2"Call FunByRef(a) 总结:vb(vba)中,除非你有足够的理由和有了足够的准备接受传址得来的值,都要使用ByVal来传值,ByRef意味梦魇的开始!但不要因为怕 ByRef就不用,而是要注意出现梦魇时要想到那可能是使用ByRef的结果。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式