Office: Instanzen von selbst erstellten Klassen

Helfe beim Thema Instanzen von selbst erstellten Klassen in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallo, ich habe ein Excelprojekt mit ca. 10 selbsterstellten Klassen. Bei der Arbeit mit meinem Excelprojekt werden Instanzen dieser Klassen sehr oft... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von Ulukaii1983, 2. August 2010.

  1. Instanzen von selbst erstellten Klassen


    Hallo,

    ich habe ein Excelprojekt mit ca. 10 selbsterstellten Klassen.
    Bei der Arbeit mit meinem Excelprojekt werden Instanzen dieser Klassen sehr oft aufgerufen und wieder geschlossen - auch Arrays davon.
    Ich habe hier im Forum gelesen, dass Instanzen von selbst erstellten Klassen nicht automatisch aus dem Speicher gelöscht werden. Also versuche ich, am Ende eines jeden meiner Module so etwas stehen zu haben:

    Set oEinAuto = nothing

    Trotzdem sagen mir meine Nutzer, dass nach ca. 2-3 Stunden Arbeit mit meinem Excelobjekt die Fehlermeldung ("Die Anweisung 0x000... verweist auf...") kommt.
    Ich vermute, das hängt damit zusammen, dass nicht alle Instanzen meiner Klassen vernünftig beendet werden. Nun meine Fragen:

    Gibt es in VBA ein Möglichkeit, an diesen Speicher heranzukommen und diesen freizugeben, außer wie oben beschrieben?

    Wie verhält es sich, wennich die Instanzen als Parameter an Unterprozeduren übergebe? Ungefähr So:

    Sub Hauptprozedur()

    Dim oMeinAuto as New clsEinAuto
    Dim oWerkstatt as new clsWerkstatt

    Call oWerkstatt.Repariere(oMeinAuto)

    Set oMeinAuto = Nothing
    Set oWerkstatt = Nothing

    End Sub


    Muss ich dann in der Repariere-Methode von clsWerkstatt ebenfalls set oMeinAuto = Nothing reinschreiben?

    Gruß & Vielen Dank

    :)
     
    Ulukaii1983, 2. August 2010
    #1
  2. Hallo Ulukaii1983,

    mir ist in VBA keine andere Möglichkeit, außer über Set oMeinAuto = Nothing bekannt, Speicher von Objektvariablen wieder freizugeben, bzw. zu prüfen, ob noch Speicher für Objektvariablen reserviert ist. Möglicherweise ist da per Windows-API etwas zu machen, keine Ahnung.

    Bei Unterprozeduren kommt es darauf an, ob die (Objekt-)Variablen per ByVal oder ByRef übergeben werden. Eine Übergabe per ByVal erzeugt eine eigenständige Instanz der Objektvariablen innerhalb der aufgerufenen Unterprozedur und muss daher auch separat wieder freigegeben werden. Eine Übergabe ByRef erzeugt keine eigenständige Instanz, es wird lediglich ein Verweis auf die Instanz der Hauptprozedur übergeben. Hier muss dann auch nichts separat freigegeben werden. Standardmäßig - ohne Angabe von ByVal oder ByRef - wird ByRef übergeben, d.h. nur ein Verweis auf die Instanz innerhalb der Hauptprozedur, keine weitere Instanz.

    Gruß Ingolf
     
  3. Hallo Ingolf,

    vielen Dank für deine Antwort.
    Da bleibt mir wohl nichts anderes übrig, als den gesamten Code zu durchforsten und zu gucken, ob irgendwo ein Set X = Nothing fehlt.
    Ich übergebe meine Objekte standardmäßig byRef!

    Gruß
     
    Ulukaii1983, 4. August 2010
    #3
  4. Instanzen von selbst erstellten Klassen

    PS:

    Ich glaube, dass die Anweisung Set X = Nothing in einer Unterprozedur nicht nur den Verweis auf das Objekt, sondern das Objekt selbst löscht!

    Habe das gerade ausprobiert, und wenn ich Set X = nothing in eine Subroutine schreibe und X byRef übergeben wurde, dann wird das Terminate-Ereignis der der Klasse ausgelöst.

    Sehr komisch! Vielleicht hat noch jemand einen Link, wo man sich noch ein wenig mehr einlesen kann?
     
    Ulukaii1983, 4. August 2010
    #4
  5. Hallo Ulukaii1983,

    Set xy = Nothing ist eine Methode, mit der Objekte gelöscht werden. Mit dieser Methode greifst du logischerweise immer auf das Objekt selbst zu. Um einen Verweis löschen zu können, müsste es dafür eine eigenständige Methode geben. Die gibt es aber nicht, oder ich kenne sie zumindest nicht. Jedenfalls gehe ich davon aus, dass VBA die Verweise ByRef übergebener Objekte intern löscht, sobald die betreffende Unterprozedur beendet wird.

    Gruß Ingolf
     
  6. thx!!!
     
    Ulukaii1983, 5. August 2010
    #6
  7. Hallo,

    1. Objekte können nur als Referenz übergeben werden.
    2. Wenn du in den Klassen Veweise auf Objekte hast, wie z.B. in Event-Klassen, solltest du diese Objekte im Terminate-Event der Klasse auch löschen. Beispiel:

    ' **********************************************************************
    ' Modul: cldTextbox Typ: Klassenmodul
    ' **********************************************************************

    Option Explicit

    Private WithEvents mobjTextbox As MSForms.TextBox

    Friend Property Set SetTextbox(objTextbox As MSForms.TextBox)
    Set mobjTextbox = objTextbox
    End Property

    Private Sub Class_Terminate()
    Set mobjTextbox = Nothing
    End Sub
     
    Nepumuk, 5. August 2010
    #7
  8. Instanzen von selbst erstellten Klassen

    "Man kann mit einem expliziten Nothing setzen, nichts beschleunigen, was nicht ohnehin automatisch passiert."
    vb-hellfire visual basic faq

    Beim Terminate wird das Objekt automatisch gelöscht.
     
