Excel-VBA基础(17):创建自定义函数并存为模板调用示例
需求
日常工作中經常用到比Excel內置函數復雜的數據計算,而且使用頻率非常高,有時候可以通過增加過渡數據,利用內置函數而解決,但有時候通過內置函數解決不了。此時可以用自定義函數的方法解決。
解決方案
在工作簿中增加一個模塊,在其中用“Function 函數名稱(參數列表)…End Function”定義一個函數過程,將Excel內置函數難以實現的功能都設置在函數過程中,在工作表中調用該函數即可。
將此工作簿另存為模板文件“*.xltm”,在新建工作簿時選擇該模板,即可重用此前設計的自定義函數。
1、個人所得稅的自定義函數應用
個人所得稅計算公式:應交個人所得稅=計稅工資×稅率-速算扣除值
稅率和速算扣除值根據計稅工資而有不同的檔次,如下表所示(示例用,非真實稅率)。
| 計稅工資(元) | 稅 率 | 速算扣除值(元) |
| 500 | 0.05 | 0 |
| 2000 | 0.1 | 25 |
| 5000 | 0.15 | 125 |
| 20000 | 0.2 | 375 |
| 40000 | 0.25 | 1375 |
| 60000 | 0.3 | 3375 |
| 80000 | 0.35 | 6375 |
制作自定義函數
本實例設計流程:將個人所得稅的計算公式移植到函數過程中,利用“Select Case…Case…End Select”控制語句,判斷各檔次計稅工資對應的稅率和速算扣除數值,然后根據公式“應交個人所得稅=計稅工資×稅率-速算扣除值”計算出個人所得稅,將計算結果再返回自定義函數。
具體的操作過程如下:
1、新建工作簿,選擇【開發工具】→【Visual Basic】命令,進入VBE編輯窗口
2、在工程資源窗口中的任一對象上右擊,彈出快捷菜單,選擇【插入】|【模塊】命令,插入一個模塊“模塊1”,如下圖所示。
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=0TaxRatio = 0Taxlng = 0Case Is <= 500 '變量Salary<= 500TaxRatio = 0.05Taxlng = 0Case Is <= 2000 '變量Salary<= 2000TaxRatio = 0.1Taxlng = 25Case Is <= 5000 '變量Salary<= 5000TaxRatio = 0.15Taxlng = 125Case Is <= 20000 '變量Salary<= 20000TaxRatio = 0.2Taxlng = 375Case Is <= 40000 '變量Salary<= 40000TaxRatio = 0.25Taxlng = 1375Case Is <= 60000 '變量Salary<= 60000TaxRatio = 0.3Taxlng = 3375Case Is <= 80000 '變量Salary<= 80000TaxRatio = 0.35Taxlng = 6375End 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變量減去1If MyVar = 0 Then '判斷MyVar變量值,如果等于0,給函數返回值1Factorial = 1Exit Function '退出函數End IfFactorial = 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,選中同列其他需要計算個人所得稅的單元格,粘貼即可。
如何重復使用自定義函數
1.將包含有自定義函數的工作簿另存為模板文件并使用,具體操作步驟如下:
(1)、單擊【文件】-【另存為】命令,彈出如圖3-3所示的對話框,在窗口下方的【保存類型】下拉列表框中選擇項目【Excel 啟用宏的模板(*.xltm)】選項,將包含自定義函數“calTax”的工作簿另存為“自定義函數.xltm”,模板文件自動保存在當前用戶的模板目錄下。
2、新建工作簿時調用包含有自定義函數的模板
(1)、單擊【文件】,選擇【新建】命令,彈出如下圖所示的【新建工作簿】對話框。
(2)、在【個人】標簽下,選擇“自定義函數.xltm”,單擊【確定】按鈕,即可創建以文件“自定義函數.xltm”為模板的新的工作簿。
(3)在新的工作簿中用戶可以直接調用自定義函數“calTax”,以模板文件為基礎制作新的工作表和內容,節省大量人力。
總結
類似于個人所得稅這樣的函數,在日常工作中可能經常用到。每個行業都有自己的特殊計算要求,均可做成自定義函數,再另存為模板,普及到每個操作人員,這樣就可以統一規范計算方法,并且一勞永逸。
總結
以上是生活随笔為你收集整理的Excel-VBA基础(17):创建自定义函数并存为模板调用示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用XCP测量canIO
- 下一篇: windows 10 64bit下安装T