2012-09-13 3 views
31

Excel 용 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

물론 : 당신은 속성 NumberOfAxles, AxleWeights & AxleSpacings와 Class로 트럭을 정의 할 같이

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

것 같습니다.

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)를 정의 할 수 있습니다 그런 다음 컬렉션을 검색합니다.

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

관련 문제