Excel-VBA基础(17):创建自定义函数并存为模板调用示例

需求

日常工作中经常用到比Excel内置函数复杂的数据计算,而且使用频率非常高,有时候可以通过增加过渡数据,利用内置函数而解决,但有时候通过内置函数解决不了。此时可以用自定义函数的方法解决。

解决方案

在工作簿中增加一个模块,在其中用“Function 函数名称(参数列表)…End Function”定义一个函数过程,将Excel内置函数难以实现的功能都设置在函数过程中,在工作表中调用该函数即可。

将此工作簿另存为模板文件“*.xltm”,在新建工作簿时选择该模板,即可重用此前设计的自定义函数。

1、个人所得税的自定义函数应用

个人所得税计算公式:应交个人所得税=计税工资×税率-速算扣除值

税率和速算扣除值根据计税工资而有不同的档次,如下表所示(示例用,非真实税率)。

计税工资(元)税 率速算扣除值(元)
5000.050
20000.125
50000.15125
200000.2375
400000.251375
600000.33375
800000.356375

制作自定义函数

本实例设计流程:将个人所得税的计算公式移植到函数过程中,利用“Select Case…Case…End Select”控制语句,判断各档次计税工资对应的税率和速算扣除数值,然后根据公式“应交个人所得税=计税工资×税率-速算扣除值”计算出个人所得税,将计算结果再返回自定义函数。

具体的操作过程如下:

1、新建工作簿,选择【开发工具】→【Visual Basic】命令,进入VBE编辑窗口

2、在工程资源窗口中的任一对象上右击,弹出快捷菜单,选择【插入】|【模块】命令,插入一个模块“模块1”,如下图所示。

v2-d59d84c11ec64b355fb98d25a9a114f2_b.jpg

3、在“模块1”中输入如下宏代码。

'将计税工资所在的单元格传值给函数
Function calTax(ByVal SalaryCell As Range)
     Dim TaxRatio As Single		'定义税率变量
     Dim Taxlng As Long			'定义速算扣除变量
     Dim Salary As Single		'定义计税工资变量
     
     '从计税工资单元格中取得应税工资数值
     Salary = SalaryCell.Value
     '判断计税工资所属的档次,每个档次对应不同的税率和速算扣除值
     Select Case Salary			'判断Salary变量值
     Case 0						'变量Salary=0
          TaxRatio = 0
          Taxlng = 0
     Case Is <= 500				'变量Salary<= 500
          TaxRatio = 0.05
          Taxlng = 0
     Case Is <= 2000				'变量Salary<= 2000
          TaxRatio = 0.1
          Taxlng = 25
     Case Is <= 5000				'变量Salary<= 5000
          TaxRatio = 0.15
          Taxlng = 125
     Case Is <= 20000			'变量Salary<= 20000
          TaxRatio = 0.2
          Taxlng = 375
     Case Is <= 40000			'变量Salary<= 40000
          TaxRatio = 0.25
          Taxlng = 1375
     Case Is <= 60000			'变量Salary<= 60000
          TaxRatio = 0.3
          Taxlng = 3375
     Case Is <= 80000			'变量Salary<= 80000
          TaxRatio = 0.35
          Taxlng = 6375
     End Select
     '计税工资×税率-速算扣除值=应交个人所得税
     calTax = Salary * TaxRatio - Taxlng
End Function

程序代码中重点语法介绍:

(1)函数中参数数值的传递有两种方法:按地址传递和按数值传递。

按地址传递参数(Byref)的方法效率较高,因为在过程内所有按地址传递的参数所花费的传递时间与空间的总数(4字节)都是一样的,而不管参数的数据类型。

按值传递参数(Byval)会在过程内部消耗掉2~16字节,取决于参数的数据类型。对于大的数据类型按值传递会比小的数据类型需要稍长的时间。因此,String和Variant数据类型通常不按值来传递参数。

使用按地址传递参数的方法,将使过程访问到实际的变量。结果,过程可改变变量的真正值,不声明传递参数的方法时,默认按地址传递参数。

使用按值的方法时会将原来的变量复制一份,当做参数传递过去,改变过程内部的参数时将不会影响到原来的变量。例如函数:

Function Factorial(ByVal MyVar As Integer)     '按值传递MyVar变量值
     MyVar = MyVar – 1  'MyVar变量减去1
     If MyVar = 0 Then  '判断MyVar变量值,如果等于0,给函数返回值1
         Factorial = 1
         Exit Function   '退出函数
     End If
     Factorial = Factorial(MyVar) * (MyVar + 1)   '调用函数自身循环
End Function “testVar”

再制作一个测试过程,调用函数Factorial,变量S经过函数调用后,数值发生改变,但Factorial函数并没有改变原来有数值。

