2012-09-13 11 views
31

में कस्टम डेटा प्रकारों का उपयोग मैं एक्सेल के लिए वीबीए में एक कस्टम डेटा प्रकार बनाने की कोशिश कर रहा हूं। आइए इस डेटा प्रकार को "ट्रक" कहते हैं। प्रत्येक ट्रक निम्न विशेषताओं है:वीबीए

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

मैं डेटा प्रकार "ट्रक" के कई उदाहरण बना सकते हैं (ट्रक (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) 

आपको बहुत बहुत धन्यवाद कॉल करने के लिए कोशिश कर रहा हूँ

!

उत्तर

51

सुनिश्चित करें कि आप कर सकते हैं:

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

महान विवरण है के रूप में डेटा का कैसे उपयोग करने पर निर्भर करता है! आपका बहुत बहुत धन्यवाद! – marillion

+0

आपका स्वागत है! कक्षाओं के बारे में @ooo का जवाब भी आपके लिए काम करेगा। –

+1

मैंने ओउ के उत्तर की जांच की, और मैं प्रकारों के बजाय कक्षाओं का उपयोग करने के फायदे देखता हूं। मैं मानता हूं कि कक्षाओं का उपयोग कोड को भविष्य का सबूत देगा, लेकिन आपका जवाब मेरी विशिष्ट समस्या को हल करता है (डेटा संरचना बहुत सरल और सीमित है) एक त्वरित तरीके से। – marillion

27

ऐसा लगता है कि आप गुण NumberOfAxles, AxleWeights & AxleSpacings के साथ एक Class के रूप में ट्रक को परिभाषित करना चाहते।

यह एक क्लास मॉड्यूल में (यहाँ नामित 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 

ऐसा करने के कई तरीके हैं, तो यह वास्तव में आप क्या एक एक वर्ग/संग्रह सबसे अच्छा सेटअप या/सरणियों शब्दकोशों आदि

+6

धन्यवाद। मैंने आज परिचित होने के लिए इसे लागू किया, और यह एक आकर्षण की तरह काम करता है। मेरे उद्देश्य के लिए, "कस्टम टाइप" दृष्टिकोण काम करता है, क्योंकि भविष्य में इस परियोजना पर कोई विस्तार नहीं होगा। हालांकि, मैं आने वाली परियोजनाओं में कक्षाओं का अधिक बार उपयोग करने की कोशिश करूंगा। धन्यवाद! – marillion