[置顶] Visual Basic变量、常数和数据类型及过程概述

来自:VB 神通教程

声明变量

声明变量就是事先将变量通知程序。要用 Dim 语句声明变量,Dim 语句提供了变量名:
    Dim variablename [As type]
    在过程内部用 Dim 语句声明的变量,只有在该过程执行时才存在。过程一结束,该变量的值也就消失了。此外,过程中的变量值对过程来说是局部的,也就是说,无法在一个过程中访问另一个过程中的变量。由于这些特点,在不同过程中就可使用相同的变量名,而不必担心有什么冲突和意想不到变故。

由于 Dim 语句中的可选的 As type 子句,可以定义被声明变量的数据类型或对象类型。数据类型定义了变量所存储信息的类型。String、Integer 和Currency 都是数据类型的例子。变量也可以包含来自Visual Basic或其它应用程序的对象。Object、Form1 和 TextBox 都是 Visual Basic 对象类型或类的实例。

不在过程内部,而在窗体、标准或类模块的声明段声明变量,这将使变量对模块中的所有过程有效。
     用 Public 关键字声明变量,这将使变量在整个应用程序中有效。

     用 Static 关键字声明一个局部变量,那么,即使过程结束,变量的值也仍然保留着。

隐式声明

在使用一个变量之前并不必先声明这个变量。 例如,可以书写这样一个函数,在其中就不必在使用变量 TempVal 之前先声明它:
    Function SafeSqr (num)
      TempVal = Abs (num)
      SafeSqr = Sqr (TempVal)
    End Function
Visual Basic 用这个名字自动创建一个变量,使用这个变量时,可以认为它就是显式声明的。虽然这种方法很方便,但是如果把变量名拼错了的话,会导致一个难以查找的错误。

显式声明

为了避免写错变量名引起的麻烦,可以规定,只要遇到一个未经明确声明就当成变量的名字,Visual Basic 都发出错误警告。    要显式声明变量,请
     在类模块、窗体模块或标准模块的声明段中加入这个语句:
     Option Explicit 
     -或-
    在“工具”菜单中选取“选项”,单击“编辑器”选项卡,再复选“要求变量声明”选项。这样就在任何新模块中自动插入 Option Explicit 语句,但不会在已经建立起来的模块中自动插入;所以在工程内部,只能用手工方法向现有模块添加 Option Explicit。

过程内部使用的变量

过程级变量只有在声明它们的过程中才能被识别,它们又称为局部变量。用 Dim 或者 Static 关键字来声明它们。例如:
     Dim intTemp As Integer
     - 或者 -
     Static intPermanent As Integer
在整个应用程序运行时,用 Static 声明的局部变量中的值一直存在,而用Dim 声明的变量只在过程执行期间才存在。

模块内部使用的变量

按照缺省规定,模块级变量对该模块的所有过程都可用,但对其它模块的代码不可用。可在模块顶部的声明段用 Private 关键字声明模块级变量,从而建立模块级变量。例如:
    Private intTemp As Integer
在模块级,Private 和 Dim 之间没有什么区别,但 Private 更好些,因为很容易把它和 Public 区别开来,使代码更容易理解。

所有模块使用的变量
为了使模块级的变量在其它模块中也有效,用 Public 关键字声明变量。公用变量中的值可用于应用程序的所有过程。和所有模块级变量一样,也在模块顶部的声明段来声明公用变量。例如:
    Public intTemp As Integer
注意 不能在过程中声明公用变量,只能在模块的声明段中声明公用变量。

高级变量主题

如果不同模块中的公用变量使用同一名字,则通过同时引用模块名和变量名就可以在代码中区分它们。例如,如果有一个在 Form1 和 Module1 中都声明了的公用 Integer 变量 intX,则把它们作为 Module1.intX 和Form1.intX 来引用便得到正确值。

阴影窗体属性和控件

在窗体模块内,和窗体中控件同名的局部变量将遮住同名控件。因此必须引用窗体名称或 Me 关键字来限定控件,才能设置或者得到该控件的值或它的属性值。例如:
    Private Sub Form_Click ()
    Dim Text 1 , BackColor
    '假定该窗体有一个控件也叫做 Text1。
     Text1 = "Variable"       '变量用“阴影”遮住控件。
     Me.Text1 = "Control"      '要得到控件,必须用‘Me’限定。
     Text1.Top = 0          '导致出错!
     Me.Text1.Top = 0        '要得到控件,必须用‘Me’限定。
     BackColor = 0         '变量用“阴影”遮住属性。
     Me.BackColor = 0        '要得到窗体属性,必须用‘Me’限定。
   End Sub
声明所有的局部变量为静态变量

为了使过程中所有的局部变量为静态变量,可在过程头的起始处加上 Static关键字。例如:
    Static Function RunningTotal (num)
    这就使过程中的所有局部变量都变为静态,无论它们是用 Static、Dim 或Private 声明的还是隐式声明的。可以将 Static 放在任何 Sub 或 Function过程头的前面,包括事件过程和声明为 Private 的过程。

常数

(1)内部的或系统定义的常数是应用程序和控件提供的

(2)符号的或用户定义的常数是用 Const 语句来声明的。

在 Visual Basic 中,常数名采用大小写混合的格式,其前缀表示定义常数的对象库名。来自 Visual Basic 和 Visual Basic for applications 对象库的常数以 "vb" 开头,例如vbTileHorizontal。

为了绝对确保不发生常数名字冲突,可用以下语法来限定对常数的引用:
    [libname.][modulename.]constname
    Libname 通常是控件或库的类名。Modulename 是定义常数的模块的名字。Constname 是常数名。在对象库中定义了每个元素,并能在“对象浏览器”中查看元素。

创建属于自己的常数
    声明常数的语法是

    [Public|Private] Const constantname[As type] = expression
    参数 constantname 是有效的符号名(其规则与建立变量名的规则一样),expression 由数值常数或字符串常数以及运算符组成;但在 expression 中不能使用函数调用。
    Const 语句可以表示数量、日期和时间:
    Const conPi = 3.14159265358979
    Public Const conMaxPlanets As Integer = 9
    Const conReleaseDate = #1/1/95#
    也可用 Const 语句定义字符串常数:
    Public Const conVersion = "07.10.A"
    Const conCodeName = "Enigma"
    如果用逗号进行分隔,则在一行中可放置多个常数声明:
    Public Const conPi = 3.14, conMaxPlanets = 9, _
    conWorldPop = 6E+09
    等号 ( = ) 右边的表达式往往是数字或文字串,但也可以是其结果为数或字符串的表达式(尽管表达式不能包含函数调用)。甚至可用先前定义过的常数定义新常数。
    Const conPi2 = conPi * 2一旦已定义常数,就可将其放置在代码中,使代码更可读。例如:
    Static SolarSystem (1 To conMaxPlanets)
    If numPeople > conWorldPop Then Exit Sub
避免循环引用
    由于常数可以用其它常数定义,因此必须小心,在两个以上常数之间不要出现循环或循环引用。当程序中有两个以上的公用常数,而且每个公用常数都用另一个去定义时就会出现循环 。例如:
    '在 Module1 中:
    Public Const conA = conB * 2    '在整个应用程序
                      '中有效。
    '在 Module 2:
    Public Const conB = conA / 2    '在整个应用程序
                      '中有效。
    如果出现循环,在试图运行此应用程序时,Visual Basic 就会产生错误信息。不解决循环引用就不能运行程序。为避免出现循环,可将公共常数限制在单一模块内,或最多只存在于少数几个模块内。
数据类型