Sub testVar()				'测试按值传递参数
     Dim S As Integer		'声明整数变量
     S = 5			'给测试变量赋值
     Debug.Print Factorial(S)	' 显示 120 (5 的因子)
     Debug.Print S		'显示 5,Factorial函数并没有改变原来有数值
End Sub

(2)利用Select…Case…End Select分支判断语句判断计税工资所属的档次,每个档次对应不同的税率和速算扣除值。

语句“Select Case Salary”首先确定判断条件是工资变量值“Salary”,然后用多个类似于“Case Is <= 5000”的语句判断工资变量“Salary”值是不是小于等于指定的数值,如果符合条件,则给税率变量“TaxRatio”和速算扣除变量“Taxlng”赋予不同的数值。

(3)函数的返回值。语句“calTax = Salary * TaxRatio - Taxlng”将个人所得税的计算结果赋予“calTax”函数本身,根据编程的需要,有时可以用类似于“Function calTax(ByVal SalaryCell As Range) as String ”的形式,直接指定函数“calTax”的类型。

调用自定义函数

如下所示,在工资表的T5单元格中输入自定义函数“=calTax(S5)”,单元格S5作为参数传递给自定义函数“calTax”,即可得到所应扣除的个人所得税金额。

有两种办法将单元格T5的公式复制到T6和同列的其他行单元格:

(1)拖动单元格T5右下角的句柄

到同列的其他单元格,释放鼠标即可。

(2)复制单元格T5,选中同列其他需要计算个人所得税的单元格,粘贴即可。

v2-e6caf9f0c0055cae4270820038640b93_b.jpg

如何重复使用自定义函数

1.将包含有自定义函数的工作簿另存为模板文件并使用,具体操作步骤如下:

(1)、单击【文件】-【另存为】命令,弹出如图3-3所示的对话框,在窗口下方的【保存类型】下拉列表框中选择项目【Excel 启用宏的模板(*.xltm)】选项,将包含自定义函数“calTax”的工作簿另存为“自定义函数.xltm”,模板文件自动保存在当前用户的模板目录下。

v2-406b3bf17849a0e5a735e95c42d2f305_b.jpg

2、新建工作簿时调用包含有自定义函数的模板

(1)、单击【文件】,选择【新建】命令,弹出如下图所示的【新建工作簿】对话框。

v2-0aaf0946576f75b6b6550af5f21739f2_b.jpg

(2)、在【个人】标签下,选择“自定义函数.xltm”,单击【确定】按钮,即可创建以文件“自定义函数.xltm”为模板的新的工作簿。

(3)在新的工作簿中用户可以直接调用自定义函数“calTax”,以模板文件为基础制作新的工作表和内容,节省大量人力。

总结

