Set = Nothing

.. das wohl mächtigste Werkzeug in Bill Gates' Büro-Sippe. Ob reine Formeln, PowerQuery oder VBA. Hier bleiben kaum Wünsche unerfüllt.
Benutzeravatar
d'r Bastler
Beiträge: 832
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 224 Mal
Danksagung erhalten: 119 Mal

Set = Nothing

#1

Beitrag von d'r Bastler »

Moin allerseits!

Jede gute Sub endet mit dem Freigeben der Objekte: Set Objekt = Nothing. Das können manchmal sehr viele sein und damit viel Schreiberei. Hier eine alternative Lösung, die auch im VBA anderer Apps funktioniert:

Code: Alles auswählen

'Aufruf am Ende der Sub:
Call SetObjectsToNothing(Me)

Code: Alles auswählen

Sub SetObjectsToNothing(oSub As Object)
Dim oObj As Object
    For Each oObj In oSub
        If VarType(oObj) = vbObject Then
            Set oObj = Nothing
        End If
    Next oObj
End Sub
Das Dingen legt man sich in seine PERSONAL.XLSB oder in ein Allg.Modul einer Mappe und spart so viel Getippse.

Viel Spaß damit! und schöne Grüße!
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
knobbi38
Beiträge: 25
Registriert: 20. Okt 2024, 14:15
Hat sich bedankt: 2 Mal
Danksagung erhalten: 19 Mal
Kontaktdaten:

Re: Set = Nothing

#2

Beitrag von knobbi38 »

Hallo,

nur mal so am Rande ...

Die explizite Zuweisung von Nothing an die Referenzvariable ist am Ende überhaupt nicht notwendig und führt u.U. nur zu einer Verschlechterung der Performance, denn in VBA wird beim Verlassen des Scopes, also der Sub, die Referenzvariable eh gelöscht. Mit der Zuweisung ist das dann eigentlich nur doppelt gemoppelt. Das so eine Zuweisung am Ende der Sub trotzdem gemacht wird, dient in erster Linie nur der Übersicht und besseren Lesbarkeit. Etwas anderes ist es, wenn man innerhalb des Codes eine Referenz auf Nothing setzt um zu Kennzeichnen, daß ab dieser Zuweisung die Referenzvariable ungültig ist. Das wird zum Beispiel sehr oft in Excel benötigt.

Viel wichtiger hingegen ist es, wenn man selber Ressourcen belegt hat, diese auch vor dem Ende der Sub explizit wieder freizugeben. Ein sicheres Indiz dafür ist z.B., wenn das angesprochene Objekt über eine Close/Dispose Methode oder ähnlich verfügt.

Bestes Beispiel dafür ist z.B. ein Recordset-Objekt, welches vom Code geöffnet und geschlossen werden sollte, bevor die Referenz darauf mit Nothing gelöscht wird.

Gruß
Knobbi38
Folgende Benutzer bedankten sich beim Autor knobbi38 für den Beitrag (Insgesamt 2):
d'r Bastler, thowe
Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste