跳转到内容

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_对话框
华夏公益教科书