Clever-Excel-Forum

Normale Version: Klasse mit Unterklasse?
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

ich beschäftige mich noch nicht lange mit Klassenmodulen und möchte gerne innerhalb einer Klasse eine andere Klasse verwenden. Nach meinen Recherchen bei Google sollte das funktionieren, aber ich bekomme es nicht hin.

Als Beispiel habe ich zwei Klassen erstellt:
- clsPerson
- clsTraining

Die Personen-Klasse beinhaltet Angaben zu einer Person (Name, Alter usw.):
Code:
' Modul:    clsPerson
' Typ:      Klassenmodul

Option Explicit
Private mVName   As String

'~~~ <VName> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Public Property Get VName() As String
   VName = mVName
End Property
Public Property Let VName(ByVal ThisVName As String)
   mVName = ThisVName
End Property

Die Trainings-Klasse beinhaltet Angaben über Ort, Datum und Trainer eines Trainings. Die Trainer-Angaben sollen hierbei aus der Personen-Klasse kommen:
Code:
' Modul:    clsTraining
' Typ:      Klassenmodul

Option Explicit
Private mDatum As Date
Private mOrt As String
Private mTrainer As clsPerson

'~~~ <Datum> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Public Property Get Datum() As Date
   Datum = mDatum
End Property
Public Property Let Datum(ByVal ThisDatum As Date)
   mDatum = ThisDatum
End Property

'~~~ <Ort> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Public Property Get Ort() As String
   Ort = mOrt
End Property
Public Property Let Ort(ByVal ThisOrt As String)
   mOrt = ThisOrt
End Property

'~~~ <Trainer> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Public Property Get Trainer() As clsPerson
   Set Trainer = mTrainer
End Property
Public Property Set Trainer(ByVal ThisTrainer As clsPerson)
   Set mTrainer = ThisTrainer
End Property

In einem Allgemeinen Modul möchte ich nun lesend und schreibend darauf zugreifen:
Code:
' Modul:    vbaTest
' Typ:      Allgemeines Modul

Option Explicit
Public oTrainer     As clsPerson
Public oTraining    As clsTraining

Sub Test()
   Set oTrainer = New clsPerson
   Set oTraining = New clsTraining
   
   oTrainer.VName = "Max"
   Debug.Print "Vorname:", oTrainer.VName
   
   oTraining.Datum = "13.01.18"
   oTraining.Ort = "Berlin"
   
   ' hier kommt die Fehlermeldung
   oTraining.Trainer.VName = "Hans"
   
   Debug.Print "T-Datum:", oTraining.Datum
   Debug.Print "T-Ort:", oTraining.Ort
   Debug.Print "Trainer:", oTraining.Trainer.VName
       
   Set oTraining = Nothing
   Set oTrainer = Nothing
End Sub

Die Zeile
oTraining.Trainer.VName = "Hans"

bringt die Fehlermeldung "Objektvariable ... nicht festgelegt."; aber wie kann ich die festlegen? Oder ist der Trainer innerhalb der Trainings-Klasse falsch definiert? Oder wo ist mein Fehler sonst?

Danke schon mal im Voraus für eure Hilfe!
Hallo,

das geht so in VBA mW nicht. Du müsstest wahrscheinlich die Eigenschaften der "Unterklsse" direkt in der "Oberklasse" implementieren.
Main Modul
Code:
Sub M_snb()
   With New c_training
      .datum = Date
      .Ort = "Hisrchberg"
      .Trainer = "snb"
    
      MsgBox .datum & vbLf & .Ort & vbLf & .Trainer
    End With
End Sub

Class module c_training
Code:
Private v_datum As Date
Private v_Ort As String
Private v_Trainer As String

Public Property Get datum() As Date
   datum = v_datum
End Property

Public Property Let datum(ByVal c00 As Date)
   v_datum = c00
End Property

Public Property Get Ort() As String
   Ort = v_Ort
End Property

Public Property Let Ort(ByVal c00 As String)
   v_Ort = c00
End Property

Public Property Let Trainer(ByVal c00 As String)
   Set c_trainer = New c_persoon
   c_trainer.naam = c00
   v_Trainer = c_trainer.naam
End Property

Public Property Get Trainer() As String
   Trainer = v_Trainer
End Property

Class Modul c_persoon
Code:
Private v_naam   As String

Public Property Get naam() As String
   naam = v_naam
End Property

Public Property Let naam(ByVal c00 As String)
   v_naam = c00
End Property
Danke für die Rückmeldungen; ich habe mittlerweile noch eine Lösung gefunden:
Im Allgemeinen Modul noch ergänzen:
Code:
Set oTraining.Trainer = New clsPerson
Setze doch mal den Code
Code:
Set oTraining.Trainer = New clsPerson
in den Constructor der Klasse clsTraining (und nicht in das allgemeine Modul):
Code:
Private Sub Class_Initialize()
    Set mTrainer = New clsPerson
End Sub
Dann könnte es gehen.
Hallo Steuerfuzzi,

... ja, das klappt prima - dann brauche ich es im Allgemeinen Modul nicht überall neu "setten".

Danke!