2012-09-13 30 views
31

Excel için VBA'da özel bir veri türü oluşturmaya çalışıyorum. Bu veri tipini "kamyon" olarak adlandıralım. Her kamyon aşağıdaki özelliklere sahiptir:VBA'da Özel Veri Türlerinin Kullanımı

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

ben veri türü "kamyon" birçok örneklerini oluşturabilir ((1), kamyon (2 kamyon) ... vb) ve ben listelenen özelliklerini yazma/okuma Yukarıdaki örneğe mi?

Örnek:

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 

vb. Yukarıdaki sözdizimi büyük olasılıkla yanlıştır, sadece gelmem gereken yapıyı göstermek istedim.

bir veri yapısına veri yazma ve

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

teşekkür çok teşekkür ederim böyle

kadar gerekli diyoruz çalışıyorum tümü! yapabilirsiniz

cevap

51

Eminim: özellikleri NumberOfAxles, AxleWeights & AxleSpacings ile Class olarak Kamyon tanımlamak istediğiniz gibi

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

Büyük açıklama olup olmadığına dair verileri kullanmak niyetinde bağlıdır Bunu yapmanın çeşitli yolları vardır! Çok teşekkürler! – marillion

+0

Rica ederim! @ooo sınıflarından gelen cevaplar sizin için de işe yarayacaktır. –

+1

Ooo'nun cevabını kontrol ettim ve türlerin yerine sınıfları kullanmanın avantajlarını görüyorum. Sınıfları kullanmanın kodu daha gelecekteki bir kanıt haline getireceğine katılıyorum, ancak cevabınız benim özel problemimi (veri yapısı çok basit ve sınırlı) hızlı bir şekilde çözüyor. – marillion

27

görünüyor.

Bu

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 

sonra MODÜL şu yeni bir kamyon tanımlar ve özelliklerini var ve bir koleksiyon ekler bir SINIF MODÜL içinde (adlandırılmış burada clsTrucks) tanımlanabilir kamyonlar ve daha sonra koleksiyonu alır.

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 

yani gerçekten bir sınıf/koleksiyon iyi kurulum veya diziler/sözlükler vb

+6

sınıfları kullanarak yaklaşımı açıkladığınız için teşekkürler. Bunu bugün sadece tanıdık olmak için uyguladım ve bir çekicilik gibi çalışıyor. Benim amacım için, "özel tip" yaklaşımı işe yarıyor, çünkü bu projede gelecekte genişleme olmayacak. Ancak, önümüzdeki projelerde daha sık dersleri kullanmaya çalışacağım. Teşekkürler! – marillion

İlgili konular