每個 Module 內通常會有多個 Procedure (如同 C 語言的 Header - Function),在此只簡介 Procedure 一些特性。

1. 所有 Procedure 都是由 Sub (程式碼) End Sub 與 Function(程式碼) End Function 所成的。

2. 即使如此, Sub 與 Function 仍有不同之處

考慮以下錯誤程式碼

EdisonX-031.png

一開始都是用 Sub 去寫 Procedure,SumN 是在計算完 a 和 b 的加總後傳回,但有「傳回」這個動作就能用 Sub 去定義,而是要用 Function 去定義。於是 SumN 可改寫成以下型式。

EdisonX-032.png

而 CalSum 此函數並沒有傳回值的動作,所以用 Sub 定義即可,要用 Function 也可以,這樣程式碼便可正常執行。

3. 為引數進行宣告

上述之程式碼並非好的示範, 因上述的 SumN 也可以這麼用

EdisonX-033.png

是的,它也可以接受 string 型別,但這可能不是我想要的,於是加以宣告成這樣

EdisonX-034.png

接下來的 SumN 便只能接受整數型別。

4. 改變引數值

考慮下面的 Add2,它的功能是把傳進去的引數值加2

EdisonX-035.png

但實際上的執行結果並不會加2,還是會顯示 0 ,原因有二個,先解決第一個原因,在 Add2 宣告引數的時候多加一個 ByRef

EdisonX-036.png

這樣結果還是不對,接著做第二次的修改,在呼叫 Add2 時,原本是 Add2(num) 改為 Call Add2(num)

EdisonX-037.png

大功告成。 

5. Scope 範圍

VBA procedure scope 分 private 及 public,直接把這二個識別字打在 Procedure 前面即可,如

Public Function Msg()
       ' do something
End Function

Private Sub Msg2()
      ' do something
End Sub

其不同點在於,使用 Public 時其它的 Module 也可使用此 Procedure;使用 Private 時只有此 Module 可使用此 Procedure。

edisonx 發表在 痞客邦 PIXNET 留言(0) 人氣()