VBA如何使用主過(guò)程和子過(guò)程

2021-12-08 14:27 更新

當(dāng)你大VBA程序得越來(lái)越大,要很好地維護(hù)這么多的代碼行是很困難的。要讓你的程序容易編寫(xiě)、理解和改變,你就應(yīng)該使用井井有條的結(jié)構(gòu)化程序。如何創(chuàng)建結(jié)構(gòu)化程序?你只要簡(jiǎn)單地將大問(wèn)題分成一些可以同時(shí)執(zhí)行的小問(wèn)題就行。在VBA中,你可以通過(guò)創(chuàng)建一個(gè)主過(guò)程和一個(gè)或多個(gè)子過(guò)程來(lái)實(shí)現(xiàn)它。因?yàn)橹鬟^(guò)程和子過(guò)程都是子程序,所以你都可以用關(guān)鍵字Sub將它們聲明。主過(guò)程可以調(diào)用所需的子過(guò)程,并且將參數(shù)傳遞給它們。它也可以調(diào)用函數(shù)。下面的例子顯示過(guò)程AboutUser。該過(guò)程要求用戶(hù)姓和名,并且將姓和名從全名中分離出來(lái)。最后的語(yǔ)句顯示用戶(hù)的姓,隨后是逗號(hào)和名。你再讀下去,該過(guò)程將被分割成幾個(gè)任務(wù),以示范使用主過(guò)程,子過(guò)程和函數(shù)的概念。


Sub AboutUser()
    Dim fullName As String
    Dim firstName As String
    Dim lastName As String
    Dim space As Integer
    'get input from user 從用戶(hù)獲取信息
    fullName = InputBox("Enter first and last name:")
    'get first and last name strings 獲得姓和名字符串
    space = InStr(fullName, " ")
    firstName = Left(fullName, space – 1)
    lastName = Right(fullName, Len(fullName) – space)
    'display last name, first name 顯示姓和名
    MsgBox lastName & ", " & firstName
End Sub

過(guò)程AboutUser可以分割為一些細(xì)小的任務(wù)。第一個(gè)任務(wù)便是獲取用戶(hù)的全名;下一個(gè)任務(wù)則需要你將用戶(hù)提供的數(shù)據(jù)分割為兩個(gè)字符串:姓和名,這些任務(wù)可以交給不同的函數(shù)(例如:GetLast和GetFirst);最后的任務(wù)是顯示重新排列的姓名字符串信息。既然你已經(jīng)知道了你應(yīng)該注重于哪些任務(wù),我們現(xiàn)在就來(lái)看看如何完成每個(gè)任務(wù)。


1.  在你當(dāng)前的VBA工程里面添加一個(gè)模塊,并重命名為Sample9


2.  在Sample9模塊窗口里面輸入下列過(guò)程AboutUserMaster:


Sub AboutUserMaster()
    Dim first As String, last As String, full As String
    Call GetUserName(full)
    first = GetFirst(full)
    last = GetLast(full)
    Call DisplayLastFirst(first, last)
End Sub


上面顯示的主過(guò)程通過(guò)調(diào)用適當(dāng)?shù)淖映绦蚝秃瘮?shù)來(lái)控制程序的主流程。該主過(guò)程以變量生命開(kāi)始,第一條語(yǔ)句Call GetUserName (full)調(diào)用子過(guò)程GetUserName(見(jiàn)第三步)并且傳遞給一參數(shù)——變量full的內(nèi)容。


因?yàn)樽兞吭趫?zhí)行調(diào)用語(yǔ)句之前沒(méi)有賦與任何值,所以它的值是一個(gè)空字符串(“ ”)。注意,子過(guò)程的名稱(chēng)在Call之后。盡管你在調(diào)用過(guò)程時(shí)并沒(méi)有要求使用關(guān)鍵字Call,但是,你在調(diào)用一個(gè)需要參數(shù)的過(guò)程時(shí)就必須使用它。參數(shù)列表必須包括在括號(hào)里面。


3.  輸入下面的GetUserName子程序:


Sub GetUserName(fullName As String)
    fullName = InputBox("Enter first and last name:")
End Sub


過(guò)程GetUserName示范了兩個(gè)非常重要的VB編程概念:如何傳遞參數(shù)給一子程序以及如何將值從子程序傳遞回給主調(diào)過(guò)程。


在主過(guò)程(見(jiàn)第二步)中,你調(diào)用了過(guò)程GetUserName,并且將其作為一參數(shù)傳遞:變量full。該變量被參數(shù)fullName接收,該參數(shù)子過(guò)程GetUserName的Sub語(yǔ)句里聲明了。因?yàn)樵赩B調(diào)用子過(guò)程GetUserName的時(shí)候,變量full包含一空字符串,參數(shù)fullName同樣也接收了這個(gè)空字符串。當(dāng)VB顯示對(duì)話(huà)框并且獲得用戶(hù)的姓名時(shí),這個(gè)姓名將賦給參數(shù)fullName。賦給參數(shù)的值被傳遞回給子過(guò)程執(zhí)行后的匹配參數(shù)。因此,當(dāng)VB返回主過(guò)程時(shí),變量full就回包含用戶(hù)的姓名。




傳遞給子過(guò)程的自變量將被其參數(shù)接收。注意,參數(shù)名稱(chēng)(fullName)后面緊跟著數(shù)據(jù)類(lèi)型的聲明(AsString)。雖然,參數(shù)的數(shù)據(jù)類(lèi)型必須和相匹配的自變量的數(shù)據(jù)類(lèi)型一致,但是,不同的名稱(chēng)還是可以使用給一個(gè)自變量和它相應(yīng)的參數(shù)。



技巧:自變量(Arguments)和參數(shù)(Parameters)


①自變量是傳遞給一個(gè)子過(guò)程的變量,常量或表達(dá)式


②參數(shù)則只是接收值并傳遞給子過(guò)程的變量

4.  輸入下述函數(shù)GetFirst:

Function GetFirst(fullName As String)
    Dim space As Integer
    space = InStr(fullName, " ")
    GetFirst = Left(fullName, space - 1)
End Function


主過(guò)程中的第二條語(yǔ)句(見(jiàn)第二步)first=GetFirst(full),將變量full的值傳遞給函數(shù)GetFirst。函數(shù)的參數(shù)fullName接收到該值。要從用戶(hù)提供的數(shù)據(jù)里分出姓和名,你就必須找到姓和名中間的空格。因此,該函數(shù)的開(kāi)頭是當(dāng)?shù)刈兞縮pace的聲明,下條語(yǔ)句則使用VBA內(nèi)置函數(shù)InStr返回字符串fullName里空格(“ ”)的位置。然后將獲得的數(shù)字賦值給變量space。最后,Left函數(shù)用來(lái)提取字符串fullName從左到某特定個(gè)數(shù)(space -1)的字符。名的長(zhǎng)度比儲(chǔ)存在變量space的值少一個(gè)字符。函數(shù)的結(jié)果(用戶(hù)的名)賦值給函數(shù)名。當(dāng)VB返回主過(guò)程時(shí),它就將結(jié)果放置于變量first。


5.  輸入下列函數(shù)GetLast:


Function GetLast(fullName As String)
    Dim space As Integer
    space = InStr(fullName, " ")
    GetLast = Right(fullName, Len(fullName) - space)
End Function


主過(guò)程里面的第三條語(yǔ)句(見(jiàn)第二步)last=GetLast(full),將變量full的值傳遞給函數(shù)GetLast。該函數(shù)的目的是提取用戶(hù)提供的數(shù)據(jù)中的用戶(hù)的姓。函數(shù)GetLast使用內(nèi)置函數(shù)Len來(lái)計(jì)算字符串fullName的總字符數(shù)。函數(shù)Right提取字符串fullName從右邊某個(gè)特定字符開(kāi)始(Len(fullName)–space)的字符。然后,獲得的字符串賦值給函數(shù)名稱(chēng),一旦返回主過(guò)程,它就儲(chǔ)存于變量last。




6.  輸入下述子過(guò)程DisplayLastFirst:


Sub DisplayLastFirst(firstName As String, lastName As String)
    MsgBox lastName & ", " & firstName
End Sub


主過(guò)程里面的第四條語(yǔ)句(見(jiàn)第二步)Call     DisplayLastFirst(first, last),調(diào)用子過(guò)程
DisplayLastFirst并且將兩個(gè)自變量:first和last。為了接收這些自變量,子過(guò)程
DisplayLastFirst和兩個(gè)相匹配的參數(shù)(firstName和lastName)一起被聲明了?;叵胛覀兦懊嬲f(shuō)過(guò),不同的名稱(chēng)可以用在自變量和相應(yīng)的參數(shù)上。然后子過(guò)程DisplayLastFirst顯示用戶(hù)的姓,逗號(hào),和名。

技巧:使用子過(guò)程的好處
①維護(hù)多個(gè)子過(guò)程要比維護(hù)一個(gè)大過(guò)程要容易得多
②由一個(gè)子過(guò)程執(zhí)行的任務(wù)可以給好幾個(gè)過(guò)程使用
③每個(gè)子過(guò)程再放入主過(guò)程里之前就被單獨(dú)測(cè)試
?④多個(gè)程序員可以負(fù)責(zé)各自的子過(guò)程,這些子過(guò)程再構(gòu)建一個(gè)大的程序


在本章里,你學(xué)習(xí)了子過(guò)程和函數(shù)之間的區(qū)別:子過(guò)程執(zhí)行操作;函數(shù)返回?cái)?shù)值。而且你可以通過(guò)錄制或者輸入來(lái)創(chuàng)建子過(guò)程,函數(shù)則不可以錄制,因?yàn)樗鼈兛赡苄枰獏?shù),你必須手動(dòng)輸入。你看到了從工作表或者其他VB過(guò)程調(diào)用的函數(shù)實(shí)例。

你學(xué)習(xí)了如何給函數(shù)傳遞自變量,決定函數(shù)結(jié)果的數(shù)據(jù)類(lèi)型。你在你的VBA關(guān)鍵字的系統(tǒng)里增加了ByVal,ByRef和Optional等關(guān)鍵字。你也看到如何將問(wèn)題分割為更小更簡(jiǎn)單的任務(wù),以使你的程序更容易理解。最后,你學(xué)習(xí)了子過(guò)程如何在參數(shù)的幫助下,將數(shù)值傳遞回到主調(diào)過(guò)程。

過(guò)了本章后,你應(yīng)該能夠創(chuàng)建適合你特定需要的你自己的自定義函數(shù)了。你應(yīng)該可以通過(guò)使用MsgBox和InputBox函數(shù)輕松地和用戶(hù)互動(dòng)。


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)