Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Klassen/Objekte zur Laufzeit entladen

Forumthread: Klassen/Objekte zur Laufzeit entladen

Klassen/Objekte zur Laufzeit entladen
09.07.2008 15:47:00
Christian
Folgende Situation:
Ich instanziere eine selbstgeschriebene Klasse "MyObj".

Dim MeinObjekt as MyObj
set MeinObjekt = new MyObj

Dabei wird eine Objektvariable "MeinObjekt" erstellt die dann das Objekt "MyObj" enthält.
Bis dahin funktioniert alles ganz toll.
Aber.. Wie bekomme ich "MeinObjekt" nun wieder aus dem Speicher!?!? Ich finde kein delete befehl.. "Unload" funktioniert auch nicht...
Es muss doch einen Weg geben wie ich zur Laufzeit den Speicher, der "MeinObjekt" einnimmt, wieder freigeben kann!!

Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Klassen/Objekte zur Laufzeit entladen
09.07.2008 15:51:36
Peter
Hallo Christian,
was ist mit MeinObjekt = Nothing ?
Gruß Peter

AW: Klassen/Objekte zur Laufzeit entladen
09.07.2008 15:57:13
Christian
Mit Set MeinObjekt = Nothing gibt man nicht den Speicher wieder frei sondern weisst die ObjektVariable "MeinObjekt" an kein Objekt zu beinhalten.
Der Speicher der mit (...) = new MyObj eingenommen wurde ist nach wie vor belegt.
Es muss also einen anderen weg geben.. ich kann mir jedenfalls nicht vorstellen, dass die Herrn Programmierer von WinzigWeich so dämlich waren keinen Befehl zur Wiederfreigabe von Speicher eingebaut haben...

Anzeige
AW: Klassen/Objekte zur Laufzeit entladen
09.07.2008 16:25:23
Johannes
Hallo Christian,
kurze und knappe Antwort: VB(A) (der interne Garbage Collector [wenn man das ueberhaupt so nennen darf]) gibt Objekte bzw. Speicher frei, wenn sie nicht mehr referenziert sind. Angeblich egal ob sie auf Nothing gesetzt sind, oder nicht.
Hier gibts Literatur ueber die Philosophie, wie und ob VBA Objekte im Speicher freigegeben werden (sollen):
http://tinyurl.com/cq95p
Gruesse,
Johannes

Anzeige
AW: Klassen/Objekte zur Laufzeit entladen
09.07.2008 16:48:00
Christian
Naja.. die scheinen sich wegen der Vorgehensweise auch nicht ganz einig zu sein...
Das was ich ursprünglich in eines meiner Programme implementieren wollte war eine verkettung von objekten...
Also wo in der Klasse z.B. folgendes steht:

.
.
public text as string
public NextObj as MyObj
.
.

und im Modul:

dim MeinObjekt as MyObj
dim AktuellesObj as MyObj
set MeinObjekt = new MyObj
set AktuellesObjekt = MeinObjekt
for i = 1 to 10
AktuellesObjekt.Text = "Ebene " & i
set AktuellesObjekt.NextObj = new MyObj
set AktuellesObjekt = AktuellesObjekt.NextObj
next

Dabei wird eine Kette von Objekten erstellt die jeweils eine Variable "Text" beinhalten. Also im Entferntesten ein Array. Vorteil liegt klar auf der Hand... Zur Laufzeit lassen sich so große datenmengen Dynamisch in den Speicher laden und bearbeiten. Zwar alles nur sequenziell aber für viele Anwendungen reicht das.
In diesem Beispiel werden 10 Ebenen erstellt. Also 10 Objekte erstellt die Speicher in beschlag nehmen.
Erhöht man die Zahl auf z.B. 30000 kann man im Taskmanager sehr schön sehen das der Speicherverbrauch von Excel deutlich zunimmt.
Nach beendigung des Makros gibt Excel eine Fehlermeldung raus das nicht genügen "Stapelspeicher" zur verfügung steht. Daher denke ich das Excel den Speicher NICHT wieder frei gibt und das besser manuell gemacht werden sollte.

Anzeige
AW: Klassen/Objekte zur Laufzeit entladen
09.07.2008 16:58:00
Johannes
Nichts anderes hab ich behauptet, als dass es Uneinigkeit darueber gibt. Wenn man der Philosphie glauben schenken magt, wird dein Speicher erst dann freigegeben, wenn das Elternobjekt nicht mehr referenziert wird - was natuerlich bei deinem Strukturvorhaben fatal ist.
Dann bleibt dir nichts anderes uebrig als auf die WinAPI auszuweichen und wie in C-Gewohnheiten malloc und free zu verwenden, siehe:
http://www.vbaccelerator.com/home/VB/Code/Techniques/Malloc_in_VB/article.asp
Viel Vergnuegen dabei! :-)
Gruesse,
Johannes

