Array mit eigenem Objekt

  • Excel

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von eldrior.

    Array mit eigenem Objekt

    Hallo,

    ich möchte gerne in einem Excel Makro ein Array von eigenen Objekten ansprechen. Zur Veranschaulichung habe ich eine vereinfachte Version meines Problems geschrieben:
    Main Sub:

    Visual Basic-Quellcode

    1. Sub abc()
    2. MsgBox "Sub startet"
    3. Dim a As Auto
    4. Set a = New Auto
    5. MsgBox "a erstellt"
    6. a.hersteller = "Audi"
    7. MsgBox "Hersteller: " + a.hersteller
    8. 'Bis hier treten keine Probleme auf
    9. 'Set a.Teile(1) = New Auto
    10. 'Set a.Teile(2) = New Auto
    11. 'Set a.Teile(3) = New Auto
    12. a.Teile(1).text = "Rad"
    13. a.Teile(2).text = "Bremse"
    14. a.Teile(3).text = "Tür"
    15. 'Hier kommt er nicht mehr hin.
    16. 'Laufzeitfehler 91
    17. MsgBox a.Teile(3)
    18. End Sub


    Klassenmodul Auto:

    Visual Basic-Quellcode

    1. Public hersteller As String
    2. Private t() As Bauteil
    3. Public Property Get Teile(index As Integer) As Bauteil
    4. Teile = t(index)
    5. End Property
    6. Public Property Let Teile(index As Integer, myVal As Bauteil)
    7. t(index) = myVal
    8. End Property
    9. Private Sub Class_Initialize()
    10. ReDim t(1 To 3)
    11. End Sub


    Klassenmodul Bauteil:

    Visual Basic-Quellcode

    1. Public text As String
    2. 'Ich bin mir nicht sicher, ob das notwendig ist. Das war ein Versuch den Fehler zu beheben
    3. Private Sub Class_Initialize()
    4. End Sub


    Ich habe auch versucht in der "Class_Initialize" der Auto-Klasse allen Arrayeinträgen einen neuen Wert zuzuweisen.

    Visual Basic-Quellcode

    1. Set t = New Bauteil()


    Selbst wenn ich in "abc" mit den auskommentierten Zeilen die Arrayitems initialisiere, fliegt er dort mit dem Laufzeitfehler 91 raus. Nutze ich statt der "Bauteil"-Klasse einen String, funktioniert der Code so, wie er oben steht problemlos.
    Kann mir jemand auf die Sprünge helfen, wo mein Fehler liegt?


    Vielen Dank und viele Grüße
    eldrior

    edit: Ich habe die Idee gehabt das ganze mit einer Collection zu machen. Das hätte den Vorteil, dass ich einfach drauf zugreifen kann, aber meines Wissens ist eine Collection nicht editierbar und ich muss nachträglich Werte in der Collection ändern. Ich würde es also nach möglichkeit gerne vermeiden gezwungen zu werden Objekte aus der Collection zu löschen und neu reinzuschreiben, wenn ich etwas ändern muss, daher bin ich bei einem Array.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „eldrior“ ()

    Ich habe dir, abgeleitet von dieser Antwort, ein funktionierendes Beispiel erstellt..
    Klassenmodul Auto

    Visual Basic-Quellcode

    1. Option Explicit
    2. Public hersteller As String
    3. Private t() As Bauteil
    4. Public Property Get Teile() As Bauteil()
    5. Teile = t
    6. End Property
    7. Public Property Get Teil(index As Integer) As Bauteil
    8. Set Teil = t(index)
    9. End Property
    10. Public Property Let Teil(index As Integer, myVal As Bauteil)
    11. If index > UBound(t) Then ReDim Preserve t(index)
    12. Set t(index) = myVal
    13. End Property
    14. Private Sub Class_Initialize()
    15. ReDim t(0)
    16. End Sub
    Klassenmodul Bauteil

    Visual Basic-Quellcode

    1. Option Explicit
    2. Public Text As String
    3. Public Typ As String
    4. Private Sub Class_Initialize()
    5. End Sub

    Test Sub

    Visual Basic-Quellcode

    1. Sub testClass()
    2. Dim a As Auto
    3. Dim k As Integer
    4. Set a = New Auto
    5. a.hersteller = "Audi"
    6. Dim b As Bauteil
    7. Set b = New Bauteil
    8. b.Text = "Rad"
    9. b.Typ = "Winter"
    10. a.Teil(0) = b
    11. Set b = New Bauteil
    12. b.Text = "Bremse"
    13. b.Typ = "Trommel"
    14. a.Teil(1) = b
    15. Set b = New Bauteil
    16. b.Text = "Tür"
    17. b.Typ = "Heck"
    18. a.Teil(2) = b
    19. For k = LBound(a.Teile) To UBound(a.Teile)
    20. Debug.Print a.Teil(k).Text
    21. Debug.Print a.Teil(k).Typ
    22. Next k
    23. End Sub