跳轉到內容

Visual Basic/過程和函式

來自華夏公益教科書

函式是執行特定任務並返回結果的命名程式程式碼塊。該任務可以像新增兩個數字一樣簡單,也可以像發射宇宙飛船一樣複雜。子程式就像函式,只是它不返回值。

定義過程

[編輯 | 編輯原始碼]

一個函式定義示例

  Public Function Sum(ByRef Number1 As Double, ByRef Number2 As Double) As Double
    'Return the result by writing it to a variable having the same name as the function
    Sum = Number1 + Number2
  End Function

一個子程式定義示例

  Public Sub Tell(ByVal MyString1 as String, ByVal MyString2 as String)
    MsgBox MyString1 & MyString2
  End Sub

注意以下幾點

  • 函式的引數被宣告為 ByRef,這要求編譯器確保只使用指定型別的引數,在本例中為 Double。
  • 函式透過將返回值賦給函式名來返回值,就好像函式是一個變數一樣。這與許多其他語言中使用 return 關鍵字形成對比。

呼叫過程

[編輯 | 編輯原始碼]

您可以使用或呼叫前面幾節中定義的兩個過程,如下所示

  'On the next line, argument order matters
  Tell "Hello there.", ""
  'On the next line, names of arguments are used and argument order does not matter.  
  Tell MyString1:="Hello there,", MyString2:=" again."
  'Tell ("Hello there.","") -- syntax error

  MySum = Sum(123.456, 234)
  MySum2 = Sum(Number2:=8, Number1:=6)
  'MySum3 = Sum Number2:=8, Number1:=6 -- syntax error

注意以下幾點

  • 傳遞給 函式 的引數(引數列表)必須用圓括號括起來,而傳遞給子程式的引數則不需要。

過程部分

[編輯 | 編輯原始碼]

每個函式和子程式都有以下部分,其中一些是可選的

可見性
PublicFriendPrivate
過程型別
SubFunctionProperty LetProperty GetProperty Set
名稱
一個自由選擇的名稱,以字母開頭,只包含字母、數字和下劃線。
引數列表
過程讀入或寫入的資料項列表。
返回值型別
對於 FunctionProperty Get,返回的資料型別,例如 DoubleString
主體
執行所有工作的語句。

只有 NameProcedure Type 是必須的。當然,沒有主體的過程什麼也不做。

可見性

[編輯 | 編輯原始碼]

這對大多數人來說似乎是過程宣告中一個非常不重要的部分,但實際上它是一個非常有用的功能。有了它,你可以顯示一些過程只供模組內部使用 (Private),一些只供本元件使用 (Friend) 或供全世界使用 (Public)。你應該將過程標記為 Private,除非它們將從模組外部呼叫。這將鼓勵你,以及任何編輯你的程式的人,將相關的過程放在同一個模組中,這顯然使維護更容易。

將過程標記為 Private 也意味著你可以在另一個模組中擁有另一個具有完全相同名稱的過程。

提前終止

[編輯 | 編輯原始碼]

使用 Exit FunctionExit Sub 在中間終止過程,如下所示

  Sub LengthyComputation(fat, n)
    If n = 0 Or n = 1 Then
      fat = 1
      ' Now terminate
      Exit Sub
    End If
    ' Now compute fat ...
  End Sub

過程型別

[編輯 | 編輯原始碼]

所有過程要麼是返回結果作為函式值的函式,要麼是因其副作用而被呼叫的子程式。要返回值,你可以使用兩者,但對於子程式,你需要透過引數來完成。

  Private Function FunctionHalf(ByRef y as Double) as Double
    FunctionHalf = y / 2
  End Function

  Private Sub SubroutineHalf(ByRef y As Double, ByRef Result As Double)
    Result = y / 2
  End Sub

這兩個過程本質上執行相同的操作,即把一個數字除以二。Function 版本透過將新值 賦值 給函式名來實現,而 Sub 版本則將其賦值給其中一個 引數 的名稱。這會影響你使用它們的方式。

函式版本可以在表示式中使用,如下所示

Debug.Print FunctionHalf(10) 'Prints 5

要使用子程式返回值,你需要將該值儲存在一個變數中,如下所示

  Dim nHalf as Double
  SubroutineHalf 10, nHalf
  Debug.Print nHalf

一般來說,當結果是單個事物(數字、字串、物件)時,你使用 Function,當你需要返回多個不同事物或根本不需要返回任何事物時,你使用 Sub

屬性 也是一種過程形式。Property Get 是一個函式;Property LetProperty Set 是子程式。有關 Properties 的更多討論,請參閱 面向物件程式設計 章節。

可選引數

[編輯 | 編輯原始碼]

您可以指定可選引數和預設值

Function MySum(i1, i2, Optional i3)
  If IsMissing(i3) Then
    MySum = i1 + i2
  Else
    MySum = i1 + i2 + i3
  End If
End Function

Function MyConcatenate(String1, String2, Optional Separator = " ")
  'Default value for Separator specified
  MyConcatenate = String1 & Separator & String2
End Function

Sub Test()
  Debug.Print MySum(1, 2) * MySum(1, 2, 3)
  Debug.Print MyConcatenate("Hello", "World")
  Debug.Print MyConcatenate("Hello", "World", ", ")
End Sub

一旦一個引數被宣告為可選的,它右側的所有引數都必須被宣告為可選的。

連結

前一頁: 資料型別 目錄 下一頁: Windows_對話方塊
華夏公益教科書