Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class VBA中自定义数据类型的使用_Class_Vba_Types_Excel - Fatal编程技术网

Class VBA中自定义数据类型的使用

Class VBA中自定义数据类型的使用,class,vba,types,excel,Class,Vba,Types,Excel,我正在尝试在VBA for Excel中创建自定义数据类型。让我们将此数据类型称为“truck”。每辆卡车具有以下属性: NumberOfAxles (this is an integer) AxleWeights (this is an array of doubles) AxleSpacings (this is an array of doubles) 我是否可以创建数据类型“truck”(truck(1)、truck(2)…等)的多个实例,并将上面列出的属性读/写到该实例 例如: Tr

我正在尝试在VBA for Excel中创建自定义数据类型。让我们将此数据类型称为“truck”。每辆卡车具有以下属性:

NumberOfAxles (this is an integer)
AxleWeights (this is an array of doubles)
AxleSpacings (this is an array of doubles)
我是否可以创建数据类型“truck”(truck(1)、truck(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

看起来您想将卡车定义为一个
,其属性为numberofaxes、AxleWeights和axlepacings

这可以在类模块中定义(此处命名为clsTrucks

然后在模块中定义新卡车及其属性,并将其添加到卡车集合中,然后检索集合

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

有几种方法可以做到这一点,这实际上取决于您打算如何使用数据,例如a类/集合是最佳设置还是数组/字典等。

不客气!@ooo关于类的答案也适用于你。我检查了ooo的答案,我看到了使用类而不是类型的优点。我同意使用类将使代码更适合未来,但您的回答以一种快速的方式解决了我的具体问题(数据结构非常简单和有限)。您需要确保,该类型在任何子类或函数之前定义,以后定义它将导致问题(或根本不起作用).
MyType
定义是否在同一代码模块中?代码属于哪种类型的代码模块?excel 2016仅在定义为
private
时才起作用,感谢您解释使用类的方法。我今天实现这个只是为了熟悉它,它就像一个符咒。就我的目的而言,“自定义类型”方法是有效的,因为在将来这个项目上不会有扩展。但是,在接下来的项目中,我将尝试更频繁地使用类。谢谢对于非常简单的数据类型,类可能是多余的。在Olle的答案中定义的类型相当于其他语言中的结构,在某些情况下,它可能更轻、更易于使用。
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