该示例使用 Type 语句,定义用户自定义的数据类型。Type 语句只能在模块级使用。如果要在类模块中使用,则必须在 Type 语句前冠以关键字 Private。Type EmployeeRecord '创建用户自定义的类型。
ID As Integer '定义元素的数据类型。
Name As String * 20
Address As String * 30
Phone As Long
HireDate As Date
End Type
Sub CreateRecord()
Dim MyRecord As EmployeeRecord '声明变量。'对 EmployeeRecord 变量的赋值必须在过程内进行。
MyRecord.ID = 12003 '给一个元素赋值。
End Sub

解决方案 »

  1.   

    Type 语句      在模块级别中使用,用于定义包含一个或多个元素的用户自定义的数据类型。语法[Private | Public] Type varname
    elementname [([subscripts])] As type
    [elementname [([subscripts])] As type]
    . . .End TypeType 语句的语法包含下面部分:部分 描述 
    Public 可选的。用于声明可在所有工程的所有模块的任何过程中使用的用户定义类型。 
    Private 可选的。用于声明只能在包含该声明的模块中使用的用户自定义的类型。 
    varname 必需的。用户自定义类型的名称;遵循标准的变量命名约定 
    elementname 必需的。用户自定义类型的元素名称。除了可以使用的关键字,元素名称也应遵循标准变量命名约定。 
    subscripts 可选的。数组元素的维数。当定义大小可变的数组时,只须圆括号。subscripts 参数使用如下语法: 
      [lower To] upper [,[lower To] upper] . . . 
      如果不显式指定 lower,则数组的下界由 Option Base 语句控制。如果没有 Option Base 语句则下界为 0。 
    type 必需的。元素的数据类型;可以是Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(对变长的字符串)、String * length(对定长的字符串)、Object、Variant、其它的用户自定义的类型或对象类型。 
    说明Type 语句只能在模块级使用。使用 Type 语句声明了一个用户自定义类型后,就可以在该声明范围内的任何位置声明该类型的变量。可以使用 Dim、Private、Public、ReDim 或 Static 来声明用户自定义类型的变量。在标准模块中,用户自定义类型按缺省设置是公用的。可以使用 Private 关键字来改变其可见性。而在类模块中,用户自定义类型只能是私有的,且使用 Public 关键字也不能改变其可见性。在 Type...End Type 块中不允许使用行号和行标签。用户自定义类型经常用来表示数据记录,记录一般由多个不同数据类型的元素组成。下面的示例演示了一个用户自定义类型的大小固定的数组的用法:Type StateData
       CityCode (1 To 100) As Integer   ' Declare a static array.
       County As String * 30
    End TypeDim Washington(1 To 100) As StateData在上述示例中,StateData 中包括了一个 CityCode 静态数组,且记录Washington 的结构与 StateData 相同。当在用户自定义类型中声明大小固定的数组时,必须用数字文字或常数而不能用变量来声明数组的维数。数组的下界由 Option Base 语句的设置确定。
      

  2.   

    Type 语句示例
    该示例使用 Type 语句,定义用户自定义的数据类型。Type 语句只能在模块级使用。如果要在类模块中使用,则必须在 Type 语句前冠以关键字 Private。Type EmployeeRecord   '创建用户自定义的类型。
       ID As Integer   '定义元素的数据类型。
       Name As String * 20
       Address As String * 30
       Phone As Long
       HireDate As Date
    End Type
    Sub CreateRecord()
       Dim MyRecord As EmployeeRecord   '声明变量。   '对 EmployeeRecord 变量的赋值必须在过程内进行。
       MyRecord.ID = 12003   '给一个元素赋值。
    End Sub
      

  3.   

    创建自己的数据类型
    不同类型的变量可以组合起来用来创建用户定义的类型(如熟知的 C 编程语言中的 structs)。当需要创建单个变量来记录多项相关的信息时,用户定义类型是十分有用的。可以用 Type 语句创建用户定义的类型,该语句必须置于模块的声明部分。用户定义类型可以用适当的关键字声明为 Private 或 Public,例如:Private Type MyDataType
    -或-Public Type MyDataType例如,可以创建一个记录有关计算机系统的信息的用户定义类型:'声明(一个标准模块的)。
    Private Type SystemInfo
       CPU As Variant
       Memory As Long
       VideoColors As Integer
       Cost As Currency
       PurchaseDate As Variant
    End Type声明用户定义类型的变量
    对同一种用户定义类型,可以声明为局部的、私有的或公用的模块级变量:Dim MySystem As SystemInfo, YourSystem As SystemInfo下表阐明可以在什么地方声明用户定义类型和该类型的变量及其作用范围。
    过程/模块 将用户定义类型创建成为… 用户定义类型的变量可以
    被声明成… 
    过程 不适用 仅局部 
    标准模块 私有或公用 私有或公用 
    窗体模块 仅私有 仅私有 
    类模块 私有或公用 私有或公用 
    注意   假如声明了使用Dim 关键字,标准或类模块中的用户自定义类型将缺省为公有的。假如您希望自定义类型为私有的,确保您用Private 关键字将其声明为私有。赋值和检索值
    对这种变量的元素赋值和从元素中检索值类似于属性的设置和获取:MySystem.CPU = "486"
    If MySystem.PurchaseDate > #1/1/92# Then如果两个变量都属于同一个用户定义类型,也可以将其中一个变量赋给另一个变量。这种赋值是将一个变量的所有元素赋给另一个变量的对应元素。YourSystem = MySystem包含数组的用户定义类型
    用户定义类型可以包含一个普通数组(固定大小的数组)。例如:Type SystemInfo
       CPU As Variant
       Memory As Long
       DiskDrives(25) As String   '固定大小的数组。
       VideoColors As Integer
       Cost As Currency
       PurchaseDate As Variant
    End Type用户类型中也可以包含动态数组。Type SystemInfo
       CPU As Variant
       Memory As Long
       DiskDrives() As String      '动态数组。
       VideoColors As Integer
       Cost As Currency
       PurchaseDate As Variant
    End Type可以采用访问对象中的属性的方法来访问用户定义类型中数组的值。Dim MySystem As SystemInfo
    ReDim MySystem.DiskDrives(3)
    MySystem.DiskDrives(0) = "1.44 MB"也可以声明属于用户定义类型的数组:Dim AllSystems(100) As SystemInfo可以采用同样的规则访问这一数据结构中的元素。AllSystems(5).CPU = "386SX"
    AllSystems(5).DiskDrives(2) = "100M SCSI"向过程传递用户定义类型
    可以使用用户定义类型传递过程参数。Sub FillSystem (SomeSystem As SystemInfo)
       SomeSystem.CPU = lstCPU.Text
       SomeSystem.Memory = txtMemory.Text
       SomeSystem.Cost = txtCost.Text
       SomeSystem.PurchaseDate = Now
    End Sub注意 如果要传递窗体或类模块中的用户定义类型,则过程必须是私有的。可以从函数中返回用户定义类型,也可以将属于用户定义类型的变量作为参数传递到过程中。用户定义类型总是通过引用传递,所以被调用过程可以修改参数并将其返回到调用过程中,这一点在前面的示例中已有说明。注意   由于用户定义的类型总是由引用来传递的,包含在用户定义类型中的所有数据都将传递到过程并从过程中返回。对于包含大数组的用户定义类型,这将会导致较差的性能,特别是在客户/服务器应用程序中,在客户/服务器应用程序中,过程可能运行在一个远程机器上。在这种情况下,最好只将必要的数据从用户定义类型中抽取并传递。详细信息 关于通过引用传递参数的详细信息,请参阅“编程基础”中的“向过程传递参数”。包含对象的用户定义类型
    用户定义类型也可以包含对象。Private Type AccountPack
       frmInput as Form
       dbPayRollAccount as Database
    End Type提示 因为 Variant 数据类型能存储许多不同类型的数据,所以当希望使用用户定义类型时,在许多情况下也可以使用 Variant 数组。实际上,Variant 数组比用户定义类型更灵活,因为存储在每个元素中的数据的类型可以随时改变,而且还可以将数组定义为动态的,必要时可以改变其大小。但是,Variant 数组使用的内存总是要多于相当的用户定义类型。嵌套数据结构
    嵌套数据结构可以达到所希望的复杂程度。事实上,正如以下的示例所显示的那样,用户定义类型可以包含其他的用户定义类型。为了保证代码的可读性和易于调试,应尽量将定义用户定义数据类型的所有代码限制在一个模块的范围内。Type DriveInfo
       Type As String
       Size As Long
    End TypeType SystemInfo
       CPU As Variant
       Memory As Long
       DiskDrives(26) As DriveInfo
       Cost As Currency
       PurchaseDate As Variant
    End TypeDim AllSystems(100) As SystemInfo
    AllSystems(1).DiskDrives(0).Type = "Floppy"