Anzeige
AW: Klassen/Objekte zur Laufzeit entladen
09.07.2008 17:03:00
Christian
Ja ok.. hmm.. ist echt schade das Winzigweich einem da mal wieder balken zwischen die beine wirft..
Ich werd mal schauen ob ich das per API hinbekomme...
Set ObjektVar = Nothing
"Hebt die Zuordnung von ObjektVar zu einem bestimmten Objekt auf. Durch Zuweisen von Nothing an ObjektVar werden alle Ressourcen des zuvor referenzierten Objekts freigegeben, sofern das Objekt von keiner anderen Variablen referenziert wird."
was ein mist... entschuldigt die ausdrucksweise.. aber warum können die nicht mal ansatzweise das vernünftig zuende denken was die anpacken...
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Klassen und Objekte in VBA korrekt verwalten


Schritt-für-Schritt-Anleitung

Um ein VBA-Objekt zu erstellen und korrekt zu verwalten, folge diesen Schritten:

  1. Klasse erstellen: Erstelle eine neue Klasse in deinem VBA-Projekt und nenne sie MyObj.
  2. Objektvariable deklarieren:
    Dim MeinObjekt As MyObj
  3. Objekt instanziieren:
    Set MeinObjekt = New MyObj
  4. Objekte verwenden: Du kannst jetzt mit MeinObjekt arbeiten und Eigenschaften oder Methoden verwenden.
  5. Objekt freigeben: Um den Speicher freizugeben, setze die Objektvariable auf Nothing:
    Set MeinObjekt = Nothing

Beachte, dass Set MeinObjekt = Nothing die Zuordnung des Objekts aufhebt, aber die Speicherkapazität nur freigegeben wird, wenn das Objekt nicht mehr referenziert wird.


Häufige Fehler und Lösungen

  • Fehler 1: Speicher wird nicht freigegeben: Wenn du das Objekt auf Nothing setzt, aber der Speicher nicht freigegeben wird, könnte es daran liegen, dass andere Variablen noch auf das Objekt verweisen. Stelle sicher, dass alle Referenzen auf das Objekt entfernt wurden.

  • Fehler 2: Fehlermeldung beim Beenden des Makros: Wenn du eine Fehlermeldung erhältst, dass nicht genügend "Stapelspeicher" vorhanden ist, könnte es daran liegen, dass zu viele Objekte gleichzeitig im Speicher aktiv sind. Versuche, die Anzahl der instanziierten Objekte zu reduzieren oder sie manuell freizugeben.


Alternative Methoden

Falls du die Speicherverwaltung in VBA weiter optimieren möchtest, kannst du die Windows API verwenden, um den Speicher manuell zu verwalten. Zum Beispiel:

Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long

Durch die Verwendung dieser Funktionen kannst du spezifische Speicherbereiche allokieren und freigeben, ähnlich wie in C.


Praktische Beispiele

Hier ein Beispiel, wie du eine verkettete Liste von Objekten erstellen kannst, um den Umgang mit dynamischen Daten zu zeigen:

Public Text As String
Public NextObj As MyObj

Sub CreateObjectChain()
    Dim MeinObjekt As MyObj
    Dim AktuellesObjekt As MyObj
    Set MeinObjekt = New MyObj
    Set AktuellesObjekt = MeinObjekt

    For i = 1 To 10
        AktuellesObjekt.Text = "Ebene " & i
        Set AktuellesObjekt.NextObj = New MyObj
        Set AktuellesObjekt = AktuellesObjekt.NextObj
    Next i

    ' Hier solltest du die Objekte freigeben
    Set AktuellesObjekt = Nothing
    Set MeinObjekt = Nothing
End Sub

In diesem Beispiel wird eine Kette von 10 Objekten erstellt, die jeweils einen Text enthalten. Achte darauf, die Objekte nach der Benutzung zu löschen.


Tipps für Profis

  • Verwende With-Blöcke, um die Lesbarkeit deines Codes zu verbessern und die Anzahl der benötigten Set-Anweisungen zu reduzieren.
  • Halte die Anzahl der gleichzeitig erstellten Objekte im Auge, um den Speicherverbrauch zu minimieren.
  • Nutze die Debugging-Tools in VBA, um den Speicherverbrauch während der Laufzeit zu überwachen.

FAQ: Häufige Fragen

1. Wie gebe ich den Speicher für Objekte in VBA korrekt frei?
Um den Speicher in VBA freizugeben, setze die Objektvariable auf Nothing, jedoch sollte sichergestellt werden, dass keine weiteren Referenzen auf das Objekt bestehen.

2. Gibt es eine Möglichkeit, Objekte in VBA zu deallokieren wie in C?
In VBA gibt es keinen direkten delete-Befehl wie in C, aber du kannst die Windows API verwenden, um den Speicher manuell zu verwalten, wenn nötig.

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