Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Klasse als Parameter übergeben

Forumthread: Klasse als Parameter übergeben

Klasse als Parameter übergeben
09.08.2007 11:16:06
Jan
Hallo zusammen,
folgendes System:
XP, Excel 2000, VBA 6
folgendes Problem:
ich habe eine Klasse namens "Risikoasset" und eine Klasse namens "Portfolio".
In der Klasse Portfolio sind unter anderem eine Sub-Routine namens "AddRisikoasset" sowie eine Collection "allMyRisikoassets" definiert. Die Routine sieht wie folgt aus:

Public Sub AddRisikoasset(asset_ as Risikoasset)
allMyRisikoassets.Add asset_
End Sub


Sobald ich aber versuche die Routine aufzurufen (egal ob aus Portfolio oder irgendeiner anderen Klasse heraus) und ihr ein tatsächliches Risikoasset-Objekt übergebe, bekomme ich die Fehlermeldung "Laufzeitfehler 438, Objekt unterstützt diese Eigenschaft oder Methode nicht".
Probier schon seit geraumer Zeit das hinzubekommen. Was übersehe ich hier? Ich könnte natürlich die Collection in einem normalen Modul Public deklarieren und dann die Risikoassets direkt hinzufügen, das funktioniert, aber ich würde das aus Encapsulation Gründen lieber innerhalb der Portfolio-Klasse belassen.
Besten Dank und beste Grüße,
Jan

Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Klasse als Parameter übergeben
09.08.2007 11:21:00
Peter
Hallo Jan,
kann es sein, dass Excel/VBA sich an dem Unterstrich am Ende von asset_ stört?
Gruß Peter

AW: Klasse als Parameter übergeben
09.08.2007 11:25:26
Jan
Daran liegts leider nicht. Den Unterstrich benutz ich immer um die übergebenen Variablen zu kennzeichnen. Das gibt nur Probleme wenn der am Anfang der Variable steht. Mittendrin oder am Schluss stört es Excel nicht.
Gruß,
Jan

Anzeige
AW: Klasse als Parameter übergeben
09.08.2007 11:26:00
Jan
sorry, hatte vergessen Frage noch offen auszuwählen

AW: Klasse als Parameter übergeben
09.08.2007 11:22:25
Ramses
Hallo
Klassen sind nun nicht gerade mein Fachgebiet.
Dies wird zu einer bestehenden Collection hinzugefügt, daher ein Schuss ins Blaue
Public Sub AddRisikoasset(asset_ as New Risikoasset)
Gruss Rainer

Anzeige
AW: Klasse als Parameter übergeben
09.08.2007 11:29:04
Jan
Das hilft leider auch nicht. Es scheint ein Problem mit der benutzerdefinierten Klasse generell zu sein. Hab gerade nochmal versucht die Risikoasset-Klasse in einen Variant zu packen und dann zu übergeben, aber schon bei der Zuweisung von Risikoasset an Variant fliegt VBA raus. Objektorientiert in VBA ist auf die Dauer schon ein bisschen nervig...
Gruß,
Jan

Anzeige
AW: Klasse als Parameter übergeben
09.08.2007 11:42:09
Jan
Oh Mann. Das ist wohl das absurdeste Problem überhaupt. Hab es jetzt hinbekommen. Man darf die AddRisikoasset Routine nicht mit dem Parameter in Klammern aufrufen, dann geht es. Also anstelle von:
myPortfolio.AddRisikoasset(myRisikoasset)
muss man:
myPortfolio.AddRisikoasset myRisikoasset
schreiben.
Das ist ja unglaublich. Was denken die sich eigentlich, wenn sie bei Microsoft ihre Syntax designen?!?
Beste Grüße,
Jan

Anzeige
AW: Klasse als Parameter übergeben
09.08.2007 12:10:00
Ramses
Hallo
Das hätte wirklich auch mir auffallen sollen :-)
"...Was denken die sich eigentlich, wenn sie bei Microsoft ihre Syntax designen?!?..."
Das ist korrekt
Erwartest du einen Rückgabewert dann muss das Argument in Klammern übergeben werden, wie bei einer Funktion, ansonsten werden die Parameter ohne Klammern übergeben
Option Explicit


Sub Test()
    'Das Ergebnis wird extern berechnet
    'und intern weiterverarbeitet
    'Daher die Übergabe in Klammern
    'Es wird ein Wert zurückgegbene
    If Test2(1) > 1 Then
        MsgBox Test2(1)
    End If
    'Das Ergebnis wird extern berechnet
    'aber extern weiterverarbeitet
    'Es wird kein Wert zurückgegeben
    Test3 1
End Sub

Function Test2(myWert As Integer)
    Test2 = myWert * 2
End Function

Function Test3(myWert As Integer)
    MsgBox myWert * 3
