前面講過,vba**有兩種組織形式,一種就是過程(前面的示例中都在使用),另一種就是函式。其實過程和函式有很多相同之處,除了使用的關鍵字不同之外,還有不同的是:
雖然可以把所有**都放在乙個過程,或者乙個函式裡面,但是這樣會使**難以維護,特別是非常不便於其他人檢視修改。而有時一些重複性的**,也應該把它們獨立出去,作為乙個子過程或子函式來組織。使用子過程和子函式的目的,就是為了便於組織**、便於維護。
過程以sub開頭,end sub結束,過程中需要執行的**放在中間。格式如下:
sub 過程名()
' 需要在過程中執行的**
end sub
過程名後面的括號是必須的,過程可以帶引數,就放置在括號裡面,稍後會有說明。
過程示例:
sub test()
debug.print "hello"
end sub
與過程類似,函式的格式如下:
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,或者點選工具欄中的執行按鈕,都不會執行這個函式,而是會彈出乙個執行巨集的選擇對話方塊,而在這個對話方塊中,是沒有任何函式可供選擇的,只有過程:
前面說過,過程和函式,都可以是被相互呼叫的。
格式1:
call 過程名
格式2:
call 過程名(引數1, 引數2, ...)
如果過程不帶引數,那麼可以使用第1種格式,過程名後面不需要括號
如果過程帶有引數,則要按照引數的順序依次把引數寫到過程名後面的括號中。即使用第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
這裡應該提出的是,函式應當要有返回值的,因為如果不需要返回值,那就應該直接使用過程而不是函式了。
引數和使用對於過程和函式都是一樣的。所以本節的內容對過程和函式都適用。
引數可分為可選引數和必選引數兩種。必選引數在呼叫(過程或函式時)必須加上,否則會報錯。可選引數則可寫可不寫。預設是必選引數,可選引數在定義時用optional
關鍵字宣告,並且可選引數必須放在引數列表的最後面。
必選引數在定義時放置在過程或函式名後面的括號中,格式為:
引數名 as 引數型別
如:
sub sub_test(s as string)
debug.print s
end sub
在呼叫時,必須傳入引數:
sub test()
call sub_test("hello")
end sub
格式與必選引數類似,只是在引數名前面用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
此時可選引數必須放在最後
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
輸出:
hello, world
同時傳入可選引數與必選引數:
sub test()
call sub_test(50, "hi, meinv")
end sub
輸出:
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 入門(十)使用者窗體開發
mysql過程函式 mysql 儲存過程和函式
乙個儲存程式是可以被儲存在伺服器中的一套sql語句。可以通過客戶端用create procedure和create function 建立乙個儲存過程或函式。在客戶端通過call語句 呼叫所建立的存數過程或函式。語法 建立儲存子程式 create procedure sp name proc par...
7 0入門(六) 建立儲存過程體
建立儲存過程體 儲存過程邏輯駐留在儲存過程體中。乙個儲存過程體中可以包含任意條transactsql語句。下面的transactsql語句不能在任何儲存過程體中出現 createdefault createtrigger createprocedure createview createrule 1...
Shell入門知識10 系統函式和自定義函式
返回完整路徑最後的 後面的部分,常用於獲取檔名。語法 basename 完整路徑名 字尾 basename string 字尾 如果沒有字尾,則返回檔名.字尾。例子 返回 home aaa test.txt的 test.txt 部分 bash basename home aaa test.txt 返...