VBA Eigene Klasse nicht in Form verfügbar

  • Excel

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Darkscale.

    VBA Eigene Klasse nicht in Form verfügbar

    Hallo Community,
    kann mir jemand mal einen Hinweis geben, wo mein Fehler liegt?

    Im Klassenmodul eine Klasse namens "TagClass" angelegt

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Class_A As String
    3. Private Class_B As String
    4. Private Class_C As String
    5. Private Class_No As Long
    6. Public Property Get A() As String
    7. A = Class_A
    8. End Property
    9. Public Property Get B() As String
    10. B = Class_B
    11. End Property
    12. Public Property Get C() As String
    13. C = Class_C
    14. End Property
    15. Public Property Get No() As Long
    16. No = Class_No
    17. End Property
    18. Public Property Let A(ByVal NewValue As String)
    19. Class_A = NewValue
    20. End Property
    21. Public Property Let B(ByVal NewValue As String)
    22. Class_B = NewValue
    23. End Property
    24. Public Property Let C(ByVal NewValue As String)
    25. Class_C = NewValue
    26. End Property
    27. Public Property Let No(ByVal NewValue As Long)
    28. Class_No = NewValue
    29. End Property


    Die Klasse wird nun in einem Modul mit Inhalt gefüllt:

    Visual Basic-Quellcode

    1. ...
    2. Public Tag() As TagClass
    3. Sub Test()
    4. For i = 0 To 20
    5. Set Tag(i) = New TagClass
    6. Tag(i).No = i + 1
    7. Tag(i).A = tblDB.Range("A" & i + 1).Value
    8. Tag(i).B = tblDB.Range("B" & i + 1).Value
    9. Tag(i).C = tblDB.Range("C" & i + 1).Value
    10. Next
    11. frmFenster.Show
    12. End Sub


    Die Werte werden alle korrekt gefüllt und in dem Array gespeichert. Was ich nicht verstehe ist, dass das Komplette Array nach der Ausführung "End Sub" oder "frmFenster.Show" wieder geleert wird. Also nicht nur die Inhalte, sondern auch die Speicherreservierung.

    Wo liegt der Fehler? :S

    [update] Achso fast vergessen:
    In dem CodeFenster für das zu öffnende Form erkennt der VBA Editor auch die Klasse nicht. Intellisense Springt nicht an und wenn ich versuche sie dennoch zu nutzen, bekomme ich die Meldung, dass die "Variable nicht definiert" ist.
    Bilder
    • pic.jpg

      87,6 kB, 1.016×431, 80 mal angesehen
    Wer nichts weiß ist nicht Dumm sondern unwissend!
    VB.NET Neueinsteuger... aber natürlich immer in "Option Explicit" - sonst lernt man nit!

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

    Ich hab mal den Code nachgebaut.

    Visual Basic-Quellcode

    1. Public Tag() As TagClass
    2. Sub Test()
    3. For i = 0 To 20
    4. Set Tag(i) = New TagClass

    Fehlt da nicht irgendwo die Felddimensionierung? Entweder Public Tag(20) As TagClass oder später ein ReDim? Ohne die beiden streikt er mir sofort und lässt auch keine Instanziierung zu.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo VaporiZed

    Ich habe den Redim Befehl tatsächlich vergessen einzutragen. Sorry.

    Visual Basic-Quellcode

    1. ​ReDim Tag(Tabelle1.Cells(Tabelle1.Rows.Count, 1).End(xlUp).Row - 1)


    Mit der Felddimensionierung allerdings habe ich kein Problem.

    Grüße,
    Darkscale
    Wer nichts weiß ist nicht Dumm sondern unwissend!
    VB.NET Neueinsteuger... aber natürlich immer in "Option Explicit" - sonst lernt man nit!
    Kann ich nicht nachvollziehen. Da ich Tabelle1 und tblDB nicht kenne, habe ich die ersetzt und folgendes versucht, was auch läuft:
    Module1

    Visual Basic-Quellcode

    1. Public Tag() As TagClass
    2. Sub Test()
    3. ReDim Tag(Sheets(1).Cells(Sheets(1).Rows.Count, 1).End(xlUp).Row - 1)
    4. For i = 0 To 20
    5. Set Tag(i) = New TagClass
    6. Tag(i).No = i + 1
    7. Tag(i).a = Sheets(1).Range("A" & i + 1).Value
    8. Tag(i).B = Sheets(1).Range("B" & i + 1).Value
    9. Tag(i).C = Sheets(1).Range("C" & i + 1).Value
    10. Next
    11. frmFenster.Show
    12. End Sub
    13. Sub a()
    14. Test
    15. MsgBox Tag(0).No
    16. End Sub


    In Sheet 1 stehen in Spalte A untereinander die Zahlen 1-22, in B 23-44, in C 45-66.
    Die TagClass habe ich unverändert übernommen und Sub a ausgeführt. Ohne Fehler.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo nochmal,

    ich habe hier mal meine Datei "in reduzierter Form" angehängt. Das Problem ist dort gut zu erkennen. Wenn ich meine "TagClass" in der Form nutzen möchte wird diese nicht erkannt. Obwohl ich diese als Public definiert habe.

    Grüße,
    Darkscale
    Dateien
    • Beispiel.zip

      (25,41 kB, 74 mal heruntergeladen, zuletzt: )
    Wer nichts weiß ist nicht Dumm sondern unwissend!
    VB.NET Neueinsteuger... aber natürlich immer in "Option Explicit" - sonst lernt man nit!
    Tja, der UserForm_Initialize-Fehler bei UBound() tritt durch einen Namenskonflikt auf. Leider benennst Du Dein Feld wie die Form-Property "Tag" (Typ: String), also die Zusatzinformationseigenschaft für Formulare und andere Controls. Und damit vermutet das Programm das falsche Objekt an jener Stelle. Entweder Du benennst Deine Klasseninstanzen um oder benutzt vollqualifiziert modMain.Tag. Dann läuft es.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.