根据缺省规定,如果在声明中没有说明数据类型,则令变量的数据类型为Variant。Variant 数据类型很像一条变色龙,它可在不同场合代表不同数据类型。当指定变量为 Variant 变量时,不必在数据类型之间进行转换,VisualBasic 会自动完成各种必要的转换。但是,如果知道变量确实总是存储特定类型的数据,并且还声明了这种特定类型的变量,则 Visual Basic 会以更高的效率处理这个数据。例如,存储人名的变量最好表示成 String 数据类型,因为名字总是由字符组成。

声明带数据类型的变量:

在使用非 Variant 变量之前,必须使用 Private、Public、Dim 或 Static 语句将变量声明为 As type。例如,下列语句分别声明了 Integer、Double、String和 Currency 类型的变量:
    Private I As Integer
    Dim Amt As Double
    Static YourName As String
    Public BillsPaid As Currency
    一个声明语句可将多个声明组合起来,请看下列语句:
    Private I As Integer,Amt As Double
    Private YourName As String,BillsPaid As Currency
    Private Test,Amount,J As Integer
    注意 如果不提供数据类型,则指定变量为缺省类型。在上例中,变量 Test和 Amount 是 Variant 数据类型。如果由于其它编程语言的经验使你感到同一个声明语句中的所有变量都有相同的指定数据类型(此例中为 Integer),那么,此处的结果可能会令人感到新鲜。

Numeric 数据类型
    Visual Basic 支持几种 Numeric 数据类型:Integer(整型)、Long(长整型)、Single(单精度浮点型)、Double(双精度浮点型)和 Currency(货币型)。与 Variant 类型相比,Numeric 类型占用的存储空间通常要少。

Byte 数据类型

除一元减法外,所有可对整数进行操作的运算符均可操作 Byte 数据类型。

String 数据类型

如果变量总是包含字符串而从不包含数值,就可将其声明为 String 类型。
    Private S As String
    然后可将字符串赋予这个变量,并用字符串函数对它进行操作。
    S = "Database"
    S = Left (S,4)

也可以声明字符串具有固定长度。可用以下语法声明一个定长字符串:
    String * size
    例如,为了声明一个长度为 50 字符的字符串,可用下列语句:
    Dim EmpName As String * 50

如果赋予字符串的字符少于 50 个,则用空格将 EmpName 的不足部分填满。如果赋予字符串的长度太长,已不能成为定长字符串,则 Visual Basic 会直接截去超出部分的字符。

《Visual Basic 6.0语言参考手册》

Boolean 数据类型

Boolean 的缺省值为 False。

Date 数据类型

Date 和 Time 值既可包含在特定的 Date 数据类型中,又可包含在 Variant变量中。

Object 数据类型

Object 数据类型
    Object 变量作为 32 位(4 个字节)地址来存储,该地址可引用应用程序中或某些其它应用程序中的对象。可以随后(用 Set 语句)指定一个被声明为 Object 的变量去引用应用程序所识别的任何实际对象。
    Dim objDb As Object
    Set objDb = OpenDatabase ("c:\Vb5\Biblio.mdb")

转换数据类型

Visual Basic 提供了几种转换函数,可用来将值转换成特定数据类型。例如,用 CCur 函数将值转换成 Currency 类型:    PayPerWeek = CCur (hours * hourlyPay)

Variant 数据类型
    Variant 变量能够存储所有系统定义类型的数据。如果把它们赋予 Variant 变量,则不必在这些数据的类型间进行转换; Visual Basic 会自动完成任何必要的转换。例如:
    Dim SomeValue           '缺省为 Variant。
    SomeValue = "17"         'SomeValue包含 "17"(双字符的串)。
    SomeValue = SomeValue - 15     '现在, SomeValue 包含数值 2。
    SomeValue = "U" & SomeValue    '现在, SomeValue 包含 "U2" (双字符的串)

如果正在连接两个字符串,则用 " & " 操作符而不用 " + " 操作符。

除了可以像其它标准数据类型一样操作外,Variants 还包含三种特定值:Empty,Null 和 Error。
在赋值之前,Variant 变量具有值 Empty。值 Empty 是异于0、零长度字符串 ("") 或 Null 值的特定值。可用 IsEmpty 函数测试 Empty 值:
    If IsEmpty (Z) Then Z = 0

