7.4.6 过程

7.4.6 过程

在结构化程序设计中,通常将一个比较复杂的应用程序从逻辑上划分为若干便于求解的小问题,每个小问题用一个过程完成。过程必须先定义后调用,也就是说调用一个过程前一定要先定义这个过程。定义过程实际上就是对过程调用的形式进行约定,对过程的功能进行详细的说明和实现。

VBA中,根据过程是否有返回值,分为SUB过程(子过程或子程序)和Function过程(函数)两种形式,函数有返回值,子过程没有返回值。

1.过程的定义

1)子过程的定义

img416

img417

2)函数的定义

img418

说明:

①<过程名>或<函数名>的命名规则与变量的命名规则相同。

②同一模块内不允许出现相同的过程名或函数名,也不允许同一名称既作为过程名又作为函数名。

③Sub与End Sub、Function与End Function必须配对出现。

④过程定义中使用的<参数表>称为形参(形式参数)表,它指明了从调用过程传递给该过程的变量个数和类型,各参数之间用逗号分隔。参数的声明格式为:

[ByVal|ByRef]<变量名>[As 类型]

其中,ByVal表示参数按值传递,ByRef表示参数按地址传递,默认是ByRef。

⑤过程即使不带参数,过程名或函数名后也必须包含圆括号。

⑥在通常情况下,只有遇到End Sub或End Function语句时才退出过程。若要中途退出过程,可以在子过程或函数中使用Exit Sub或Exit Function语句。

2.通用过程的建立

在VBA中,根据过程是否与窗体、报表或控件等对象的事件有关,分为通用过程和事件过程两种类型,通用过程与对象事件无关,可以存储在窗体模块、报表模块或标准模块中,其代码可以被事件过程或其他过程调用。下面介绍建立通用过程的方法。

在窗体模块或标准模块代码窗口,输入过程入口语句:

Sub <过程名>或 Function <函数名>

按回车键后,VBA编辑器自动加上过程结束语句:

End Sub 或 End Function

在过程入口语句和结束语句之间输入代码。

3.过程的调用

1)子过程的调用

格式1:

Call <过程名>([<参数表>])

格式2:

<过程名>[<参数表>]

注意:

①调用过程中使用的<参数表>称为实参(实际参数)表,它指明了调用过程传递给被调用过程的各个实际参数。这些参数可以是常量、已赋值的变量或表达式,各参数之间用逗号分隔开。

②在通常情况下,调用过程中的实参与过程定义中的形参的个数和数据类型相同(对应的变量名不必相同)。当形参为Variant类型时,实参可以为任意数据类型。调用过程时,VBA会自动将实参一一传递给对应的形参,然后按实参的值执行过程调用。

例如:假设有一过程如下:

img419

本test过程作用是,对传入的变量值进行交换。如通过以下程序段调用该过程:

img420

上面程序段中Call test(a,b)也可写成test a,b。程序运行后通过调用test过程,使变量a,b值交换,变量a的值变为3,变量b的值变为2。

2)函数过程的调用

前面章节中我们学习了系统提供的一些标准函数,函数是由函数名和“()”构成,“()”中可以包含参数,也可以不包含,且函数都有返回值。由于调用函数过程的目的是获取函数值,所以函数过程的调用不能作为独立的语句,调用结果要赋给某个变量。

【例7-7】编程求1到某个数的累加和函数。

img421

img422

则在事件过程或通用过程中,可用以下语句调用该函数。

y=lj(100)'通过赋值语句将函数返回值赋给变量y

debug.pring lj(100)'直接将累加结果输出