excelperfect

在《Excel VBA解读(27):看看VBA的Sub过程和Function过程》中,我们讲解了Function过程的基本形式。在《Excel VBA解读(121):Sub过程详解——枯燥的语法》中,我们详细介绍了Sub过程的语法。与讲解Sub过程一样,本文主要详细讲解Function过程的语法,虽然枯燥一些,但这是VBA最基础的知识。了解得越全面,在遇到问题时就能很快发现问题所在,也能很快想到解决办法。

Function过程的语法

Function过程的完整语法形式如下: 

[Public| Private | Friend] [Static] Function 过程名称[(参数)][As 类型] [()]

     [此处放置代码语句]

     [过程名称= 表达式 ]

[Exit Function]

[此处放置代码语句]

[过程名称= 表达式 ]

End Function

按照常规约定,在方括号中的内容为可选部分,而方括号中用“|”分隔的内容则是多选一。即,若要使用[Public | Private | Friend],只需根据需要取其一就行了,或者是Public,或者是Private,或者是Friend。

看起来有点复杂!下面来逐一解说。

1.限定词

Public

如果在Function过程中使用Public,则表明可以在该工作簿的所有模块中调用该过程。如果在类模块中使用Public,则可以在工程外部调用该过程。对于Function过程来说,Public是默认值。

Private

如果在Function过程中使用Private,则表明只有过程所在模块中的其他过程才能调用该过程。

Friend

仅在类模块中有效。如果在类模块的Function过程中使用Friend,则表明可以在工程的所有模块中调用该过程,但不能在该工程外的模块中使用该过程。

以上3个可选的关键字涉及到作用域,也就是指定了过程的影响范围。作用域是一个很重要的概念,我们在《Excel VBA解读(122):变量的作用域和生存期》中已经专门讲述。

Static

在过程调用时,保留该过程内部声明的变量值,即保持该过程内所声明的变量的值不变。

2.参数

过程名称后的括号中,可以为空,也可以放置参数。参数就是从调用过程传递给函数过程的变量列表,变量之间用逗号分隔。

其详细的语法如下:

[Optional] [ByVal | ByRef][ParamArray]变量名[()] [As 类型] [=默认值]

Optional

用来指定参数是可选的,也就是说在调用该过程时不一定要提供这个参数。但是,如果使用Optional指定了某参数可选,那么该参数后面的所有参数也必须是可选的。注意,参数ParaArray不是可选参数。

ByVal

指定参数通过值传递,也就是说,将该参数值赋给变量的副本。在调用过程中对参数值的改变,不会影响被调用过程的参数值。

ByRef

指定参数通过引用传递,也就是说,变量是对被传递参数的引用。在被调用过程中对参数值的修改,会影响调用过程中的参数值。这是默认的传递参数的方法。

ParamArray

指定参数是包含任意元素的可选变体数组,只能作为参数列表的最后一个元素,并且不能与ByRef、ByVal或者Optional同时使用。

变量名

可以包含参数引用或参数值的局部变量名称。

类型

指定参数的数据类型。

默认值

对于可选参数,可以为其指定一个缺省值。

3.As 类型

用来指定Function过程返回的数据类型。

4.Function

表示函数过程的开始。

5.过程名称

每个Function过程必须有一个名称。其命名规则与变量相同,参见《Excel VBA解读(15):变量和常量》。通常,过程名称最好能简单表达该过程的作用。

6.表达式

函数过程返回给调用过程的值。

7.Exit Function

提前退出函数过程。

8.End Function

表示过程的结束。

使用规则

1.如果模块开头放置了Option Private语句,那么即便使用Public声明了Function过程,该过程也会被看成是Private的。

2.Function过程返回值,这是通过对函数过程名称赋值来传递给调用过程的,可以作为表达式的一部分。

3.函数过程名赋值可以在该过程内多次执行。

4.Function过程可以包括任意条Exit Function语句,用来强制退出该过程。程序将从调用该过程的语句的下一行代码继续执行。在执行Exit Function语句时,若没有给函数过程赋值,则返回具有指定的返回值数据类型的缺省值。若函数过程返回的数据类型是一个对象引用,则强制退出时返回值Nothing。

5.要从函数过程返回对象引用,必须使用Set语句赋值给函数过程名作为返回值。

6.函数过程的返回值可以是某类型的数组。但是,在函数过程声明时,指定的数据类型后面必须加上小括号;此外,在调用过程中接受函数过程返回值的数组必须与函数过程的数据类型相同。一般在调用过程中,将接受返回值的数组声明为动态数组。

7.在参数列表中不能出现用户定义类型作为可选参数。

8.可选对象参数的缺省值只能为Nothing。

在接下来的几篇文章中,我将围绕Function过程来详细讲解。