VBA函數(shù)過(guò)程

2018-11-16 14:27 更新

在前面的章節(jié)中,你知道了過(guò)程是一組指令,它讓你在程序運(yùn)行的時(shí)候完成一些具體的任務(wù)。VBA有以下三種過(guò)程:

1、子程序過(guò)程(子程序)執(zhí)行一些有用的任務(wù)但是不返回任何值。它們以關(guān)鍵字Sub開(kāi)頭和關(guān)鍵字End Sub結(jié)束。子程序可以用宏錄制器錄制或者在VB編輯器窗口里直接編寫。你已經(jīng)學(xué)習(xí)了多種運(yùn)行這種過(guò)程的方法。
?
2、函數(shù)過(guò)程(函數(shù))執(zhí)行具體任務(wù)并返回值。它們以關(guān)鍵字Function開(kāi)頭和關(guān)鍵字EndFunction結(jié)束。在本章中,你將創(chuàng)建你的第一個(gè)函數(shù)過(guò)程。函數(shù)過(guò)程可以從子程序里執(zhí)行,也可以從工作表里訪問(wèn),就像Excel的內(nèi)置函數(shù)一樣。

3、屬性過(guò)程用于自定義對(duì)象。使用屬性過(guò)程你可以設(shè)置和獲取對(duì)象屬性的值,或者設(shè)置對(duì)另外一個(gè)對(duì)象的引用。你將在第十一章中學(xué)習(xí)如何創(chuàng)建自定義對(duì)象和使用屬性過(guò)程。


在本章中,你將學(xué)習(xí)如何創(chuàng)建和執(zhí)行自定義函數(shù),另外,你將發(fā)現(xiàn)變量如何用于傳遞數(shù)據(jù)給子程序和函數(shù)。在本章后面,你將對(duì)VBA中兩種最有用的函數(shù):MsgBox和InputBox進(jìn)行比較徹底的了解。


關(guān)于函數(shù)過(guò)程

使用Excel幾百種內(nèi)置函數(shù),你可以進(jìn)行非常寬廣的自動(dòng)計(jì)算,然而,你總有要做個(gè)自定義計(jì)算的時(shí)候。使用VBA編程,你可以通過(guò)創(chuàng)建函數(shù)過(guò)程快速的完成這個(gè)特殊需求,你可以創(chuàng)建任何Excel沒(méi)有提供的函數(shù)。


創(chuàng)建函數(shù)過(guò)程

象Excel函數(shù)一樣,函數(shù)過(guò)程進(jìn)行計(jì)算并返回?cái)?shù)值。學(xué)習(xí)函數(shù)的最好方法就是自己創(chuàng)建一個(gè)。因此,我們開(kāi)始吧。設(shè)置完一個(gè)新的VBA工程后,你將創(chuàng)建一個(gè)函數(shù)過(guò)程來(lái)加和兩個(gè)數(shù)值。


1.  打開(kāi)一個(gè)新Excel工作簿,并保存為Chap04.xls
2.  切換到VB編輯器窗口并且選擇VBAProject(Chap04.xls)
3.  在屬性窗口,將VBAProject改為MyFunctions
4.  在工程瀏覽器窗口選擇MyFunctions(Chap04.xls),然后選擇“插入”-“模塊”
5.  在屬性窗口將“模塊1”改為Sample1

6.在工程瀏覽器窗口,點(diǎn)擊Sample1并選擇“插入”-“過(guò)程”(譯者:需要激活右邊的代碼窗口)。添加過(guò)程對(duì)話框如圖4-1所示


過(guò)程類型

圖4-1 你使用添加過(guò)程對(duì)話框時(shí),VB自動(dòng)創(chuàng)建你選擇的過(guò)程類型

7.在對(duì)話框里輸入下列設(shè)置:

名稱:SumItUp
類型:函數(shù)
范圍:公共的


8.  點(diǎn)擊確定退出添加過(guò)程對(duì)話框。VB輸入了一個(gè)空函數(shù)過(guò)程如下:

Public Function SumItUp()
End Function


第一句聲明函數(shù)過(guò)程名稱,關(guān)鍵字Public表面這個(gè)函數(shù)可以在所有模塊的所有過(guò)程里訪問(wèn)。關(guān)鍵字Public是可選的。注意,關(guān)鍵字Function后面是函數(shù)名稱(SumItUp)和一對(duì)空括號(hào)。在括號(hào)里你可以列上計(jì)算中需要的數(shù)據(jù)項(xiàng)目。每個(gè)函數(shù)過(guò)程都以End Function語(yǔ)句結(jié)束。


技巧:關(guān)于函數(shù)名稱
函數(shù)名稱應(yīng)該點(diǎn)明該函數(shù)的作用,并且必須和變量的命名規(guī)則一致。

