上节介绍了过程的传递参数部分内容,即实参与形参的结合。
在VBA中实参可以通过两种方式将数据传递给形参,分别为传地址和传值,都是在创建通用过程定义变量时。
由于概念生硬不易理解,还是先说示例,再总结介绍。
一、 传 地 址
传地址是VBA默认的数据传递方式,在定义过程时,如果形参前面有关键字ByRef或者省略,则该参数通过传地址的方式传递。下面先看示例:
首先在模块中创建jisuan过程,ByRef a As Integer为按地址将实参传递给形参。
创建diaoyong过程,先定义了整型变量b,给b赋初始值为2。然后调用jisuan过程,将变量b作为实参按地址传递给变量a,进行计算a=a 1。此时再在立即窗口中显示变量b,就会发现它已经经过计算变成了3。
这是因为在调用过程时,将变量b做实参按地址传递给变量a,变量b和变量a指向同一个内存单元,一起变化。
注 意 点
1、前面说过sub过程通常不能返回运算结果的,如果需要返回值时,是可以利用ByRef方式来定义形参,这样就可以将子过程的运算数据返回调用程序中。
2、当形参定义为ByRef形式时,只有当实参为一个变量时,才能按地址方式传递参数,如果实参是一个表达式或者常量,则不能按传地址方式传递。
二、 传 值
传值是将实参的值作为一个副本,赋值给形参。定义过程中,在形参面前添加ByVal关键字,则该参数就按传值方式传递。
将上面示例中传地址的方式改成传值方式再运行一次,对比下结果。
在jisuan过程,ByVal a As Integer为按值将实参传递给形参。
在diaoyong过程,先定义了整型变量b,给b赋初始值为2。然后调用jisuan过程,将变量b作为实参按值给变量a,进行计算a=a 1。此时再在立即窗口中显示变量b,b的值仍为2。
所以使用传值方式传递参数时,传递的只是变量的副本,类似于一次赋值操作,改变只是在jisuan过程中,而再调用过程diaoyong中变量的值没有改变。
传地址与传值对比
两种方式,在程序中使用传地址方式比传值方式效率高,但是传地址方式中,有可能对程序产生不必要的影响。
为了在实际当中应用,一些原则可供参考:
1,形参如果是数组、自定义变量、对象变量,则只能用传址方式
2,形参前用了Byval,或者对应参数是常数、表达式,都是传值方式
3,形参前为Byref,或者没有关键词,都是传址方式。
4,实参为变量,且变量放在括号内,如“(a)”,则为传值。这种情况不多见
“传址”还是“传值”,该怎么选择呢?
1,如果希望通过过程调用,并修改对应实参的数值,用传址
例如:要实现两个变量值的交换,宜用传址
例如:要计算三个数的累加和额函数过程,在定义形参时,宜用传值。因为不希望在函数调用后,这三个参数值有什么改变
2,传址方式的速度快,但增加了过程的相互牵连;也不利于程序调试。而传值则相反
在实际中,可以先用传值方式,等调试后,再改为传址方式
3,用传址方式,要求实参与形参的数据类型完全一致
本节主要介绍过程的参数传递问题,重点是区分传地址和传值两种方式,结合示例去理解。(对于实参是数组的一类,后期介绍完数组的之后会补充。)
下一节将介绍可选参数和可变参数。祝大家学习快乐。