七、自定義函數&帶參數的sub過程


一、自定義函數
(1)用“DEMO-1-打造新的函數” 演示自定義函數:例1,轉美金函數,例2,根據性別生成稱呼(function ch(st as string)),在工作表和vba中均能用;
(2)(可選)用“DEMO-2-日期轉換”演示自定義日期轉換函數,注意DateSerial(year, month, day)函數返回包含指定的年、月、日的 Variant (Date);
(3)用“DEMO-3-在工作表中調用VBA函數”演示,將vba函數用自定義函數方式轉化到工作表使用;
(4)總結自定義函數的使用,是一組可重復使用的代碼,可以在程序中的任何地方調用。Function   函數名(參數)   “函數體:函數名=······”    End Function   

二、帶參數的sub過程

思考:Function和sub的定義非常類似,function定義時的()的作用是傳遞參數,定義sub過程時為什么也有()?原因在於sub也可帶參數,使得sub代碼可以重用
演示:用“DEMO-4-創建帶參數的過程”演示生成新表的宏被設置參數后可調用,減少了代碼量。

原方案代碼:Sub cjb( )
Dim sht As Worksheet
For Each sht In Sheets
  If sht.Name = sheet1.range("a1") Then
    k = 1
  End If
Next
If k = 0 Then
Sheets.Add after:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = range("a1")
End If

Sub cjb(str As String)
Dim sht As Worksheet
For Each sht In Sheets
  If sht.Name = str Then
    k = 1
  End If
Next
If k = 0 Then
Sheets.Add after:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = str
End If

Sub abc2()
Call cjb(Sheet2.Range("a8"))
Sheet2.Select
End Sub

 

  但原解決方案仍有問題:要設置多個宏調用原宏,且調用所需參數傳遞較為麻煩。

    進一步解決方案如下代碼所示,但注意此時調用宏不能加“call”,否則報錯,研究后發現,若加了“call”,則運行該宏時則會在不運行前序代碼的情況下直接運行call語句,
    造成程序無法識別其參數的問題,進而報錯。具體原因尚待進一步分析。懸賞

Sub abc2()
    Dim k As String
    k = ActiveSheet.Name  '獲取原表的表名
    mycell = Application.InputBox(prompt:="請選擇單元格:", Type:=2)  '彈出選擇單元格的輸入框,返回字符串並傳遞給mycell
 cjb (mycell) '該語句不能加“call”,否則會先運行call語句導致報錯
Sheets(k).Select '返回原表c
End Sub

 三、使用加載宏工具
1、想將一個重復使用,怎么辦?
(1)新建文件,將宏復制到該文件;
(2)另存該文件,選擇“加載宏”的格式后,保存路徑自動切換為“C:\Users\Administrator\AppData\Roaming\Microsoft\AddIns”,該路徑不能更改,是excel默認的加載項路徑;
(3)“開發工具”-->“加載項”-->確定后,excel主程序將一直嵌入該代碼;
(4)關閉原文件后,新打開一個文件:“文件”-->“選項”-->“快速訪問工具欄” -->選擇“宏”-->添加“test”后確定
                        或-->“自定義功能區” -->選擇“宏”-->按要求添加“test”、修改圖標后確定(圖標不能自定義,懸賞
(5)觀察左上方的快速訪問工具欄,多出來的按鈕已可使用該宏。用“DEMO-6-無代碼數據”和“DEMO-5-第四講中的拆分文件”演示該按鈕的作用。
(6)為避免以后打開vba后顯示加載宏的代碼,可“開發工具”-->“加載項”-->將該加載宏前的勾去掉並點確定。
2、可否用同樣方式重復使用自定義函數
  重復上述步驟(1)--(3)即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM