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

Forumthread: Set = Nothing ?

Set = Nothing ?
26.08.2008 11:07:46
WolfgangN
Hallo,
ich habe ein Makro, das bei Beginn eines neuen Jahres (Eintrag Jan.) eine neue Reihe im Diagramm anlegt. Ich habe es natürlich getestet und es klappt auch. Es sind 15 Diagramme die ausgeführt werden.
Im Makro wird mit Set objChart das Diagramm gesetzt. Ich möchte jetzt gerne wissen, ob es notwendig ist den Befehl Set objChart = Nothing ausführen zulassen. Was passiert, wenn ich den Befehl weglasse?
Sollte der Befehl am Ende eines jeden Diagramms ausgeführt werden, oder reicht es den Befehl am Ende des Makros auszuführen?
Hier ein Auszug aus dem Makto. Es beginnt natürlich mit Option Explicit.
Vielen Dank
Wolfgang
'Wenn in Spalte G = Jan.
If Left(dat1, 4) = "Jan." Then
'für den Datenbereich der neuen Datenreihe,
mn = letzteG
'Gesmatkosten:
'Kontolle, ob Datenreihe des Jahres schon existiert,
Set objChart = ActiveSheet.ChartObjects("Diagramm1")
With objChart.Chart
For iReihe = 1 To .SeriesCollection.Count
'Wenn neue Datenreihe schon vorhanden dann Bol = True,
If objChart.Chart.SeriesCollection(iReihe).Name = khg Then Bol = True
Next
End With
If Bol = False Then
With objChart.Chart.SeriesCollection.NewSeries
.Name = khg
.Values = ActiveSheet.Range("P" & mn & ":P" & mn + 11)
End With
End If
Bol = False
'Gesamtkosten pro Tag:
'Kontolle, ob Datenreihe des Jahres schon existiert,
Set objChart = ActiveSheet.ChartObjects("Diagramm5")
With objChart.Chart
For iReihe = 1 To .SeriesCollection.Count
'Wenn neue Datenreihe schon vorhanden dann Bol = True,
If objChart.Chart.SeriesCollection(iReihe).Name = khg Then Bol = True
Next
End With
If Bol = False Then
With objChart.Chart.SeriesCollection.NewSeries
.Name = khg
.Values = ActiveSheet.Range("R" & mn & ":R" & mn + 11)
End With
End If
Bol = False
Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Set = Nothing ?
26.08.2008 12:49:00
Ramses
Hallo
Aufgrund deines bisherigen Codes muss gesagt werden, dass VOR jedem neuen Diagramm das Object auf "Nothing" gestellt werden SOLLTE.
Sollte deswegen, weil u.U. bei der Neuinitialisierung des nächsten Diagrammes auf das "objChar" was schief gehen kann und alle weiteren Anweisungen immer noch auf das zuerst zugewiesene Object verweisen.
Aus Gründen der Programmkorrektheit sollten die Objekte am Schluss wieder zurückgesetzt werden,... allerdings verlieren die gesetzten Objecte sowieso ihre Gültigkeit,.... lediglich der Speicher wird immer noch belegt. Aber in Zeiten von 4 GB Arbeitsspeicher tut das auch nicht mehr viel zur Sache :-)
Bei Outlook habe ich festgestellt, wenn die Set-Objecte nicht zurückgesetzt werden, dass Outlook sich dann irgendwann im Speicher verirrt und ein grösserer Schleifencode nicht mehr richtig verarbeitet wird.
Daher setze ich z.B. am Ende einer Schleife die Set-Objecte grundsätzlich auf "Nothing"
Gruss Rainer
Anzeige
AW: Set = Nothing ?
26.08.2008 13:00:00
Hajo_Zi
Hallo Rainer,
ich habe aber auch schon öffters im Forum gelesen, das bei nicht nothging der Code noch im VBA Editor angezeigt wird, obwohl Datei zu.

AW: Set = Nothing ?
26.08.2008 13:40:36
WolfgangN
Vielen Dank Rainer und Hajo,
ich werde bei allen Diagrammen jeweils am Ende Set=Nothing einsetzen, also nochmals Danke.
Gruß
Wolfgang
Anzeige
AW: Set = Nothing ?
26.08.2008 13:37:39
Gerd
Hallo zusammen!
lediglich der Speicher wird immer noch belegt (nach Ablauf der Gültigkeit der Objektvariable?)
Mir geht es nicht um Widerspruch. Schlüssige Literatur habe ich zu diesem Aspekt nicht gefunden.
Gibt es in diesem Punkt eventuell Unterschiede, worauf sich die Objektvariable bezieht, Range, Steuerelement, Userform, Klasse?
Ich stelle die Frage mal auf offen.
Grüße Gerd
Anzeige
AW: Set = Nothing ? offen!
26.08.2008 13:47:26
Gerd
.
AW: Set = Nothing ?
26.08.2008 13:51:06
WolfgangN
Hallo Gerd,
Danke für Deine Antwort.
Ich werde jetzt sicherheitshalber für alle Set Anweisungen am Schluß Set = Nothing einbauen.
Unterschiede worauf sich die Objektvariable bezieht besteht nur im unterschiedlichen Range Bereich.
Gruß
Wolfgang
AW: Set = Nothing ?
26.08.2008 15:34:00
Gerd
Hallo,
nach langer Suche, habe ich jetzt doch noch - eine zumindest für mich - verllässliche Aussage gefunden.
Grüße Gerd
https://www.herber.de/forum/archiv/888to892/t888676.htm
Hallo Renee,
so gibt das genauso einen Fehler, denn die Methode muss ja erst mal angewendet werden, bevor sie ausgewertet werden kann. Du muss da genauso mit Set ... arbeiten.
"Und noch was, Objektvariable die nicht auf eine Klasse deuten müssen nicht zurückgesetzt werden. Denn wenn die Prozedur beendet wird, dann wird der Speicher wieder freigegeben. Nur Klassen sind
speicherresistent und müssen freigegeben werden."
Außerdem, einen Objektvariable ist ja nur ein Pointer der auf das Objekt im Stackframe zeigt. Beinhaltet also lediglich die Speicheradresse. Das ist eine Zahl vom Typ Long und benötigt damit gerade mal 4 Byte.
Gruß
Nepumuk
Anzeige
AW: Set = Nothing ?
26.08.2008 15:42:00
WolfgangN
Hallo Gerd,
wenn ich es richtig verstanden habe muß ich nun doch nicht Set=Nothing anwenden?
Naja der Aufwand Set=Nothing einzusetzen ist ja nicht groß. Ich habe dies jetzt getan, ist ja nicht falsch nur eventuell nicht erforderlich.
Danke für Dein Interesse.
Gruß
Wolfgang
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

Setzen von Objekten auf Nichts in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Declare die Objekte: Beginne mit dem Deklarieren der Objekte, die Du verwenden möchtest. Zum Beispiel:

    Dim objChart As ChartObject
  2. Setze das Objekt: Weise das Objekt wie folgt zu:

    Set objChart = ActiveSheet.ChartObjects("Diagramm1")
  3. Verwende das Objekt: Führe die notwendigen Aktionen mit dem Objekt durch. Zum Beispiel, um eine neue Datenreihe hinzuzufügen:

    With objChart.Chart
        ' Deine Logik hier
    End With
  4. Setze das Objekt auf Nichts: Am Ende der Verwendung solltest Du das Objekt zurücksetzen:

    Set objChart = Nothing
  5. Wiederhole für weitere Objekte: Wenn Du mehrere Diagramme oder andere Objekte verwendest, wiederhole den Vorgang.


Häufige Fehler und Lösungen

  • Problem: Das Objekt bleibt im Speicher, auch wenn es nicht mehr benötigt wird.

    • Lösung: Setze das Objekt explizit auf Nothing, um sicherzustellen, dass der Speicher freigegeben wird.
  • Problem: Fehlermeldungen, wenn das Objekt erneut verwendet wird.

    • Lösung: Stelle sicher, dass Du das Objekt vor der erneuten Zuweisung auf Nothing setzt.

Alternative Methoden

  • Verwendung von With-Blöcken: Du kannst With-Blöcke verwenden, um den Code lesbarer zu gestalten und die Notwendigkeit von Set = Nothing zu minimieren:

    With ActiveSheet.ChartObjects("Diagramm1")
        ' Code hier
    End With
  • Objekte in Arrays speichern: Wenn Du mit mehreren Objekten arbeitest, kannst Du diese in ein Array speichern und am Ende der Schleife auf Nothing setzen.


Praktische Beispiele

Hier ist ein Beispiel, wie Du mehrere Diagramme in einer Schleife verwalten kannst:

Dim objChart As ChartObject
Dim i As Integer

For i = 1 To 5
    Set objChart = ActiveSheet.ChartObjects("Diagramm" & i)
    With objChart.Chart
        ' Deine Logik hier
    End With
    Set objChart = Nothing ' Wichtig, um den Speicher freizugeben
Next i

Tipps für Profis

  • Verwenden von Option Explicit: Stelle sicher, dass Du Option Explicit am Anfang jedes Moduls verwendest, um Typfehler zu vermeiden.
  • Korrektheit der Objekte: Überprüfe immer, ob das Objekt existiert, bevor Du es verwendest, um Laufzeitfehler zu vermeiden.
  • Speicherverwaltung: Auch wenn moderne Computer ausreichend RAM haben, ist es eine gute Praxis, nicht mehr Speicher zu belegen als nötig.

FAQ: Häufige Fragen

1. Warum sollte ich Set = Nothing verwenden?
Das Setzen von Objekten auf Nothing hilft, den Speicher freizugeben und potenzielle Fehler durch ungenutzte Objekte zu vermeiden.

2. Ist es immer notwendig, Set = Nothing zu verwenden?
Es ist nicht zwingend erforderlich, aber es ist eine gute Programmierpraxis, insbesondere bei umfangreichen Makros oder vielen Objekten.

3. Was passiert, wenn ich Set = Nothing weglasse?
Wenn Du es weglässt, bleibt der Speicher belegt, bis die Prozedur abgeschlossen ist, was zu einer ineffizienten Speichernutzung führen kann.

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