类似于个人所得税这样的函数,在日常工作中可能经常用到。每个行业都有自己的特殊计算要求,均可做成自定义函数,再另存为模板,普及到每个操作人员,这样就可以统一规范计算方法,并且一劳永逸。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录: 1.返回 Column 英文字 2.查询某一值第num次出现的值 3.返回当个人工资薪金所得为2000元(起征点为850元)时的应纳个人所得税税额 4.从形如"123545ABCDE"的字符串中取出数字 5.从形如"ABCD12455EDF"的字符串中取出数字 6.按SplitType取得RangeName串值中的起始位置 7.将金额数字转成中文大写 8.计算某种税金 9.人民币大、小写转换 10.查汉字区位码 11.把公元年转为农历 12.返回指定列数的列标 13.用指定字符替换某字符 14.从右边开始查找指定字符在字符串中的位置 15.从右边开始查找指定字符在字符串中的位置 16.计算工龄 17.计算日期差,除去星期六、星期日 18.将英文字反转的自定函数 19.计算个人所得税 20.一个能计算是否有重复单元的函数 21.数字金额转中文大写 22.将数字转成英文 23.人民币大小写转换 24.获取区域颜色值 25.获取活动工作表名 26.获取最后一行行数 27.判断是否连接在线 28.币种转换 29.检验工作表是否有可打印内容 30.查找一字符串(withinstr)在另一字符串中(findstr1)中某一次(startnum)出现时的位置,返回零表示没找到。 31.增加文件路径最后的“\”符号 32.计算所得税 33.从工作表第一行的标题文字以数字形式返回所在列号 34.在多个工作表中查找一个范围内符合某个指定条件的项目对应指定范围加总求和 35.返回 Column 英文字 36.查找指定列名的列数 37.文字格式的时间(分:秒)转化为数字格式(秒) 38.将"hh:mm:ss"格式的时分秒数转换成秒数 39.金额中文大写转数字 40.把角度转为度秒分、弧度等显示 41.身份证号码侦测 42.显示公式 43.方便财务人员理帐查找 44.数值转换为字符地址 45.字符地址转换为数值 46.等待时间(以秒计算) 47.得到字符串实际的长度(以单字节记) 48.18位身份证最后一位有效性验证 49.计算符合maturity condition的拆解金额 50.对多个用同一分隔符分隔的待查找元素,逐一在表区域首列内搜索,将返回选定单元格的值相加,相当于多个vlookup函数相加,对于查找不到的元素在批注中添加,以提醒用户。 51.根据个人所得税(工资)反算工资数 52.判断表是否存在 53.角度转弧 54.比较相同的字符串 55.对选定的数组进行排序 56.取得指定月份天数 57.排序工作表活页薄 58.统计数组中非重复数据个数 59.摘取子字符串 60.计算20000余个汉字的笔画 61.删除当前工作表中的全部超连接 62.取得相近数据 63.提取定串中汉字 64.搜索重复数据(选定范围) 65.字符型转数字型 66.小写人民币转大写人民币 67.取得指定月份人星期天个数 68.侦测档案是否包含宏 69.获取循环参照单元格 70.创建桌面快捷方式 71.自动建立多级目录 72.统计经筛选后符合条件的记录条数 73.复制单元格列高与栏宽 74.取消隐藏工作表(包括vba Project工程保护的) 75.删除单元格自定义名称 76.从文件路径中取得文件名 77.取得一个文件的扩展名 78.取得一个文件的路径 79.十进制转二进制 80.检查一个数组是否为空 81.字母栏名转数字栏名 82.数字栏名转文字栏名 83.判断一件活页夹中是否还有子目录 84.判断一个文件是否在使用中 85.列出档案详细摘要信息 86.获取菜单ID编号及名称列表 87.状态列动态显示文字 88.取得一个文件的路径2 89.取得一个文件的路径3 90.取得Activecell的栏名 91.取得单元格中指定字符前的字符 92.前单元格指定字符前的字符颜色改成红色 93.根据数字返回对应的字母列号 94.取工作表名字 95.取消所有隐藏的宏表 96.导出VBA Project代码 97.导入VBA Project代码 98.取得汉字拼音的第一个字母 99.获取两栏中相同的数据 100.选取当前工作表中公式出错的单元格﹐关返回出错个数 101.将工作表中最后一列作为页脚打印在每一面页尾 102.获取vbproject引用项目 103.移除Excel工作表中的外部数据连接 104.将选择定单元格作成镜像图片 105.反选择单元格中的数 106.在Excel中加入一个量度尺(以厘米为单位) 107.在Excel中加入一个量度尺(以寸为单位) 108.取得一个短文件名的长文件名 109.取得临时文件名 110.等用Shell调用的程序执行完成后再执行其它程序 111.将Mouse显示成动画 112.限制Mouse移动范围 113.取得当前激活窗品句柄及标题 114.取得屏幕分辨率 115.自动建立多级目录 116.将文件长度置零 117.读取WIN9X / Me共享文件夹密码 118.取得预设的打印机及设置预设的打印机 119.获得当前操作系统的打印机个数及检测打印是否存在 120.枚举打印机名称清单 121.读取网络服务器当前时间 122.下载文件到指定目录 123.自动映射网络驱动器 124.自动断开网络驱动器 125.连接选定单元格中的内容 126.获取一个单元格中有指定字体颜色部份数据 127.对指定文件加XLS加密 128.选择指定范围内使用了填充颜色的单元格 129.在特定的区域内查找文本,返回值是包含查找文本的单元格 130.返回特定区域中最大值的地址 131.删除表格中使用范围内的所有空白单元格 132.返回数组中有多少个指定的字符串 133.返回当前工作表中引用了指定的单元的地址 134.获取Excel中字型列表 135.获取一个字符串中有多少个数字字符 136.在Excel中对多列进行填充 137.对选定的范围进行数据填充(忽略单元格格式) 138.VBA Project加密及解密 139.列出收藏夹中的网址 140.计算两个日期之间相隔的年份,比如年龄,工龄等.可计算从1000年01月01日起的日期 141.从字符串提取纯数字 142.将一个数组按升序排列 143.将一个数组按降序排列 144.删除空白列 145.判断工作表是否为空白 146.将数据按类分到不同工作薄 147.单元格内数据排序 148.对多栏排序 149.返回计算公式的值 [,值的计算公式] 150.把第一列=某个值对应的第二列的内容连在一起,并用、隔开 151.取得系统使用模式 152.计算机注销/关机/重启 153.更改计算机名称 154.从n位开始取出字符串中的汉字、英文字母、数字 155.在指定列中寻找含有指定字符串的单元格,并将符合条件的单元格标为红色,并将对应的下一列单元格赋值为1 156.清除字符串中的空格 157.查找合并单元格位置 158.阴阳历转换和阴阳历生日 159.利用数组和Substitute来替换某字符 160.一键创建斜线表头 161.自动获取指定月的工作日

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值