5.4 优化自定义函数
通过上述操作,用户自定义的Sds函数已经达到了预设的目的,但是自定义的函数还有可以继续完善的地方。例如Sds函数并没有包含帮助信息,使用者可能不知道该函数所涉及的参数含义。另外创建的Sds函数只能在创设了Sds自定义函数的工作簿中使用,而不是在所有的工作簿中都可以使用。
5.4.1 添加帮助信息和更改类别
用户创建的自定义函数是没有帮助信息的,默认情况下创建的自定义函数都被归类到了“用户定义”类别下,为了便于查找和使用,可以为自定义函数添加帮助信息和更改类别。
1. 为自定义函数添加帮助信息
自定义函数在设置完成后还可以为自定义函数添加帮助信息,使得其他用户能够知晓自定义函数的作用。
例5-08:为用户自定义的函数Sds添加帮助信息“计算个人工资薪金所得应缴纳的所得税”。
为自定义函数添加帮助的方法如下所示:
(1)打开VBE窗口的“视图”菜单,执行“对象浏览器”命令,打开如图5-10所示的对象浏览器。在搜索中输入Sds,按Enter键确认,得到搜索结果,在“模块1”成员中选择“Sds”选项,右击鼠标,在弹出的快捷菜单中执行“属性”命令。
图5-10 对象浏览器
(2)执行“属性”命令后,打开如图5-11所示的“成员选项”对话框。在“描述”下的文本框内输入对该函数的描述性语言“计算个人工资薪金所得应缴纳的所得税”,单击“确定”按钮,完成了为Sds函数添加帮助。
图5-11 属性窗口
关闭“对象浏览器”,返回到工作表中,任意选中一个单元格,在编辑栏中输入“=sds(”,单击编辑栏上的插入函数按钮,打开如图5-12所示的函数参数对话框。
图5-12 添加帮助信息后的自定义函数
2. 更改自定义函数类别
用户自定义的函数总是被放置在了“自定义”的门类下,为了便于查找也可以将用户自定义的函数放置在系统已有的类别中。在Excel中一共包含有14种函数类别,各类别都是用一个整数值来表示,函数类别的值和类别名称的对应关系如表5-1所示。
表5-1 Category的值和对应的类别
例5-09:将用户自定义的Sds函数放置在财务类别下。
#001: Sub Auto_Open() #002: Application.MacroOptions Macro:="Sds", Category:=1 #003: End Sub
在模块中的任意位置输入上述代码,第1行代码“Sub Auto_Open()”是一个特定的过程。该过程的含义表示当程序运行的时候将会执行的代码。第2行代码表示将Sds函数放置到财务类别中。“Macro:="Sds"”表示的是要更改类别的自定义函数名称,“Category:=1”表示更改后函数的类别是放置在值为1的统计类函数中。
上述代码输入完成后,保存然后关闭Excel。再次打开Excel,单击编辑栏上的插入函数按钮,在“或选择类别”中选择“财务”选项,可以看到选择函数下有“Sds”函数,如图5-13所示。
图5-13 更改函数类别
5.4.2 加载宏
通过上述方法实现的自定义函数只能在创设该函数的Excel工作簿中使用,如果要在本机所有的Excel程序中都能运行,则需要将该函数保存为加载宏的格式,并加载该加载宏。以后在本机其他工作簿中就可以像使用内置函数一样使用自定义的函数。
例5-10:通过加载宏的方式将自定义的Sds函数能够为本机所有的工作簿使用。
(1)打开包含自定义函数Sds的工作簿,进入VBE环境,删除例5-09中将Sds函数放置在财务类别下的代码,按键盘上的Ctrl+s组合键保存按钮保存文档。
(2)在工作簿中单击Office按钮,从展开的菜单中执行“另存为”下的“其他格式”命令,打开如图5-14所示的对话框。保存位置默认为AddIns文件夹,将文件保存类型设置为“Excel 97-2003加载宏(*.xla)”,文件名保存为“Sds”,单击“保存”按钮,完成对文件的保存操作。
图5-14 保存为加载宏
说明
加载宏可以保存在任意位置,不过通常不需要修改。将文件类型保存为“Excel 97-2003加载宏(*.xla)”,目的为了考虑文档的兼容性。
(3)关闭Excel程序,再次打开Excel 2007,单击Office按钮,选择“Excel选项”命令,打开如图5-15所示的Excel选项对话框。选择左侧的“加载项”选项,在右侧的管理下拉列表框中选择“Excel加载项”,单击转到按钮,打开加载宏对话框。
图5-15 Excel选项对话框
(4)在打开的加载宏对话框中,从“可用加载宏”下勾选Sds复选框,如图5-16所示。单击“确定”按钮,完成指定宏的加载。
图5-16 加载宏
(5)关闭所有的Excel文件,然后重新打开Excel 2007,在单元格内输入“=Sds(”,单击编辑栏上的插入函数按钮,就能打开Sds函数参数对话框,这就表示在其他工作簿中也可以使用自定义的Sds函数。
5.4.3 参数优化
再次回到Function过程中的自定义函数Sds,在这段代码中,起征点被定为了2000,但随着国家经济的发展,起征点是在不断调高的。那么一成不变的2000元起征点似乎就不合适了,为此可以对Sds函数进一步完善,再设置一个起征点参数。
例5-11:为Sds函数设置两个参数分别是sr表示工资薪金收入,再设置一个起征点参数qzd,如果该参数指定了数值,那么起征点就按设置的数值进行计算,否则就按照默认的2000元进行计算。
#001: Function sds(sr As Single, Optional qzd) As Single #002: 'sr表示收入,nssd表示的应纳税所得,sl表示所得税税率 #003: Dim sl As Single #004: Dim nssd As Single #005: If IsMissing(qzd) Then #006: qzd = 2000 #007: End If #008: nssd = sr - qzd #009: Select Case nssd #010: Case 0 To 500 #011: sl = 0.05: kcs = 0 #012: Case 500.01 To 2000 #013: sl = 0.1: kcs = 25 #014: Case 2000.01 To 5000 #015: sl = 0.15: kcs = 125 #016: Case 5000.01 To 20000 #017: sl = 0.2: kcs = 375 #018: Case 2000.01 To 40000 #019: sl = 0.25: kcs = 1375 #020: Case 4000.01 To 60000 #021: sl = 0.3: kcs = 3375 #022: Case 6000.01 To 80000 #023: sl = 0.35: kcs = 6375 #024: Case 8000.01 To 100000 #025: sl = 0.4: kcs = 10375 #026: Case Else #027: sl = 0.45: kcs = 15375 #028: End Select #029: If nssd <= 0 Then #030: sds = 0 #031: Else #032: sds = Round(nssd * sl - kcs, 2) #033: End If #034: End Function
第1行代码中Sds参数包括了一个qzd的参数,并且在参数声明的过程中使用了“Optional qzd”,这就表示了qzd这个参数是一个可选参数。
第5行代码中用IsMissing()函数来判断某个可选参数是否被赋值,该函数的运行结果为True或者False,当结果为True的时候,表示可选参数没有被赋值。第5行到第7行代码的含义就是如果指定的参数没有被赋值,那么就将可选参数的值默认赋值为2000。代码的其他部分含义和例5-05一致。
说明
通过设置qzd参数后,如果在单元格内输入“=sds(3200)”,表示的是收入为3200,起征点为2000的时候的应缴纳的所得税,如果在单元格内输入“=sds(3200,800)”就表示收入为3200,起征点为800时候的个人所得税。这就使得我们设置计算个人所得税的函数更加的完善。