技巧:設(shè)置VBA過(guò)程范圍
在前幾章你學(xué)習(xí)了變量的范圍決定它可以在哪些模塊和過(guò)程里使用,和變量一樣,VBA過(guò)程也有范圍。過(guò)程的范圍決定其它模塊里的過(guò)程是否可以調(diào)用該過(guò)程。所以的VBA過(guò)程默認(rèn)為公共的,這意味著它可以被任何模塊里的其它過(guò)程調(diào)用。因?yàn)檫^(guò)程默認(rèn)為公共的,所以如果你愿意你可以忽略關(guān)鍵字Public。但是,如果你將Public關(guān)鍵字換成關(guān)鍵字Private,那么你的過(guò)程只能被同一模塊里的其它過(guò)程調(diào)用,而不能被其它模塊里的過(guò)程調(diào)用。

將函數(shù)聲明修改為這樣:


Public Function SumItUp(m,n)
End Function


這個(gè)函數(shù)的目的是加和兩個(gè)數(shù)值。不要將實(shí)際值輸給函數(shù)。給該函數(shù)提供兩個(gè)自變量以確保該函數(shù)具有靈活性。這樣,你的自定義函數(shù)就能夠?qū)⒛闾峁┑娜魏蝺蓚€(gè)數(shù)值加和起來(lái)了。每個(gè)變量代表一個(gè)數(shù)值,你在運(yùn)行該函數(shù)時(shí)要給每個(gè)變量提供數(shù)值。


技巧:使用函數(shù)的理由
自定義VBA函數(shù)可以用于:
?  

1、分析數(shù)據(jù)和進(jìn)行計(jì)算

2、修正數(shù)據(jù)和匯報(bào)信息

3、基于提供的或計(jì)算的數(shù)據(jù)采取具體行動(dòng)


10. 在Public Function和End Function之間輸入下述語(yǔ)句:


SumItUp = m + n


這條語(yǔ)句意思是將儲(chǔ)存于變量n上的數(shù)據(jù)加在儲(chǔ)存于變量m的數(shù)值上,并且將結(jié)果返回給函數(shù)SumItUp。在等號(hào)后面輸入該函數(shù)名稱,再就是括號(hào)和需要加和的數(shù)值。在上面的語(yǔ)句中,設(shè)置函數(shù)名稱等于m + n的和。完成的自定義函數(shù)過(guò)程如下:


Public Function SumItUp(m,n)
            SumItUp = m + n
End Function


祝賀,你已經(jīng)創(chuàng)建了你的第一個(gè)函數(shù)!然而,函數(shù)過(guò)程并沒(méi)有什么用,除非你知道如何執(zhí)行它。下一個(gè)段落將給你示范如何使你的函數(shù)工作。

執(zhí)行函數(shù)過(guò)程

在第一章里,你學(xué)習(xí)了很多中方法來(lái)運(yùn)行子程序。和子程序不同,函數(shù)過(guò)程只能使用兩種方法來(lái)執(zhí)行。你可以用于工作表的公式里面,或者從另外一個(gè)過(guò)程里調(diào)用它。你在VBA里創(chuàng)建的函數(shù)過(guò)程,不能通過(guò)在Excel窗口選擇“工具”-“宏”-“運(yùn)行宏”訪問(wèn);它們也不能在代碼里面通過(guò)按F5鍵來(lái)運(yùn)行。接下來(lái)的部分里,你將學(xué)習(xí)到執(zhí)行函數(shù)的專門技術(shù)。


從工作表里運(yùn)行函數(shù)過(guò)程

自定義函數(shù)過(guò)程和內(nèi)置函數(shù)一樣,如果你不知道確切的函數(shù)名稱或者它的自變量,那么你可以使用“插入函數(shù)”對(duì)話框來(lái)幫助你在工作表里輸入需要的函數(shù)。


1.  切換到Excel窗口,并選擇任何一個(gè)單元格


2.
點(diǎn)擊函數(shù)工具欄上的“插入函數(shù)(fx)”按鈕(譯者:或者選擇“插入”-“函數(shù)”),Excel彈出插入函數(shù)對(duì)話框,上面顯示了所選類別里所以函數(shù),按字母順序排列


3.  在類別下拉框里選擇“全部”或者“用戶定義”,然后滾動(dòng)函數(shù)名稱框,找到并選擇本章中創(chuàng)建的函數(shù)SumItUp。當(dāng)你選中這個(gè)函數(shù)名稱時(shí),在插入函數(shù)對(duì)話框的下部顯示了該函數(shù)的語(yǔ)法:


SumItUp(m,n)


技巧:私有函數(shù)用戶是看不到的
使用關(guān)鍵字Private聲明的函數(shù)不會(huì)出現(xiàn)在“插入函數(shù)”對(duì)話框上,私有函數(shù)不能用于公式里,它們只能從另一個(gè)VBA過(guò)程里調(diào)用。


技巧:快速訪問(wèn)自定義函數(shù)
一旦你創(chuàng)建了一個(gè)公共的VBA函數(shù),Excel就會(huì)將它加入到“插入函數(shù)”對(duì)話框的“用戶定義”的類別里。通過(guò)選擇這個(gè)類別,你可以快速地訪問(wèn)該自定義函數(shù)。


插入函數(shù)
圖4-2 VBA自定義函數(shù)出現(xiàn)在Excel內(nèi)置函數(shù)同一清單上


