Parameter in Unterklasse schreiben

  • Excel

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von dke.

    Parameter in Unterklasse schreiben

    Hallo,

    Ich möchte etwas komplexere Berechnungen im Excel VBA durchführen. Die Programmierung mit Klassen scheint mir dabei genau das richtige zu sein, nur leider kenne ich mich da noch nicht so aus. Ich stehe momentan vor folgendem Problem:

    Ich habe eine Unterklasse erstellt, kann zwar auf deren Parameter zugreifen, jeoch nichts in deren Parameter schreiben. Vermutlich gehts mit irgendeiner Property Set Anweisung, aber ich bekomme die einfach nicht so hin dass es funktioniert.

    Nachfolgend mein (vereinfachter) code, Ziel ist, dass die Ausgabe für die Parameter a, b und c jeweis 2 anzeigt. Momentan ist jedoch a=2, b=0 und c=0


    DieseArbeitsmappe:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Sub Hauptprogramm()
    3. Dim objekt1 As Klasse1
    4. Set objekt1 = New Klasse1
    5. objekt1.objekt2.c = 2
    6. Debug.Print objekt1.a
    7. Debug.Print objekt1.objekt2.b
    8. Debug.Print objekt1.objekt2.c
    9. End Sub

    Klassenmodul - Klasse1:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Public Property Get objekt2() As Klasse2
    3. Set objekt2 = New Klasse2
    4. End Property
    5. Public Function a() As Integer
    6. a = 2
    7. objekt2.b = a
    8. End Function

    Klassenmodul - Klasse2:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Public b As Integer
    3. Public c As Integer

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dke“ () aus folgendem Grund: Code in VB6 Tags gepackt

    Willkommen im Forum.
    Da Du den Wert von c nicht setzt, ist klar, warum da nix wird. Jetzt etwas Spekulatiusbacken, da ich gerade kein Excel zum Ausprobieren habe: Bei b ist es ein Schuss ins eigene Knie. In Klasse1 setzt Du in der Funktion a, Zeile#9 den Wert von objekt2.b. Das Problem: Du greifst nicht auf das Objekt zu, sondern auf die Property. Dadurch entsteht eine neue objekt2-Instanz. Soweit, so gut. Aber in DieseArbeitsmappe greifst Du nochmal mittels Debug.Print auf objekt2 zu. Und zwar auf die Property! Wieder entsteht eine neue objekt2-Instanz und folglich hast Du keinen Zugriff mehr auf die alte, bei der Du den b-Wert auf 2 gesetzt hast.

    btw: Bitte die VB6-Tags verwenden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Parameter c versuche ich im Sub Hauptprogramm() zu setzen, leider ebenso erfolglos wie in Klasse1.

    Ich verstehe noch nicht weshalb durch meinen Code ständig neue Instanzen erstellt werden sollen? ich dachte eine neue Instanz kann nur mit Set objekt2 = New Klasse2 erstellt werden. Wie kann ich denn dann auf das Objekt statt auf die Property zugreifen, so dass die Instanz dieselbe bleibt?

    Habs in VB6-Tags geändert, danke für den Hinweis :)
    Verwirf die Property und mach die Neuerstellung im Konstruktor.
    Klasse1:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Public objekt2 As Klasse2
    3. Public Function a() As Integer
    4. a = 2
    5. objekt2.b = a
    6. End Function
    7. Private Sub Class_Initialize()
    8. Set objekt2 = New Klasse2
    9. End Sub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Super, das funktioniert soweit :)

    Leider bin ich aber noch nicht am Ziel. Wenn ich nun ausschließlich Debug.Print objekt1.objekt2.b aufrufe erhalte ich wieder 0. Gibt es eine Möglichkeit, dass sich objekt1.objekt2.b selbst die Informationen aus objekt1.a holt ohne dass ich objekt1.a explizit aufrufen muss?
    Kann ich mit dem gezeigten Code nicht bestätigen. Habe in Klasse 1 mal von a = 2 auf a = 5 geändert und die Anzeige auch. Resultat im Anhang wie gewünscht.
    Ehm. Achso. Ja klar geht das nicht. objekt2 hat keinen Zugriff auf die Daten der Mamaklasse. Das ist ein one way ticket. Mama darf Kind ins Tagebuch schauen, aber nicht andersrum.
    Bilder
    • 1.png

      5,74 kB, 371×322, 8 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ok, ich glaube es nun besser zu verstehen.

    Was ich vorhabe:
    1. Eine Basisberechnung durchführen
    2. Mit den Ergebnissen aus 1) mit weiteren Parametern weiterrechnen, wobei diese weitere Parameter variieren.
    Ich dachte ich erstelle die Struktur wie im beigefügten Bild "Variante1".

    Wenn ich das nun richtig verstehe muss ich jedoch wie in beigefügtem Bild "Variante2" vorgehen. Ich dachte nur Variante1 ist besser, da die Basisberechnung nur einmal durchgeführt wird. in Variante 2 sind vermutlich die Objekte der Basisberechnung alle voneinander unabhängig und werden jedes mal neu berechnet. Aber egal, wenns dann funktioniert... 8-)

    Naja, ich baue meinen Code jetzt mal nach Variante2 um und hoffe damit Erfolg zu haben. Wie gesagt bei OOP blicke ich noch nicht so durch. Danke VaporiZed, dass du mir geholfen hast :thumbsup:
    Bilder
    • 111.JPG

      25,81 kB, 239×454, 8 mal angesehen
    • 222.JPG

      31,83 kB, 268×674, 8 mal angesehen
    Puh, um Dir da weiterzuhelfen, bräuchte es ein konkretes Beispiel. So mit objekt_xyz und abc ist das alles ne Nummer zu abstrakt für mich.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ich habe noch etwas rumprobiert, und nun funktioniert mein Code wie gewünscht =)

    Der Knackpunkt lag daran, zu verstehen wo ich die Instanz der Klasse2 erstelle. --> Set objekt2 = New Klasse2 in Private Sub Class_Initialize() (bzw. ich hab die Erstellung der Instanz nun in eine eigene Funktion gepackt, damit funktioniert es wunderbar)

    VaporiZed du hast mir super geholfen. Danke nochmal und schönen Sonntag abend noch.