VBA如何使用主過程和子過程

2021-12-08 14:27 更新

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


Sub AboutUser()
    Dim fullName As String
    Dim firstName As String
    Dim lastName As String
    Dim space As Integer
    'get input from user 從用戶獲取信息
    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

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


1.  在你當前的VBA工程里面添加一個模塊,并重命名為Sample9


2.  在Sample9模塊窗口里面輸入下列過程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


上面顯示的主過程通過調用適當?shù)淖映绦蚝秃瘮?shù)來控制程序的主流程。該主過程以變量生命開始,第一條語句Call GetUserName (full)調用子過程GetUserName(見第三步)并且傳遞給一參數(shù)——變量full的內容。


因為變量在執(zhí)行調用語句之前沒有賦與任何值,所以它的值是一個空字符串(“ ”)。注意,子過程的名稱在Call之后。盡管你在調用過程時并沒有要求使用關鍵字Call,但是,你在調用一個需要參數(shù)的過程時就必須使用它。參數(shù)列表必須包括在括號里面。


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


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


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


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




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



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


①自變量是傳遞給一個子過程的變量,常量或表達式


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

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

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


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


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


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


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




6.  輸入下述子過程DisplayLastFirst:


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


主過程里面的第四條語句(見第二步)Call     DisplayLastFirst(first, last),調用子過程
DisplayLastFirst并且將兩個自變量:first和last。為了接收這些自變量,子過程
DisplayLastFirst和兩個相匹配的參數(shù)(firstName和lastName)一起被聲明了。回想我們前面說過,不同的名稱可以用在自變量和相應的參數(shù)上。然后子過程DisplayLastFirst顯示用戶的姓,逗號,和名。

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


在本章里,你學習了子過程和函數(shù)之間的區(qū)別:子過程執(zhí)行操作;函數(shù)返回數(shù)值。而且你可以通過錄制或者輸入來創(chuàng)建子過程,函數(shù)則不可以錄制,因為它們可能需要參數(shù),你必須手動輸入。你看到了從工作表或者其他VB過程調用的函數(shù)實例。

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

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


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號