4.點(diǎn)擊確定,開(kāi)始寫公式。“函數(shù)參數(shù)”對(duì)話框出現(xiàn),如下圖所示。對(duì)話框顯示了函數(shù)名稱和每個(gè)參數(shù):m和n

函數(shù)參數(shù)
圖4-3 公式的調(diào)色板功能有助于輸入任何工作表函數(shù),不論是內(nèi)置或VBA編程的自定義函數(shù)

5.  如圖4-3所示輸入自變量數(shù)值,或者你任意輸入數(shù)值。當(dāng)你輸入數(shù)值在參數(shù)文本框時(shí),Excel顯示你輸入的數(shù)和當(dāng)前的函數(shù)結(jié)果。因?yàn)閮蓚€(gè)參數(shù)(m和n)都是必須的,所以,如果你忽略了其中的某個(gè)時(shí),函數(shù)會(huì)返回錯(cuò)誤。

6.  點(diǎn)擊確定退出函數(shù)參數(shù)對(duì)話框,Excel輸入函數(shù)SumItUp在所選的單元格里,并且顯示它的結(jié)果。要編輯這個(gè)公式的話,選擇該顯示公式結(jié)果的單元格,并且點(diǎn)擊“插入函數(shù)”按鈕,選擇函數(shù)并點(diǎn)擊確定以訪問(wèn)函數(shù)參數(shù)對(duì)話框。在函數(shù)參數(shù)m和n上輸入不同的數(shù)值,并點(diǎn)擊確定。也可以直接在該單元格上雙擊,修改函數(shù)參數(shù)值。

技巧:確保你的自定義函數(shù)可用
只有在你儲(chǔ)存該自定義函數(shù)的工作簿開(kāi)啟的時(shí)候,你的自定義VBA函數(shù)才可用,如果你關(guān)閉該工作簿,該函數(shù)便不再可用。要確保你的自定義函數(shù)每次在你使用Excel時(shí)都能用到,你可以做下述事情之一:

1、保存你的函數(shù)在個(gè)人宏工作簿
?
2、將含有你的自定義函數(shù)的工作簿保存在XLStart文件夾里

3、創(chuàng)建引用到含有該自定義函數(shù)的工作簿(請(qǐng)參見(jiàn)第二章,如何創(chuàng)建對(duì)另一個(gè)工程的引用)

從另外一個(gè)VBA過(guò)程里運(yùn)行函數(shù)過(guò)程

正如前面提到的,你不能在VB窗口將光標(biāo)放在代碼里并且按F5來(lái)運(yùn)行函數(shù),也不能通過(guò)選擇“運(yùn)行”-“運(yùn)行宏”來(lái)運(yùn)行函數(shù)過(guò)程。要運(yùn)行函數(shù),你必須從另外一個(gè)過(guò)程里調(diào)用該函數(shù)。要執(zhí)行自定義函數(shù),編寫一個(gè)VBA子程序并且在需要的時(shí)候調(diào)用該函數(shù)。下面的過(guò)程調(diào)用函數(shù)SumItUp并且將計(jì)算結(jié)果輸出在立即窗口:

Sub RunSumItUp()
             Dim m As Single, n As Single
             m = 370000
             n = 3459.77
             Debug.Print SumItUp(m,n)
             MsgBox "Open the Immediate window to see the result."
End Sub
?  
1、上面的子程序使用Dim語(yǔ)句聲明變量m和n,它們用來(lái)給函數(shù)提供數(shù)據(jù)

2、接下來(lái)兩行語(yǔ)句給變量賦值
?  
3、再下來(lái),VB調(diào)用函數(shù)SumItUp并且將儲(chǔ)存于變量m和n的數(shù)值傳遞給它。當(dāng)函數(shù)過(guò)程里SumItUp=m + n語(yǔ)句執(zhí)行完后,VB返回到子過(guò)程RunSumItUp里面,并且使用Debug.Print語(yǔ)句將函數(shù)的結(jié)果輸出在立即窗口
?  
4、MsgBox函數(shù)通知用戶在哪里查看結(jié)果

依照下述步驟來(lái)試驗(yàn)上面的例子:

1.  在輸入函數(shù)SumItUp的同一個(gè)模塊里面輸入過(guò)程RunSumItUp

2.  將光標(biāo)放在該過(guò)程的任意地方,按下F5

技巧: 函數(shù)的快速測(cè)試
你編寫自定義函數(shù)后,你可以在立即窗口快速的測(cè)試它。打開(kāi)立即窗口,輸入一個(gè)問(wèn)號(hào)(?)在函數(shù)名稱前,可以顯示該函數(shù)的計(jì)算結(jié)果。記住,要在括號(hào)里輸入函數(shù)的參數(shù)值。 例如,輸入:

? SumItUp(54, 367.24)

然后回車。你的函數(shù)使用參數(shù)m和n傳遞的數(shù)值進(jìn)行計(jì)算,函數(shù)的結(jié)果顯示在下一行:

421.24
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)