VBA代码在运行过程中,实际参数的值如何传递给形式参数

大家好,我们今日继续讲解VBA代码解决方案的第124讲内容:VBA程序执行过程中,参数的传递形式。在代码的编写过程中,为了深入的理解代码,有时候要对一些理论的知识必须要做必要的深入了解。我将在这节和下阶内容中着重讲解程序在运行时参数是如何传递的。理论的成分多些,但还是希望朋友们能好好掌握。

首先,我们先来理解一下几个定义:什么是形式参数,什么是实际参数,什么是参数的传递,参数传递有几种形式。

1形式参数 指出现在Sub 和Function过程中的变量名、数组名。该过程在被调用前,没有为它们分配内存,其作用是说明自变量的类型和形态以及在过程中的作用。形参可以是变量名,也可以是数组名。

2 实际参数:就是在调用Sub 和Function过程时,从主调过程传递给被调用过程的参数值。实参可以是变量名、数组名、常数或表达式。在过程调用传递参数时,形参与实参是按位置结合的,形参表和实参表中对应的变量名可以不必相同,但它们的数据类型、参数个数及位置必须一一对应。

3 参数的传递:在程序运行过程中,实际参数将参数值传递给相应的形式参数,然后在函数中实现数据处理和返回的过程。

4 参数的传递有两种:按值传递和按地址传递

① 按值传递:在过程被调用时,传递给形参的是调用过程中的相应实参的值,形参与实参各占有不同位置的储存空间,被调用过程在执行过程中,改变了形参变量的值,但不会调用过程的实参值。在函数声明行在参数名称之前加上关键字ByVal。

② 按地址传递:就是当调用一个过程时,是把实参变量的内存地址(指针)传递给被调用过程的形参,也就是说形参与实参使用相同地址的内存单元。因此当在被调用过程中改变形参的值,就等于改变了实参的值。

上面的几个定义或许你不是很理解,下面我们看一个实例:

Sub MynzNumbers()

Dim a As Integer, b As Integer, c As Integer

a = 10

b = 20

c = 30

MsgBox MyAverage(a, b, c) & " " & a & " " & b & " " & c

End Sub

Function MyAverage(ByVal a, ByVal b, ByVal c)

a = a + 60

MyAverage = (a + b + c) / 3

End Function

代码截图:

看了上面的代码,大家想想maxbox弹出的对话框是什么内容呢?

看看上面的结果,是否和你想的一致呢?

上述过程中使用关键字ByVal在参数名称前,可以防止函数改变参数值。MynzNumbers给三个变量赋值,再调用函数MyAverage来计算该三个变量的平均值。函数的参数就是变量a,b和 c。注意,所有变量的前面都有关键字ByVal。在计算均值之前,函数MyAverage 改变了变量a的值,在函数内部,变量a等于70(10+60),因此,当函数将计算的均值传递给过程MynzNumbers时,MyAverage显示的结果是40而不是20,接下来的三个显示每个变量的内容,变量储存的内容和它们开始被赋的值一致——10,20,30。

那么:

1 如果不是按值传递,结果会是什么呢?

2 a,b,c 变量传递的又是如何由实参变成形参的呢?过程又是如何进行的呢?

3 形参会改变指针吗?

我们下节内容再接着谈。

今日内容回向:

1 什么是形参、实参?

2 如何理解参数的传递过程?参数的传递有几种形式?