Excel VBA编程  传址与传值
参数是主调过程和被调过程之间传送数据的重要手段。程序在调用一个有参数的过程时,要把语句中的“实参”依次传递给被调用过程的“形参”,然后执行被调用过程中的语句。形参相当于过程中的过程级变量,参数传递相当于给变量赋值。过程结束后,程序返回到调用它的过程中继续执行。
在VBA中,调用过程时的参数传递有两种方式:按值传递(ByVal,简称传值)和按地址传递(ByRef,简称传址)。其中传址又称为引用,是默认方式。它们之间的区别如下:
在定义形式上前者在形参前加ByVal关键字。
在作用上值传递只能从外界向过程传入初值,但不能将结果传出;而地址传递既可传入又可传出。
如果实参是数组、自定义类型、对象变量等,形参只能是地址传递。
1.传址
按地址传递参数时,系统将实际参数(简单变量、数组或数组元素以及记录)的地址(即变量在内存中的位置)作为形式参数的地址,以此访问实际参数的内容,也就是说,形式参数和实际参数占用相同的内存单元。这种方式下,当程序修改了形式参数的值时,实际上也就修改了实际参数的值。在VBA中默认过程中的参数是按照地址传递参数的方式,如果要特别声明,可以在参数前加上ByRef关键字。
通过下面的例子,可以看出按地址传递参数如何永久改变所传递变量的内容。例如,定义一个有两个参数的过程,并调用这个过程,如图8-2所示。
图8-2  参数传址
代码如下:
vba 字符串转数组Sub 调用传址()
  Dim a As Integer, b As Integer
  a = 10: b = 20
  Debug.Print "传址之前:"
  Debug.Print "a="; a, "b="; b
  传址 a, b
  Debug.Print "传址之后:"
  Debug.Print "a="; a, "b="; b
End Sub
Sub 传址(x As Integer, y As Integer)
  x = x + 100
  y = y * 6
End Sub
可以看出,在“传址”过程中对x,y的改变,实际上是对参数变量a,b的改变。也就是说,在调用过程时,系统将变量a和b的地址分别传递给了x,y,这样在程序中x,y实际上在内存中就改变了变量a,b的内容。
如果给按地址传递参数指定数据类型,就必须将这种类型的值传给参数。在使用参数时,除了可以给参数传递某一数据类型的变量外,还可以给参数传递一个表达式或者一个具体的数组、字符串等等。如果形参和实参的数据类型不相符,例如在上面程序代码中定义变量a为单精度型。则系统会提示错误信息,提示参数类型不匹配,如图8-3所示。
图8-3  提示错误
对于形参和实参数据类型不匹配的情况,可以有两种解决方法。
利用类型转换函致  将实参强制转换为相应类型的数值,例如,如果变量A是一个单精度数,如果所使用函数要求是整数,可以用转换函数将这个变量转换为整数,然后再传递到函数中。
使用自动类型转换  将需要转的变量用括号括起来即可。
一般来说,只有需要在过程中改变形参的内容时,才会使用按地址传递参数的方式。因为这种方式很可能在用户意想不到的地方改变形参的内容,造成程序的错误。用户可以选择使用按值传递参数的方式,来实现参数传递。
2.传值
按值传递参数就是通过值传送实际参数,传送的是实参的值而不是它的地址。在这种情况下,系统把需要传送的变量复制到一个临时单元中,然后把该临时单元的地址传送给被调用的通用过程。由于通用过程没有访问变量(实参)的原始地址,因而不会改变原来变量的值,所有的变化都是在变量的副本上进行的。
在VBA中,按值传递参数是通过关键字ByVal来实现的。也就是说,在定义通用过程时,如
果形参前面有关键字ByVal,则按值传递该参数,否则按地址传递该参数。在传值方式下,VBA为形参分配内存空间,并将相应的实参值赋值给各形参。
例如,将前面的例子改写为按传值方式传递参数,则运行结果是不一样的,如图8-4所示。再次运行该程序,从【立即窗口】中出现的结果可以看出,利用按值传递参数的方式没有改变a和b的值。
图8-4  参数传值
代码如下:
Sub 调用传值()
  Dim a As Integer, b As Integer
  a = 10: b = 20
  Debug.Print "传值之前:"
  Debug.Print "a="; a, "b="; b
  传值 a, b
  Debug.Print "传值之后:"
  Debug.Print "a="; a, "b="; b
End Sub
Sub 传值(ByVal x As Integer, ByVal y As Integer)
  x = x + 100
  y = y * 6
End Sub
3.传送方式
传址方式的效率比传值要高,但形参并不是一个真正的局部变量,有可能对程序的运行产生干扰。传值方式的效率虽然较低,但形参是一个真正的局部变量,不会对程序的运行产生干扰,如图8-5所示。
图8-5  传址方式与传值方式示意图

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。