3.9 自定义函数,Function过程

Function过程也称为函数过程。编写一个Function过程,就编写了一个函数。

函数可以完成很多复杂的计算。如想求A列的和,可以用SUM函数;想知道A列有多少个“张三”,可以用COUNTIF函数。

img235

Excel并没有提供解决这个问题的工作表函数。这时,可以根据需要自己编写一个。

3.9.1 试写一个函数

Function过程同Sub过程一样,都是保存在模块里,所以,在编写函数前,应先插入一个模块(参阅第2章2.4.1小节)来保存它。

插入模块后,双击模块激活它的【代码窗口】,即可开始编写函数。

img236

如果想让函数生成一个1〜10之间的随机整数,完整的程序为:

img237

3.9.2 使用自定义函数

自定义的函数可以在工作表中使用,也可以在VBA过程里使用。

img062 在工作表中使用自定义函数

在工作表中使用自定义函数同使用工作表函数类似,如图3-45所示。

img238

图3-45 在工作表中使用自定义函数

自定义的函数可以在【插入函数】对话框里找到,如图3-46所示。

img239

图3-46 查看自定义函数

自定义的函数可以和其他函数嵌套使用,如图3-47所示。

如:

img240

图3-47 嵌套使用自定义函数

img062 在VBA过程中使用自定义函数" class="reference-link">img062 在VBA过程中使用自定义函数

在VBA中使用自定函数与使用VBA的内置函数一样,如图3-48所示。

img241

图3-48 在VBA中使用自定义函数

3.9.3 怎么统计指定颜色的单元格个数

img062 问题一:单元格是什么颜色

在Excel里,可以通过RGB函数指定不同的颜色,如想将活动工作表中B1单元格的底纹设置为黄色,代码为:

img242

img243

img062 怎么统计指定颜色的单元格个数

要知道A1:A10里有少个黄色单元格,可以让VBA替我们数一下,是黄色的累计,不是黄色的排除。

img244

在工作表里输入函数,可以看到函数返回的计算结果,如图3-49所示。

img245

图3-49 统计黄色单元格的个数

还可以通过颜色索引号来引用某个颜色,在Excel 2003中,默认情况下,黄色的颜色索引号为6,所以上面的代码还可以写为:

img246

ColorIndex属性引用的是某个索引号上的颜色,而Color返回的是真实颜色。因为颜色的索引号可以更改,所以使用ColorIndex属性引用到的颜色不一定都相同,因此函数不一定能返回正确的结果。

img062 用参数指定计算区域

在工作表中使用函数时,可以通过函数参数指定计算统计的单元格区域。自定义函数也可以使用参数。

如果需要统计的单元格区域不是固定的,可以用变量代替程序里的A1:A10单元格区域,让用户在使用自定义函数时通过函数参数指定区域。

img247

为函数设置参数后,如果要统计A1:C10中黄色底纹单元格的个数,输入公式“=count color(A1:C10)” 即可,如图3-50所示。

img248

图3-50 使用参数的自定义函数

img062 给自定义函数指定第2参数" class="reference-link">img062 给自定义函数指定第2参数

还可以给函数设置第2参数,通过第2参数指定要统计的颜色。

img249

在工作表中使用自定义的函数,如图3-51所示。

img250

图3-51 用参数指定需要统计的颜色

如果需要,还可以为函数添加第3参数,第4参数……

img062 设置自定义函数为易失性函数

有时,当工作表重新计算之后,自定义函数并不会重新计算。如在工作表中使用第3章3.9.1小节中生成随机的自定义函数后,按F9键重算工作表,函数并不会生成新的随机值。

但如果在函数开始添加一条语句,添加语句后,无论何时重新计算工作表,函数都会重新计算,得到新的结果。

img251

注意:使用Application. Volatile True语句是将自定义函数声明为易失性函数。当工作表发生重算后,易失性函数会重新计算函数的值。但因为更改单元格的背景颜色不会让工作表重算,所以,无论是否使用该语句,更改单元格的颜色后,本节中编写的自定义函数CountColor都不会重新计算。

3.9.4 声明函数过程,规范的语句

img252

声明Function过程的语句和声明Sub过程的语句类似。同Sub过程一样,Function函数也分公共函数和私有函数,如果想声明一个私有函数,请一定要加上Private关键字。