前面講過,VBA代碼有兩種組織形式,一種就是過程(前面的示例中都在使用),另一種就是函數。其實過程和函數有很多相同之處,除了使用的關鍵字不同之外,還有不同的是:
- 函數有返回值,過程沒有
- 函數可以在Excel表格中像一般的Excel函數那樣使用,但過程不可以
- 過程可以指定給Excel表格中的按鈕或者圖片等對象,但是函數不可以
- 函數只能在被調用時執行,比如在過程中調用,或者在另一個函數中調用,或者在Excel表格中調用。但不能直接執行,而過程是可以的
雖然可以把所有代碼都放在一個過程,或者一個函數里面,但是這樣會使代碼難以維護,特別是非常不便於其他人查看修改。而有時一些重復性的代碼,也應該把它們獨立出去,作為一個子過程或子函數來組織。使用子過程和子函數的目的,就是為了便於組織代碼、便於維護。
1. 過程 Sub
過程以Sub開頭,End Sub結束,過程中需要執行的代碼放在中間。格式如下:
Sub 過程名()
' 需要在過程中執行的代碼
End Sub
過程名后面的括號是必須的,過程可以帶參數,就放置在括號里面,稍后會有說明。
過程示例:
Sub test()
Debug.Print "Hello"
End Sub
2. 函數 Function
與過程類似,函數的格式如下:
Function 函數名(參數1, 參數2, ...) As 數據類型
' 需要在函數中執行的代碼
函數名 = 函數執行后的結果
End Function
函數名后面的括號是必須的,函數通常都帶有參數,放置在括號里面。函數也可以不帶參數。
括號后面的 As 數據類型
雖然並不是必須的,但是我強烈建議加上。因為函數通常都需要有返回值,這個數據類型就表示着返回值的數據類型。
函數體最后通常都帶有一條返回值語句,把函數執行的結果賦值給函數名,就可以在調用這個函數的地方得到這個函數的執行結果。這個返回結果的數據類型應該與函數名后面As的數據類型一致,否則可能會出錯。
函數示例:
Function my_sum(n1 as Integer, n2 as Integer) As Integer
Dim s As Integer
s = n1 + n2
my_sum = s
End Function
上例中定義了一個名為my_sum
的函數,它接受兩個類型為Integer的參數,並且返回值是Integer類型。在函數內部計算了這兩個參數相加的和,並把這個和作為返回值賦給my_sum
。可以通過調用這個函數,並傳遞相應的參數,獲得它的返回值。
定義函數后,就可以在VBA中的過程,或者其它函數,或者在Excel表格中使用這個函數了。
在Excel表格中使用:
在VBA過程中使用:
再次強調,函數是不能直接執行的。上例中,如果試圖把鼠標光標放在my_sum函數中,再按F8,或者點擊工具欄中的執行按鈕,都不會執行這個函數,而是會彈出一個運行宏的選擇對話框,而在這個對話框中,是沒有任何函數可供選擇的,只有過程:
3. 過程和函數的調用
前面說過,過程和函數,都可以是被相互調用的。
3.1 過程的調用
格式1:
Call 過程名
格式2:
Call 過程名(參數1, 參數2, ...)
如果過程不帶參數,那么可以使用第1種格式,過程名后面不需要括號
如果過程帶有參數,則要按照參數的順序依次把參數寫到過程名后面的括號中。即使用第2種格式。
3.2 函數的調用
函數的調用在本章第2節中有示例。函數的調用通常會在調用時把其賦值給一個變量,以獲取函數返回值。
Sub test()
Dim s As Integer
s = my_sum(5, 5)
Debug.Print s
End Sub
Function my_sum(n1 As Integer, n2 As Integer) As Integer
Dim s As Integer
s = n1 + n2
my_sum = s
End Function
這里應該提出的是,函數應當要有返回值的,因為如果不需要返回值,那就應該直接使用過程而不是函數了。
4. 參數的使用
參數和使用對於過程和函數都是一樣的。所以本節的內容對過程和函數都適用。
參數可分為可選參數和必選參數兩種。必選參數在調用(過程或函數時)必須加上,否則會報錯。可選參數則可寫可不寫。默認是必選參數,可選參數在定義時用Optional
關鍵字聲明,並且可選參數必須放在參數列表的最后面。
4.1 必選參數
必選參數在定義時放置在過程或函數名后面的括號中,格式為:
參數名 As 參數類型
如:
Sub sub_test(s As String)
Debug.Print s
End Sub
在調用時,必須傳入參數:
Sub test()
Call sub_test("hello")
End Sub
4.2 可選參數
格式與必選參數類似,只是在參數名前面用Optional聲明參數是可選的。
Optional 參數名 As 參數類型
如:
Sub sub_test(Optional s As String)
Debug.Print s
End Sub
在調用上述過程時,可以不傳入參數,此時則不會輸出任何東西,也不會報錯,因為參數是可選的。如果傳入了參數,則會輸出這個參數。
可選參數還可以設置默認值,即如果在調用時不顯式傳入這個參數的話,那么就使用定義時所使用的值。如下過程:
Sub sub_test(Optional s As String = "Hello, World")
Debug.Print s
End Sub
帶參數調用:
Sub test()
Call sub_test("I am a boy")
End Sub
輸出:I am a boy
不帶參數調用:
Sub test()
Call sub_test
End Sub
輸出:Hello, World
4.3 同時使用可選參數與必選參數
此時可選參數必須放在最后
Sub sub_test(var As Integer, Optional s As String = "Hello, World")
Debug.Print var
Debug.Print s
End Sub
只傳入必選參數:
Sub test()
Call sub_test(50)
End Sub
輸出:
50
Hello, World
同時傳入可選參數與必選參數:
Sub test()
Call sub_test(50, "Hi, Meinv")
End Sub
輸出:
50
Hi, Meinv
本系列教程其它文章
Excel VBA 入門(零)
Excel VBA 入門(一)數據類型
Excel VBA 入門(二)數組和字典
Excel VBA 入門(三) 流程控制1-條件選擇
Excel VBA 入門(四)流程控制2-循環控制
Excel VBA 入門(五)Excel對象操作
Excel VBA 入門(六)過程和函數
Excel VBA 入門(七)注釋、宏按鈕及錯誤處理
Excel VBA 入門(八)單元格邊框
Excel VBA 入門(九)操作工作薄
Excel VBA 入門(十)用戶窗體開發