创建自己的数据类型
不同类型的变量可以组合起来用来创建用户定义的类型(如熟知的 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"

解决方案 »

  1.   

    Type SystemInfo
       CPU As Variant
       Memory As Long
       DiskDrives(25) As String   '固定大小的数组。
       VideoColors As Integer
       Cost As Currency
       PurchaseDate As Variant
    End Type
      

  2.   

    你可以用TYPE就行了,下面是例子
    type a
       name as string
       value as string
    end type
      

  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"