只要将任何值(包括 0、零长度字符串或 Null)赋予 Variant 变量,Empty 值就会消失。而将关键字 Empty 赋予 Variant 变量,就可将 Variant 变量恢复为 Empty。
Null通常用于数据库应用程序,表示未知数据或丢失的数据。 由于在数据库中使用 Null 方法,Null 具有某些唯一的特性:

              1.对包含 Null 的表达式,计算结果总是 Null。于是说 Null 通过表达式“传播”;如果表达式的部分之值为 Null,那么整个表达式的值也为Null。
    2.将 Null 值、含 Null 的 Variant 变量或计算结果为 Null 的表达式作为参数传递给大多数函数,将会使函数返回 Null。
    3.Null 值经由返回 Variant 数据类型的内在函数传播。
    也可用 Null 关键字指定 Null 值。
    Z = Null
    也可用 IsNull 函数测试 Variant 变量是否包含 Null 值。
    If IsNull (X) And IsNull (Y) Then
      Z = Null
    Else
      Z = 0
    End If

如果将 Null 值赋予 Variant 以外的任何其它类型变量,则将出现可以捕获的错误。而将 Null 值赋予 Variant 则不会发生错误,Null 将通过包含Variant 变量的表达式传播(尽管 Null 并不通过某些函数来传播)。可以从任何具有 Variant 返回值的函数过程返回 Null。

在 Variant 中,Error 是特定值,指出已发生的过程中的错误状态。但是,与其它类型错误不同,这里并未发生正常的应用程序级的错误处理。因此,程序员或应用程序本身可根据 Error 值进行取舍。利用 CVErr 函数将实数转换成错误值就可建立 Error 值。

注意 Variant 总保持 16 位,无论其中存储了什么数据。对象、字符串和数组,在物理上并非存于 Variant 之中;在这些情况下,用四个字节的 Variant 来保持对象引用、或者字符串或数组的指针。而真正的数据存在其它地方。

If VarType (X) = 5 Then X = CSng (X) '转换成单精度。
    对 Array 变量,VarType 的值等于数组元素与数据类型返回值之和。例如,这个数组包含 Double 值:
    Private Sub Form_Click ()
       Dim dblSample (2) As Double
       MsgBox VarType (dblSample)
    End Sub


声明固定大小的数组
       有三种方法声明固定大小的数组,用哪一种方法取决于数组应有的有效范围:
     建立公用数组,在模块的声明段用 Public 语句声明数组。
     建立模块级数组,在模块的声明段用 Private 语句声明数组。
     建立局部数组,在过程中用 Private 语句声明数组。

上界不得超过 Long数据类型的范围(-2,147,483,648 到 2,147,483,647)。

              Dim Counters (14) As Integer      '15 个元素。
    Dim Sums (20) As Double         '21 个元素。
    为建立公用数组,直接用 Public 取代 Dim。
    Public Counters (14) As Integer
    Public Sums (20) As Double

为了规定下界,用关键字 To 显式提供下界(为 Long 数据类型):
    Dim Counters (1 To 15) As Integer
    Dim Sums (100 To 120) As String
    在前述声明中,Counters 的索引值范围从 1 到 15,而 Sums 的索引值范围从 100 到 120。

包含其它数组的数组

有可能建立 Variant 数据类型数组,并与不同数据类型的数组共居一处。以下代码建立两个数组,一个包含整数,而另一个包含 字符串。然后声明第三个 Variant 数组,并将整数和字符串数组放置其中:
    Private Sub Command1_Click ()
      Dim intX As Integer     '声明计数器变量。
      '声明并放置整数数组。
      Dim countersA (5) As Integer
        For intX = 0 To 4
          countersA (intX) = 5
        Next intX
      '声明并放置字符串数组。
      Dim countersB (5) As String
        For intX = 0 To 4
          countersB (intX) = "hello"
        Next intX
      Dim arrX (2) As Variant    '声明拥有两个成员的新数组。
        arrX (1) = countersA ()  '将其它数组移居到数组。
        arrX (2) = countersB ()
        MsgBox arrX (1) (2)    '显示每一个数组的成员。
        MsgBox arrX (2) (3)
     End Sub

多维数组

例如,下面的语句声明了一个过程内的10×10的二维数组。
    Static MatrixA (9, 9) As Double

Static MatrixA (1 To 10, 1 To 10) As Double
    可以将所有这些推广到二维以上的数组。例如:
    Dim MultiD (3, 1 To 10, 1 To 15)
    这个声明建立了三维数组,大小为 4 × 10 × 15。元素总数为三个维数的乘积,为 600。
    注意 在增加数组的维数时,数组所占的存储空间会大幅度增加,所以要慎用多维数组。使用 Variant 数组时更要格外小心,因为它们需要更大的存储空间。

用循环操作数组
    可以用 For 循环嵌套有效的处理多维数组。例如,在 MatrixA 中基于每个元素在数组中的位置为其赋值:
    Dim I As Integer, J As Integer
    Static MatrixA(1 To 10, 1 To 10) As Double
    For I = 1 To 10
       For J = 1 To 10
         MatrixA (I, J) = I * 10 + J
       Next J
    Next I

动态数组

1. (如果希望数组为公用数组,则)用 Public 语句声明数组,或者(如果希望数组为模块级,则)在模块级用 Dim 语句声明数组,或者(如果希望数组为局部数组,则)在过程中用 Static 或 Dim 语句声明数组。给数组附以一个空维数表,这样就将数组声明为动态数组。
     Dim DynArray ()
2. 用 ReDim 语句分配实际的元素个数。
     ReDim DynArray (X + 1)

ReDim 语句只能出现在过程中。与 Dim 语句、Static 语句不同,ReDim 语句是一个可执行语句,由于这一语句,应用程序在运行时执行一个操作。ReDim 语句支持这样的语法,它与固定数组中使用的语法相同。对于每一维数,每个 ReDim 语句都能改变元素数目以及上下界。但是,数组的维数不能改变。
    ReDim DynArray (4 to 12)
    例如,用第一次声明在模块级所建立的动态数组 Matrix1:
    Dim Matrix1 () As Integer
    然后,在过程中给数组分配空间:
    Sub CalcValuesNow ()

注意 您可以将字符串赋值给大小可变的字节数组。一个字节数组也可以被赋值给一个可变长的字符串。一定要注意字符串中的字节数会随平台而变化。同一个字符串在 Unicode 平台上的字节数是它在非Unicode 平台上的两倍。

保留动态数组的内容
    每次执行 ReDim 语句时,当前存储在数组中的值都会全部丢失。VisualBasic 重新将数组元素的值置为 Empty(对 Variant 数组)、置为 0(对Numeric 数组)、置为零长度字符串(对 String 数组)或者置为 Nothing(对于对象的数组)。
    在为新数据准备数组,或者要缩减数组大小以节省内存时,这样做是非常有用的。有时希望改变数组大小又不丢失数组中的数据。使用具有 Preserve关键字的 ReDim 语句就可做到这点。例如,使用 UBound 函数引用上界,使数组扩大、增加一个元素,而现有元素的值并未丢失:
    ReDim Preserve DynArray (UBound (DynArray) + 1)
在用 Preserve 关键字时,只能改变多维数组中最后一维的上界;如果改变了其它维或最后一维的下界,那么运行时就会出错。所以可这样编程:
    ReDim Preserve Matrix (10, UBound (Matrix, 2) + 1)
而不可这样编程:
    ReDim Preserve Matrix (UBound (Matrix, 1) + 1, 10)


    .
    .
    .
        ReDim Matrix1 (19, 29)
    End Sub
    这里的 ReDim 语句给 Matrix 分配一个 20 × 30 的整数矩阵(元素总大小为 600)。还有一个办法,用变量设置动态数组的边界:
    ReDim Matrix1 (X, Y)

在 Visual Basic 中使用下列几种过程:
     Sub 过程不返回值。
     Function 过程返回值。
     property 过程返回并指定值,以及设置对象引用。

Sub 过程
    子过程是在响应事件时执行的代码块。将模块中的代码分成子过程后,在应用程序中查找和修改代码变得更容易了。
    子过程的语法是:
    [Private|Public][Static]Sub procedurename (arguments)
        statements
    End Sub
    每次调用过程都会执行 Sub 和 End Sub 之间的 statements。可以将子过程放入标准模块、类模块和窗体模块中。按照缺省规定,所有模块中的子过程为 Public(公用的),这意味着在应用程序中可随处调用它们。
    过程的 arguments 类似于变量声明,它声明了从调用过程传递进来的值。在 Visual Basic 中应区分通用过程和事件过程这两类子过程。

通用过程
    通用过程告诉应用程序如何完成一项指定的任务。一旦确定了通用过程,就必须专由应用程序来调用。反之,直到为响应用户引发的事件或系统引发的事件而调用事件过程时,事件过程通常总是处于空闲状态。

事件过程是附加在窗体和控件上的

Function 过程

Visual Basic 包含内置的或内部的函数,如 Sqr、Cos 或 Chr。此外,还可用 Function 语句编写自己的 Function 过程。
    函数过程的语法是:
    Private|Public][Static]Function procedurename (arguments) [As type]
        statements
    End Function
    与 Sub 过程一样,Function 过程也是一个独立的过程,可读取参数、执行一系列语句并改变其参数的值。与子过程不同,Function 过程可返回一个值到调用的过程。在Sub 过程与Function 过程之间有三点区别:
     一般说来,让较大的语句或表达式的右边包含函数过程名和参数(returnvalue = function),这就调用了函数。
     与变量完全一样,函数过程有数据类型。这就决定了返回值的类型(如果没有 As 子句,缺省的数据类型为 Variant)。
     给 procedurename 自身赋一个值,就可返回这个值。Function 过程返回一个值时,该值可成为较大表达式的一部分。
    例如,下面是已知直角三角形两直角边的值,计算第三边(斜边)的函数:
    Function Hypotenuse (A As Integer, B As Integer) As String
       Hypotenuse = Sqr (A ^ 2 + B ^ 2)
    End Function
    在 Visual Basic 中调用 Function 过程的方法和调用任何内部函数的方法是一样的:
    Label1.Caption = Hypotenuse(CInt(Text1.Text), _
    CInt(Text2.Text))
    strX = Hypotenuse (Width, Height)

创建新过程
    要创建新的通用过程,请
     在“代码”窗口输入过程头并按下回车键。过程头以 Sub 或 Function 打头,再接一个名字。例如,可以用以下任一方式输入:
    Sub UpdateForm ()
    Function GetCoord ()
    通过完成新过程的模板, Visual Basic 作出反应。
调用 Sub 过程有两种方法:
    '以下两个语句都调用了名为 MyProc 的 Sub 过程。
    Call MyProc (FirstArgument, SecondArgument)
    MyProc FirstArgument, SecondArgument
    注意,当使用 Call 语法时,参数必须在括号内。若省略 Call 关键字,则也必须省略参数两边的括号。

调用函数过程
    通常,调用自行编写的函数过程的方法和调用 Visual Basic 内部函数过程(例如 Abs)的方法一样;即在表达式中写上它的名字。
    '下面的语句都调用函数 ToDec。
    Print 10 * ToDec
    X = ToDec
    If ToDec = 10 Then Debug.Print "Out of Range"
    X = AnotherFunction ( 10 * ToDec)
    就像调用 Sub 过程那样,也能调用函数。下面的语句都调用同一个函数:
    Call Year (Now)Year Now
    当用这种方法调用函数时,Visual Basic 放弃返回值。

调用其它模块中的过程
    在工程中的任何地方都能调用其它模块中的公用过程。可能需要指定这样的模块,它包含正在调用的过程。调用其它模块中的过程的各种技巧,取决于该过程是在窗体模块中、类模块中还是标准模块中。

    窗体中的过程
    所有窗体模块的外部调用必须指向包含此过程的窗体模块。如果在窗体模块 Form1 中包含 SomeSub 过程,则可使用下面的语句调用 Form1 中的过程:
    Call Form1.SomeSub(arguments)

    类模块中的过程
    与窗体中调用过程类似,在类模块中调用过程要调用与过程一致并且指向类实例的变量。例如,DemoClass 是类 Class1 的实例:
    Dim DemoClass as New Class1
    DemoClass.SomeSub
    但是不同于窗体的是,在引用一个类的实例时,不能用类名作限定符。必须首先声明类的实例为对象变量(在这个例子中是 DemoClass )并用变量 名引用它。

标准模块中的过程
    如果过程名是唯一的,则不必在调用时加模块名。无论是在模块内,还是在模块外调用,结果总会引用这个唯一过程。如果过程仅出现在一个地方,这个过程就是唯一的。
    如果两个以上的模块都包含同名的过程,那就有必要用模块名来限定了。在同一模块内调用一个公共过程就会运行该模块内的过程。例如,对于Module1 和 Module2 中名为 CommonName 的过程,从 Module2 中调用CommonName 则运行 Module2 中的CommonName过程,而不是 Module1中的 CommonName 过程。
    从其它模块调用公共过程名时必须指定那个模块。例如,若在 Module1 中调用 Module2 中的 CommonName 过程,要用下面的语句:
    Module2.CommonName (arguments)


参数的数据类型
    过程的参数被缺省为具有 Variant 数据类型。不过,也可以声明参数为其它数据类型。例如,下面的函数接受一个字符串和一个整数:
    Function WhatsForLunch(WeekDay As String, Hour _
    As Integer) As String    
         '根据星期几和时间,返回午餐菜单。
        If WeekDay = "Friday" then
           WhatsForLunch = "Fish"
        Else
           WhatsForLunch = "Chicken"
        End If
        If Hour > 4 Then WhatsForLunch = "Too late"
    End Function

按值传递参数按值传递参数时,传递的只是变量的副本。如果过程改变了这个值,则所作变动只影响副本而不会影响变量本身。用 ByVal 关键字指出参数是按值来传递的。
    例如:
    Sub PostAccounts (ByVal intAcctNum as Integer)
    .
    . '这里放语句。

    .End Sub

按地址传递参数
    按地址传递参数使过程用变量的内存地址去访问实际变量的内容。结果,将变量传递给过程时,通过过程可永远改变变量值。按地址传递参数在Visual Basic 中是缺省的。

如果给按地址传递参数指定数据类型,就必须将这种类型的值传给参数。可以给参数传递一个表达式,而不是数据类型。Visual Basic 计算表达式,如果可能的话,还会按要求的类型将值传递给参数。

如果给按地址传递参数指定数据类型,就必须将这种类型的值传给参数。可以给参数传递一个表达式,而不是数据类型。Visual Basic 计算表达式,如果可能的话,还会按要求的类型将值传递给参数。

使用可选的参数