Thema:

Instanzen von selbst erstellten Klassen

Die Seite wird geladen...
  1. Instanzen von selbst erstellten Klassen - Similar Threads - Instanzen erstellten Klassen

  2. Handling mehrerer Word-Instanzen

    in Microsoft Word Hilfe
    Handling mehrerer Word-Instanzen: Hallo zusammen, ich habe ein Problem, bei dem ich einfach nicht weiterkomme. Zusammenfassung: Es gibt eine Dokumentenvorlage, auf Basis derer CV's der Mitarbeiter erstellt werden können. Erstelle...
  3. Excel öffnet 2.-3. Datei usw. nur in neuen Instanzen

    in Microsoft Excel Hilfe
    Excel öffnet 2.-3. Datei usw. nur in neuen Instanzen: Liebe Commune, ich arbeite so gut wie immer in unterschiedlichen Excel-Instanzen, Angewohnheit, mehrere Monitore. Dieses habe ich stets leger via Strg.+Icon angestoßen. Jetzt ist es aber bei mir...
  4. Alle offenen Word instanzen schließen

    in Microsoft Excel Hilfe
    Alle offenen Word instanzen schließen: Hallo zusammen, steh mal wieder auf dem Schlauch und brauch eurer Unterstützung Also Ich erzeuge aus Excel heraus Briefe (Word), druck diese und speichere diese als PDF das klappt soweit Ich...
  5. Öffnen einer zweiten Arbeitsmappe in einer anderen Instanz von Excel

    in Microsoft Excel Tutorials
    Öffnen einer zweiten Arbeitsmappe in einer anderen Instanz von Excel: Öffnen einer zweiten Arbeitsmappe in einer anderen Instanz von Excel Excel 2013 Mehr... Weniger Wenn Sie...
  6. "Nur Werte" aus anderer Excel Instanz einfügen

    in Microsoft Excel Hilfe
    "Nur Werte" aus anderer Excel Instanz einfügen: Ich habe in Excel 2010 öfter die Aufgabenstellung, Werte aus einem anderen oder dem gleiche Arbeitsblatt ohne Formatierung einzufügen. Mein üblicher Weg ist es, die Werte einzufügen und dann aus...
  7. Word-Instanzen sauber beenden

    in Microsoft Access Hilfe
    Word-Instanzen sauber beenden: Aus access 210 erzeuge ich seinen serienbrief mit eine Excel-Datenquelle Code: Option Explicit Private Const strDatenQuelle As String = "O:PraktserieDatenprakt.xlsx" Private Const strWOrdvorlage...
  8. VBA - Macro in Instanz 1 wartet bis macro in Instanz 2 fertig ist - WARUM ?

    in Microsoft Excel Hilfe
    VBA - Macro in Instanz 1 wartet bis macro in Instanz 2 fertig ist - WARUM ?: Hallo zusammen, ich teste gerade wie man in Excel zwei Instanzen nutzen kann. Was ohne Probleme klappt ist eine weitere Instanz zu öffnen und ein entsprechendes Workbook zu laden. In dem zweiten...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden