Excel VBA语法与应用手册
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

5.3 Function过程概述

通用过程除了Sub过程外,还包括Function过程。在VBA中创建Function过程也叫做创建自定义函数。创建自定义函数能够弥补VBA内置函数和Excel工作表函数的不足,让VBA代码具备更大的灵活性,简化求解过程。自定义函数计算的结果可以是一般的数据类型,也可以是数组和对象。

5.3.1 Function过程概述

和Sub过程类似,Function过程也需要经过声明才可应用。

1. Function过程结构

从结构上来看,Function过程的书写方法如下所示。

    [Private|Public][Static]Function函数名(参数)[As数据类型]
        ……
        [函数名=表达式]
        ……
        [Exit Function]
        ……
    End Function

Function过程的语法结构和Sub过程是非常类似的。在上述结构中,方括号中的内容表示在一定条件下可以省略。

● Private:表示该过程是私有过程,只有位于同一个模块中的其他过程可以调用该Function过程。

● Public:表示该过程是公有过程,在程序的任何位置都可以调用该Function过程。

● Static:表示在该过程中声明的局部变量都是静态变量,当过程结束后,这些值都会被保留。

● As数据类型:表示自定义函数的最终结果是哪种数据类型。如果省略这部分内容,那么最终函数返回的数据类型就是Variant类型。

● 函数名=表达式:表示利用该Function过程最终获得的结果。

● Exit Function:表示不等到过程执行完毕,就提前退出自定义函数过程。

由此可以看出,在Function过程中多了“函数名=表达式”这部分内容。它表明了Function过程和Sub过程的差异。创建Sub过程是执行若干条指令,Sub过程结束后,过程不会返回一个值;而Function结束后通常会返回一个运算结果。

当然也可以省略“函数名=表达式”,如果省略这部分内容。那么函数就会返回一个默认值,默认值遵循如下的规则:

● 数值函数的结果默认为0。

● 字符串函数的结果默认为空字符串。

说明

实际上如果用户最终的Function函数没有返回结果,那么用户就不应该创建Function过程,而应当用Sub过程或者其他手段来代替。

和Sub过程不同的是自定义的函数还可以被工作表所访问到。如果某个Function过程是Public类型的,那么用户可以通过单击编辑栏上的插入函数按钮,可以从打开的插入函数对话框中找到该自定义函数。如果Function前加上了Private,那么此时单击编辑栏上的插入函数按钮,无法从打开的插入函数对话框中找到自定义函数。但是并不代表说该函数在工作表中无法使用,该函数在工作表中依旧可以使用,只是无法通过单击编辑栏上的插入函数按钮来找到该函数。

2. 建立过程

Function过程可以在窗体、工作表、模块及类模块中建立,常见的方式是在模块中创建Function过程。例如建立一个名为“Sds”的Function过程,其具体操作步骤如下所示。

(1)进入VBE编辑器,执行“插入”菜单下的“模块”命令,为程序添加一个模块。

(2)打开“插入”菜单,执行“过程”命令,打开如图5-5所示的“添加过程”对话框。在名称中输入“Sds”,类型选择“函数”单选按钮,单击“确定”按钮,完成过程名称定义。

图5-5 添加过程

通过执行完“添加过程”后,在代码窗口中显示的内容如图5-6所示。

图5-6 代码窗口内容

用户也可以直接在模块的代码窗口中输入Function过程,其操作方法如下。

(1)删除图5-6所示的代码。

(2)在代码窗口中输入“function Sds”,按Enter键即可完成建立“Sds”的Function过程。

当用户按Enter键后,系统会自动将默认部分补齐,和Sub过程类似,由于该过程是一个Public类型的,因此Public可以省略。

5.3.2 Function过程示例

掌握了Function应用的方法,就可以进行自定义函数,通过自定义的函数来扩展Excel的功能。

1. 构造一个简单的自定义函数

例5-05:构造一个名为Sds的函数,通过该函数可以计算个人取得工资薪金收入时候应该扣除的所得税。工资薪金个人所得税的计算方法是:应缴个人所得税=应纳税所得额*对应税率-速算扣除数。

具体代码如下所示。

    #001:  Function Sds(sr As Single) As Single
    #002:     'sr表示收入,nssd表示的应纳税所得,sl表示所得税税率
    #003:     Dim sl As Single
    #004:     Dim nssd As Single
    #005:     nssd = sr -2000
    #006:     Select Case nssd
    #007:         Case 0 To 500
    #008:             sl = 0.05: kcs = 0
    #009:         Case 500.01 To 2000
    #010:             sl = 0.1: kcs = 25
    #011:         Case 2000.01 To 5000
    #012:             sl = 0.15: kcs = 125
    #013:         Case 5000.01 To 20000
    #014:             sl = 0.2: kcs = 375
    #015:         Case 2000.01 To 40000
    #016:             sl = 0.25: kcs = 1375
    #017:         Case 4000.01 To 60000
    #018:             sl = 0.3: kcs = 3375
    #019:         Case 6000.01 To 80000
    #020:             sl = 0.35: kcs = 6375
    #021:         Case 8000.01 To 100000
    #022:             sl = 0.4: kcs = 10375
    #023:         Case Else
    #024:             sl = 0.45: kcs = 15375
    #025:     End Select
    #026:     If nssd <= 0 Then
    #027:        sds = 0
    #028:     Else
    #029:        sds = Round(nssd * sl - kcs, 2)
    #030:     End If
    #031:  End Function

第1行代码声明了一个名为Sds的自定义函数,该函数能够接受一个参数的值,最终运算的结果是一个Single类型的数据。第3行和第4行代码分别设置了两个变量用来表示税率和纳税所得额。第5行代码的作用是计算应纳税所得额,也就是收入扣除起征点后的数值,在当前法律规定下起征点是2000元。第6行到第25行是一个Select Case结构的分支结构。通过结构计算不同应纳税所得额下的速算扣除数。第26到第30行用了If分支结构计算应缴个人所得税金额。第26行代码表示应纳税所得额小于等于0的时候,函数名sds的计算结果为0;如果用户就需要纳税,具体的纳税计算公式由第29行代码给出。在该行代码中还使用了Round四舍五入函数,确保最终结果符合实际。

2. 在工作表中使用

和Sub过程不同,自定义函数可以在工作表中运行。使用自定义函数和使用Excel 2007内置函数并没有什么区别。

例5-06:图5-7是简易工资表的部分内容,要求根据自定义的Sds来计算个人所得税。

图5-7 工资表

具体操作方法如下所示:

(1)选中C2单元格,在编辑栏中输入“=sds(”,单击编辑栏上的插入函数按钮,打开如图5-8所示的函数参数对话框。

图5-8 函数参数对话框

(2)单击Sr参数后文本框,选中单元格区域为B2单元格,单击“确定”按钮,完成个人所得税的计算过程。

用户自定义的函数可以在插入函数对话框中看到。选中任意一个空单元格,单击编辑栏上的插入函数按钮,在“或选择类别”下拉列表框中选择“用户定义”选项,可以看到可供选择的函数就有用户自定义的Sds函数,如图5-9所示。

图5-9 自定义函数位置

3. 被Sub过程调用

自定义的函数不仅仅可以在工作表中使用,而且也可以被其他的自定义的过程所使用。

例5-07:假设某人的工资收入为3000元,在Sub过程中调用创建的自定义函数Sds,用消息框给出最终运算的结果。

    #001:  Sub调用自定义函数演示()
    #002:     Dim sk As Single
    #003:     sk = sds(3000)
    #004:     MsgBox "应纳缴纳个人所得税为:" & sk & "元"
    #005:  End Sub

第2行代码声明了一个变量sk,用来放置税款的金额。第3行代码就使用了自定义函数Sds,向该函数传递了收入的值。第4行代码用消息框的方式显示了税款的金额。