|
第10章 Function函數(shù)
上一章曾提到過通用過程包括Sub過程和Function過程,為了便于區(qū)分,本書將Function過程稱為函數(shù)。上一章介紹了過程的創(chuàng)建和調(diào)用方法,并詳細介紹了調(diào)用過程時參數(shù)的傳遞方法。Function函數(shù)過程與Sub過程類似,本章將介紹其用法。
10.1 函數(shù)與過程
Function函數(shù)和Sub過程都屬于VBA的通用過程。對比兩種結構,可發(fā)現(xiàn)它們的相同點和不同點。
相同點:
●都是構成VBA程序的基本單位;
●都可用Public,Private等關鍵字設置過程的作用區(qū)域;
●都可接受參數(shù),參數(shù)的設置相同(如傳遞方式、可選參數(shù)、可變參數(shù)等)。
不同點:
●Sub過程不能返回一個值,而Function函數(shù)可以返回一個值,因此Function函數(shù)可以像Excel內(nèi)部函數(shù)一樣在表達式中使用;
●Sub過程可作為Excel中的宏來調(diào)用,而Function函數(shù)不會出現(xiàn)在”選擇宏”對話框中,要在工作表中調(diào)用Function函數(shù),可像使用Excel內(nèi)部函數(shù)一樣;
●在VBA中,Sub過程可作為獨立的基本語句調(diào)用,而Function函數(shù)通常作為表達式的一部分。
注意:Function函數(shù)也可像Sub一樣作為獨立的語句調(diào)用,只是不會接受函數(shù)的返回值,也就失去了函數(shù)的意義了。
10.2 字義函數(shù)
Function函數(shù)的創(chuàng)建方法與Sub過程類似。在使用Function函數(shù)時,一般需要使用一個變量來接收返回值。
10.2.1創(chuàng)建函數(shù)
創(chuàng)建函數(shù)有兩種方法:通過對話框和手工輸入代碼。通過對話框創(chuàng)建函數(shù)的方法與創(chuàng)建Sub過程相似,在VBE中選擇“插入”┃“過程”命令,打開如圖10-1所示的“添加過程”對話框,在“類型”中選擇“函數(shù)”,輸入函數(shù)名稱即可創(chuàng)建函數(shù)的結構。
![]() 要手工輸入代碼創(chuàng)建Function函數(shù),首先要了解Function結構。其語法格式如下:
![]() 可以看出,F(xiàn)unction函數(shù)結構與Sub過程的結構很相似,下面介紹其不同點:
●聲明函數(shù)名的第一行使用“As返回類型”定義函數(shù)的返回值類型。
●在函數(shù)體內(nèi),通過給函數(shù)名賦值來返回計算結果。
函數(shù)名=表達式1
如果在函數(shù)體內(nèi)沒有上面的語句,則該函數(shù)返回一個默認值:數(shù)值函數(shù)返回0;字符串函數(shù)返回空字符串。
上一章中創(chuàng)建了一個名為“MySum”的Sub過程,其聲明代碼如下:
Sub MySum(intTotal As Integer,ParamArray intNum())
因為Sub過程不能返回值,所以使用了一個ByRet方式的變量intTotal用來返回計算的結果。調(diào)用以上過程時,需要給過程傳遞一個獲取返回值變量(如下面代碼中的i):
MySum?。?,1,2,3,4,5,6,7,8
這不是一種好方法。學習了Function函數(shù)后,可將該過程改寫為函數(shù)樣式:
![]() 調(diào)用Function函數(shù)來進行數(shù)據(jù)的累加,可使代碼更規(guī)范??墒褂靡韵路绞秸{(diào)用Function函數(shù):
i=可變參數(shù)(1,2,3,4,5,6,7,8)
這就像使用內(nèi)部函數(shù)一樣。
10.2.2 調(diào)用函數(shù)
有兩種方法調(diào)用Function函數(shù):一種是在工作表的公式中使用;另一種是VBA的另外一外過程里調(diào)用。
1. 在工作各科調(diào)用函數(shù)
自定義Function函數(shù)和系統(tǒng)內(nèi)置函數(shù)一樣,可在Excel工作表的公式中進行引用。如果不知道Function函數(shù)的名稱或它的參數(shù),可以使用“插入函數(shù)”對話框幫助用戶向工作表中輸入這些函數(shù)。例如,要在工作表中引用上一節(jié)制作的“MySum”函數(shù)的過程如下。
步驟1 返回到Excel窗口,單擊選擇一個單元格。
步驟2 在“公式”選項卡的“函數(shù)庫”中,單擊“插入函數(shù)”按鈕,將打開如圖10-2所示的“插入函數(shù)”對話框。
步驟3 在“或選擇類別”下拉列表框中選擇“用戶定義”選項,下方的函數(shù)列表將顯示自定義的函數(shù),如圖10-2所示。
步驟4 在如圖10-2所示對話框中,單擊選擇一個自定義函數(shù),單擊“確定”按鈕,打開如圖10-3所示的“函數(shù)參數(shù)”對話框,在該對話框中可輸入函數(shù)所需要的參數(shù)。
![]() 步驟5 輸入完參數(shù)后,單擊“確定”按鈕,完成公式的輸入。Excel在所選單元格里輸入“MySum”函數(shù),如圖10-4所示。
![]() . 2. 在VBA代碼中調(diào)用函數(shù)
在VBE開發(fā)環(huán)境中,不能像對待Sub過程一樣按“F5”鍵來運行Function函數(shù)。要運行函數(shù),必須從另一個過程里調(diào)用該函數(shù)。
Function函數(shù)的調(diào)用比較簡單,可以像使用VBA內(nèi)部函數(shù)一樣來調(diào)用Function函數(shù)。它與內(nèi)部函數(shù)沒有什么區(qū)別,只不過內(nèi)部函數(shù)VBA由系統(tǒng)提供,而Function函數(shù)是由用戶自己定義的。例如,下面的代碼調(diào)用上一節(jié)定義的MySum函數(shù),并將計算結果保存到t中。
![]() 還可將Function函數(shù)作為表達式的一部分,使用其返回值參加表達式的運算,例如:
?。簦剑?MySum(1,3,8,10,12)*3
在代碼中也可像調(diào)用Sub過程一樣,直接輸入函數(shù)的名稱,后面跟上參數(shù)(參數(shù)不能用括號括起來),例如以下代碼:
MySum 1,3,8,10,12
這種方式下沒有變量接收函數(shù)的返回值,得不到運行結果。雖然語法上沒錯誤,但沒什么實際意義。
10.3 Function函數(shù)實例
上面介紹了Function函數(shù)的相關知識,本節(jié)提供幾個常用Function實例,幫助讀者進一步熟悉Runction函數(shù)。
10.3.1 大寫金額轉換函數(shù)
在用Excel進行財務統(tǒng)計時,需要將金額由阿拉伯數(shù)字轉換為中文大寫形式,通常是將單元格格式自定義為“[dbnum2]&元”。但是對于帶有小數(shù)的數(shù)值卻不能得到正確的結果,如在單元格中輸入1234.5,轉換的結果卻為“壹仟貳佰叁拾肆.伍元”。通過編寫Function函數(shù)可生成正確的中文大寫金額格式。具體代碼如下:
![]() ![]() ![]() 以上Function傳遞進來的數(shù)值分割為三部分:元、角、分。將這幾個部分單獨轉換為[dbnum2]格式后,再根據(jù)出現(xiàn)的各種可能將這三部分與字符“元”、“角”、“分”進行組合。在進行組合時,應分別考慮元、角、分各自為零時的情況。
在VBA中編寫好函數(shù)后,應在Excel工作表中進行測試。下面是測試的步驟:
步驟1 切換到Excel界面中。
步驟2 選中一個單元格,在“公式”選項卡的“函數(shù)庫”組中單擊“插入函數(shù)”按鈕,彈出“插入函數(shù)”對話框,如圖10-5所示。
步驟3 選中“CapsMoney”函數(shù),單擊“確定”按鈕,彈出“函數(shù)參數(shù)”對話框,選擇單元格“A1”作為參數(shù),如圖10-6所示。
![]() 步驟4 在單元格“A1”中輸入各種數(shù)字,檢查經(jīng)過函數(shù)轉換后的結果是否正確,如圖10-7所示。
![]() 10.3.2 生成彩票號碼
彩票號碼是由多個數(shù)組成的,如果通過函數(shù)來生成一組彩票號碼,應該考慮怎樣將其返回到調(diào)用程序中。
Function函數(shù)可將數(shù)組作為一個參數(shù)返回,可使用這個特性一次返回多個數(shù)據(jù)。要使Function函數(shù)返回數(shù)組,在定義函數(shù)時需將函數(shù)的返回值設為Variant類型(或不設類型,默認為Variant類型),并在函數(shù)體中為函數(shù)名賦值一個數(shù)組。例如,以下Function函數(shù)可生成7位數(shù)的彩票號碼:
Function lottery()
![]() 在程序中,首先定義了一個數(shù)組,用來保存每一個數(shù)值;接著使用隨機函數(shù)生成7個數(shù)字,再將這個數(shù)組賦給函數(shù)名即可。
Randomize語句用來初始化隨機數(shù)生成器。Rnd()函數(shù)返回小于1但大于或等于0的一個數(shù),將其乘以10后再取整,得到一位數(shù)字的數(shù)據(jù)。
在工作表中引用返回值為數(shù)組的函數(shù)時,應選中對應的一片單元格區(qū)域,然后輸入公式,再按“Ctrl+Shift+Enter”組合鍵輸入數(shù)組公式。
提示:有關數(shù)組公式的使用,請參閱有關Excel使用的基礎類書籍。
下面演示使用上面創(chuàng)建的“lottery”函數(shù)的方法。
步驟1 切換到Excel界面。
步驟2 選中一行中的7個單元格區(qū)域(如“A1:G1”)。
步驟3 在編輯欄中輸入公式“=lottery()”,按“Ctrl+Shift+Enter”組合鍵完成公式的輸入,如圖10-8所示。
步驟4 在選中的單元格區(qū)域中分別填寫上“lottery”函數(shù)返回數(shù)組中各元素的值。此時“A1:G1”單元格區(qū)域為數(shù)組公式區(qū)域,用戶不能刪除或修改某一個單元格的內(nèi)容。選中這7個單元格再按“Delete”鍵可刪除數(shù)組公式。
步驟5 選中“A1:G1”單元格,托運右下角的填充柄,可向下填充多個數(shù)列,如圖10-9所示。
![]() 使用數(shù)組公式時,如果選中的單元格個數(shù)少于函數(shù)返回時的數(shù)組元素個數(shù),函數(shù)將只填充選中的單元格,舍棄多余數(shù)組元素的值,如圖10-10所示。如果選中的單元格個數(shù)多于函數(shù)返回時的數(shù)組元素個數(shù),多余單元格將顯示“#N/A”,如圖10-10(b)所示。
![]() |
|
|
來自: 昵稱380475 > 《第二部分 VBA程序設計基礎》