End Function

Gruss Rainer

Anzeige
AW: Klasse als Parameter übergeben
09.08.2007 12:20:00
Jan
Aha! Die Konvention war nicht bekannt. Mal unabhängig davon, finde ich sie aber auch nicht sonderlich sinnvoll. Führt m.E. zu schlechterer Lesbarkeit. Wenn ich mehrere Argumente übergebe wirds m.E. schnell unübersichtlich wenn man keine Klammern drumrum hat (von der asset_:=myRisikoasset-Variante mal ganz zu schweigen), aber gut. Hauptsache es geht :-)
Beste Grüße,
Jan

Anzeige
AW: Klasse als Parameter übergeben
09.08.2007 13:46:00
luschi
Hallo Jan,
oder Du rufst es so auf: Call myPortfolio.AddRisikoasset(myRisikoasset)
Da sind dann Klammern wieder erlaubt.
Gruß von Luschi
aus klein-Paris
;
Anzeige
Anzeige

Infobox / Tutorial

Klasse als Parameter übergeben in VBA


Schritt-für-Schritt-Anleitung

  1. Klasse erstellen: Erstelle eine Klasse namens Risikoasset in deinem VBA-Projekt.

  2. Portfolio-Klasse erstellen: Erstelle eine weitere Klasse namens Portfolio, die eine Collection für die Risikoassets enthält.

  3. Sub-Routine definieren: Definiere eine Sub-Routine in der Portfolio-Klasse, um Risikoassets hinzuzufügen:

    Public Sub AddRisikoasset(asset_ As Risikoasset)
       allMyRisikoassets.Add asset_
    End Sub
  4. Objekt übergeben: Wenn Du die Sub-Routine AddRisikoasset aufrufst, achte darauf, die Klammern wegzulassen:

    myPortfolio.AddRisikoasset myRisikoasset

    Alternativ kannst du die Routine auch so aufrufen:

    Call myPortfolio.AddRisikoasset(myRisikoasset)

Häufige Fehler und Lösungen

  • Laufzeitfehler 438: Dieser Fehler tritt auf, wenn Du die Sub-Routine mit Klammern aufrufst und ein Objekt übergibst. Stelle sicher, dass Du die Klammern weglässt, wenn Du einen Parameter übergibst.

  • Objekt unterstützt diese Eigenschaft oder Methode nicht: Überprüfe, ob die Klasse Risikoasset richtig definiert und instanziiert wurde. Ein neuer Versuch, die Klasse als Variant zu übergeben, ist ebenfalls nicht empfehlenswert.


Alternative Methoden

  • VBA Sub mehrere Parameter übergeben: Wenn Du mehrere Parameter übergeben möchtest, kannst Du die Sub-Routine wie folgt definieren:

    Public Sub AddRisikoasset(asset1 As Risikoasset, asset2 As Risikoasset)
       allMyRisikoassets.Add asset1
       allMyRisikoassets.Add asset2
    End Sub

    Der Aufruf erfolgt dann ebenfalls ohne Klammern:

    myPortfolio.AddRisikoasset myRisikoasset1, myRisikoasset2
  • VBS Parameter übergeben: Der Ansatz ist ähnlich, jedoch musst Du darauf achten, dass die Syntax in VBS leicht variieren kann.


Praktische Beispiele

Hier ist ein einfaches Beispiel, um zu zeigen, wie Du die Klassen in VBA nutzen kannst:

  1. Klassen instanziieren:

    Dim myPortfolio As Portfolio
    Dim myRisikoasset As Risikoasset
    
    Set myPortfolio = New Portfolio
    Set myRisikoasset = New Risikoasset
  2. Risikoasset hinzufügen:

    myPortfolio.AddRisikoasset myRisikoasset

Tipps für Profis

  • Nutze immer Option Explicit am Anfang deiner Module, um sicherzustellen, dass alle Variablen deklariert sind.
  • Achte darauf, dass Du die richtige Version von Excel verwendest. Die Tipps in diesem Artikel basieren auf Excel 2000 und VBA 6.
  • Experimentiere mit der Verwendung von Call, um die Lesbarkeit zu verbessern, vor allem bei mehreren Parametern.

FAQ: Häufige Fragen

1. Was passiert, wenn ich Parameter in Klammern übergebe?
Wenn Du Parameter in Klammern übergibst, erwartet VBA, dass die Sub-Routine einen Rückgabewert hat, was zu einem Fehler führt, wenn dies nicht der Fall ist.

2. Wie kann ich Fehler bei der Parameterübergabe vermeiden?
Stelle sicher, dass alle Klassen und Objekte korrekt definiert und instanziiert sind, und vermeide Klammern beim Aufruf von Sub-Routinen ohne Rückgabewert.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige