在VBA中使用自定义数据types

我正在尝试在Excel的VBA中创build自定义数据types。 我们称这种数据types为“卡车”。 每辆卡车都有以下属性:

NumberOfAxles (this is an integer) AxleWeights (this is an array of doubles) AxleSpacings (this is an array of doubles) 

我可以创build数据types“卡车”(卡车(1),卡车(2)等等)的多个实例,并读取/写入上面列出的属性到该实例?

例:

 Truck(1).NumberOfAxles = 2 Truck(1).AxleWeights(1) = 15.0 Truck(1).AxleWeights(2) = 30.0 Truck(1).AxleSpacings(1) = 8.0 Truck(2).NumberOfAxles = 3 Truck(2).AxleWeights(1) = 8.0 Truck(2).AxleWeights(2) = 10.0 Truck(2).AxleWeights(3) = 12.0 Truck(2).AxleSpacings(1) = 20.0 Truck(2).AxleSpacings(2) = 4.0 

等等。 上面的语法很可能是错误的,我只是想演示我需要的结构。

所有我想写数据到数据结构,并根据需要调用它,如

 Truck(i).NumberOfAxles Truck(i).AxleWeights(j) Truck(i).AxleSpacings(j) 

非常感谢你!

你当然可以:

 Option Explicit '***** User defined type Public Type MyType MyInt As Integer MyString As String MyDoubleArr(2) As Double End Type '***** Testing MyType as single variable Public Sub MyFirstSub() Dim MyVar As MyType MyVar.MyInt = 2 MyVar.MyString = "cool" MyVar.MyDoubleArr(0) = 1 MyVar.MyDoubleArr(1) = 2 MyVar.MyDoubleArr(2) = 3 Debug.Print "MyVar: " & MyVar.MyInt & " " & MyVar.MyString & " " & MyVar.MyDoubleArr(0) & " " & MyVar.MyDoubleArr(1) & " " & MyVar.MyDoubleArr(2) End Sub '***** Testing MyType as an array Public Sub MySecondSub() Dim MyArr(2) As MyType Dim i As Integer MyArr(0).MyInt = 31 MyArr(0).MyString = "VBA" MyArr(0).MyDoubleArr(0) = 1 MyArr(0).MyDoubleArr(1) = 2 MyArr(0).MyDoubleArr(2) = 3 MyArr(1).MyInt = 32 MyArr(1).MyString = "is" MyArr(1).MyDoubleArr(0) = 11 MyArr(1).MyDoubleArr(1) = 22 MyArr(1).MyDoubleArr(2) = 33 MyArr(2).MyInt = 33 MyArr(2).MyString = "cool" MyArr(2).MyDoubleArr(0) = 111 MyArr(2).MyDoubleArr(1) = 222 MyArr(2).MyDoubleArr(2) = 333 For i = LBound(MyArr) To UBound(MyArr) Debug.Print "MyArr: " & MyArr(i).MyString & " " & MyArr(i).MyInt & " " & MyArr(i).MyDoubleArr(0) & " " & MyArr(i).MyDoubleArr(1) & " " & MyArr(i).MyDoubleArr(2) Next End Sub 

看起来你想把卡车定义为一个具有属性NumberOfAxles,AxleWeights和AxleSpacings的类。

这可以在CLASS MODULE (这里命名为clsTrucks

 Option Explicit Private tID As String Private tNumberOfAxles As Double Private tAxleSpacings As Double Public Property Get truckID() As String truckID = tID End Property Public Property Let truckID(value As String) tID = value End Property Public Property Get truckNumberOfAxles() As Double truckNumberOfAxles = tNumberOfAxles End Property Public Property Let truckNumberOfAxles(value As Double) tNumberOfAxles = value End Property Public Property Get truckAxleSpacings() As Double truckAxleSpacings = tAxleSpacings End Property Public Property Let truckAxleSpacings(value As Double) tAxleSpacings = value End Property 

那么在一个模块中 ,下面定义一个新的卡车和它的属性,并将其添加到卡车集合中,然后检索集合。

 Option Explicit Public TruckCollection As New Collection Sub DefineNewTruck() Dim tempTruck As clsTrucks Dim i As Long 'Add 5 trucks For i = 1 To 5 Set tempTruck = New clsTrucks 'Random data tempTruck.truckID = "Truck" & i tempTruck.truckAxleSpacings = 13.5 + i tempTruck.truckNumberOfAxles = 20.5 + i 'tempTruck.truckID is the collection key TruckCollection.Add tempTruck, tempTruck.truckID Next i 'retrieve 5 trucks For i = 1 To 5 'retrieve by collection index Debug.Print TruckCollection(i).truckAxleSpacings 'retrieve by key Debug.Print TruckCollection("Truck" & i).truckAxleSpacings Next i End Sub 

有几种方法可以做到这一点,这取决于你打算如何使用数据,以确定类/集合是最好的设置还是数组/字典等。