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
注意以下几点
- 传递给 函数 的参数(参数列表)必须用圆括号括起来,而传递给子程序的参数则不需要。
每个函数和子程序都有以下部分,其中一些是可选的
- 可见性
- Public、Friend 或 Private
- 过程类型
- Sub、Function、Property Let、Property Get、Property Set
- 名称
- 一个自由选择的名称,以字母开头,只包含字母、数字和下划线。
- 参数列表
- 过程读入或写入的数据项列表。
- 返回值类型
- 对于 Function 或 Property Get,返回的数据类型,例如 Double 或 String。
- 主体
- 执行所有工作的语句。
只有 Name 和 Procedure Type 是必须的。当然,没有主体的过程什么也不做。
这对大多数人来说似乎是过程声明中一个非常不重要的部分,但实际上它是一个非常有用的功能。有了它,你可以显示一些过程只供模块内部使用 (Private),一些只供本组件使用 (Friend) 或供全世界使用 (Public)。你应该将过程标记为 Private,除非它们将从模块外部调用。这将鼓励你,以及任何编辑你的程序的人,将相关的过程放在同一个模块中,这显然使维护更容易。
将过程标记为 Private 也意味着你可以在另一个模块中拥有另一个具有完全相同名称的过程。
使用 Exit Function 或 Exit 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 Let 和 Property 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
一旦一个参数被声明为可选的,它右侧的所有参数都必须被声明为可选的。
链接
- 使用可选参数,Office 2000,msdn.microsoft.com
前一页: 数据类型 | 目录 | 下一页: Windows_对话框 |