2012-09-13 40 views
31

Tôi đang cố gắng tạo kiểu dữ liệu tùy chỉnh trong VBA cho Excel. Hãy gọi loại dữ liệu này là "xe tải". Mỗi xe tải có các thuộc tính sau:Sử dụng các kiểu dữ liệu tùy chỉnh trong VBA

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

Tôi có thể tạo nhiều loại dữ liệu "xe tải" (xe tải (1), xe tải (2) ...) và đọc/ghi các thuộc tính tôi liệt kê ở trên ví dụ đó?

Ví dụ:

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 

và vân vân. Cú pháp trên có lẽ là sai, tôi chỉ muốn chứng minh cấu trúc mà tôi cần phải tìm ra.

Tất cả Tôi cố gắng để ghi dữ liệu vào một cấu trúc dữ liệu và gọi nó là cần thiết như

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

Cảm ơn bạn rất nhiều!

Trả lời

51

Chắc chắn bạn có thể:

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 
+0

vĩ đại giải thích! Cảm ơn rất nhiều! – marillion

+0

Bạn được chào đón! Câu trả lời từ @ooo về các lớp học cũng sẽ phù hợp với bạn. –

+1

Tôi đã kiểm tra câu trả lời của ooo, và tôi thấy những ưu điểm của việc sử dụng các lớp thay vì các loại. Tôi đồng ý rằng việc sử dụng các lớp sẽ làm cho mã chứng minh tương lai hơn, nhưng câu trả lời của bạn giải quyết vấn đề cụ thể của tôi (cấu trúc dữ liệu rất đơn giản và hạn chế) một cách nhanh chóng. – marillion

27

Dường như bạn muốn xác định xe tải như một Class với tính NumberOfAxles, AxleWeights & AxleSpacings.

này có thể được định nghĩa trong một MODULE CLASS (ở đây đặt tên 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 

sau đó trong một MODULE sau đây định nghĩa một chiếc xe tải mới và đó là đặc tính và thêm nó vào một tập hợp các xe tải và sau đó lấy bộ sưu tập.

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 

Có một số cách để làm điều này vì nó thực sự phụ thuộc vào cách bạn định sử dụng các dữ liệu về việc liệu một một lớp/bộ sưu tập là các thiết lập tốt nhất hoặc mảng/từ điển, vv

+6

cảm ơn vì đã giải thích cách tiếp cận bằng cách sử dụng các lớp. Tôi đã thực hiện điều này ngày hôm nay chỉ để làm quen với, và nó hoạt động như một sự quyến rũ. Với mục đích của tôi, cách tiếp cận "kiểu tùy chỉnh" hoạt động, vì sẽ không có mở rộng cho dự án này trong tương lai. Tuy nhiên, tôi sẽ cố gắng sử dụng các lớp học thường xuyên hơn trong các dự án sắp tới. Cảm ơn! – marillion

Các vấn đề liên quan