在过程的参数列表中列入 Optional 关键字,就可以指定过程的参数为可选的。如果指定了可选参数,则参数表中此参数后面的其它参数也必是可选的,并且要用 Optional 关键字来声明。下面两段示例代码假定有一个窗体,其内有一命令按钮和一列表框。
    例如,这段代码提供所有可选参数:
    Dim strName As String
    Dim strAddress As String

    Sub ListText(Optional x As String, Optional y _
    As String)
       List1.AddItem x
       List1.AddItem y
    End Sub

    Private Sub Command1_Click ()
       strName = "yourname"
       strAddress = 12345     '提供了两个参数。
       Call ListText (strName, strAddress)
    End Sub
    而下面的代码并未提供全部可选参数:
    Dim strName As String
    Dim varAddress As Variant

    Sub ListText (x As String, Optional y As Variant)
       List1.AddItem x
       If Not IsMissing (y) Then
          List1.AddItem y
       End If
    End Sub

    Private Sub Command1_Click ()
       strName = "yourname"    '未提供第二个参数。
       Call ListText (strName)
    End Sub
    在未提供某个可选参数时,实际上将该参数作为具有 Empty 值的变体来赋值。上例说明如何用 IsMissing 函数测试丢失的可选参数。

提供可选参数的缺省值

    也可以给可选参数指定缺省值。在下例中,如果未将可选参数传递到函数过程,则返回一个缺省值。
    Sub ListText(x As String, Optional y As _
    Integer = 12345)
      List1.AddItem x
      List1.AddItem y
    End Sub

    Private Sub Command1_Click ()
      strName = "yourname"     '未提供第二个参数。
      Call ListText (strName)   '添加“yourname”和“12345”。
    End Sub

使用不定数量的参数一般说来,过程调用中的参数个数应等于过程说明的参数个数。可用ParamArray 关键字指明,过程将接受任意个数的参数。于是可以这样来编写计算总和的 Sum 函数:
    Dim x As Integer
    Dim y As Integer
    Dim intSum As Integer

    Sub Sum (ParamArray intNums ())
       For Each x In intNums
         y = y + x
       Next x
       intSum = y
    End Sub

    Private Sub Command1_Click ()
       Sum 1, 3, 5, 7, 8
       List1.AddItem intSum
    End Sub

用命名的参数创建简单语句
    对许多内建函数、语句和方法,Visual Basic 提供了命名参数方法来快捷传递参数值。对命名参数,通过给命名参数赋值,就可按任意次序提供任意多参数。为此,键入命名参数,其后为冒号、等号和值 (MyArgument :="SomeValue") ,可以按任意次序安排这些赋值,它们之间用逗号分开。注意,下例中的参数顺序和所要参数的顺序相反:
    Function ListText (strName As String, Optional strAddress As String)
       List1.AddItem strName
       List2.AddItem strAddress
    End Sub

    Private Sub Command1_Click ()
       ListText strAddress:="12345", strName:="Your Name"
       End Sub
    如果过程有若干不必总要指定的可选参数,则上述内容更为有用。

注意:If...Then 的单行格式不用 End If 语句。如果 condition 为 True 时要执行多行代码,则必须使用多行块 If...Then...End If 语法。

Select Case
    Visual Basic 提供 Select Case 结构替代 If...Then...Else,从而可在多个语句块中有选择地执行其中一个。Select Case 语句的能力与 If...Then...Else 语句类似,但对多重选择的情况,Select Case 语句使代码更加易读。

Select Case testexpression
        [Case expressionlist1
           [statementblock-1]]
        [Case expressionlist2
           [statementblock-2]]
             .
             .
             .
        [Case Else
           [statementblock-n]]

    End Select

例如,假定在 If...Then...Else 的例子中要向“编辑”菜单添加命令。为此可以另加一个 ElseIf 子句,或用 Select Case 来写函数:
    Private Sub mnuCut_Click (Index As Integer)
       Select Case Index
          Case 0              '“剪切”命令。
            CopyActiveControl      '调用通用过程。
            ClearActiveControl
          Case 1              '“复制”命令。
            CopyActiveControl
          Case 2              '“清除”命令。
            ClearActiveControl
          Case 3              '“粘贴”命令。
            PasteActiveControl
          Case Else
            frmFind.Show         '显示找到的对话框。
       End Select
    End Sub


你可能感兴趣的:([置顶] Visual Basic变量、常数和数据类型及过程概述)