2012-09-13 13 views
31

VBA用のカスタムデータ型を作成しようとしています。このデータ型を "トラック"としましょう。各トラックには、以下の属性があります。VBAでのカスタムデータ型の使用

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

私はoooの答えをチェックしました。タイプの代わりにクラスを使う利点があります。私は、クラスを使用することでコードがより将来的に証明されることに同意しますが、あなたの返信は私の特定の問題(データ構造は非常にシンプルで制限されています)を素早く解決します。 – marillion

27

あなたがプロパティのNumberOfAxles、AxleWeights & AxleSpacingsでClassとしてトラックを定義したいように見えます。

これは

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 

(ここではclsTrucksという名前)クラスモジュールに定義することができ、その後MODULEに以下は新しいトラックを定義し、それがプロパティだとのコレクションに追加しますトラックを収集し、コレクションを取得します。

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

関連する問題