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

Forumthread: VBA - Userform löschen

VBA - Userform löschen
Bernhard
Hallo Profis,
ich bin auf ein Problem bezüglich dynamischer Userforms gestoßen.
Das Problem habe ich in folgendem Code zusammengefaßt.

Sub test()
Set frmTemp = ThisWorkbook.VBProject.VBComponents.Add(3)
frmTemp.Properties("Name") = "frmTest"
With ThisWorkbook.VBProject
.VBComponents.Remove .VBComponents(frmTemp.Name)
End With
ThisWorkbook.Save
Set frmTemp = ThisWorkbook.VBProject.VBComponents.Add(3)
frmTemp.Properties("Name") = "frmTest"      'Path/File access error
End Sub


Es wird eine Userform angelegt, später gelöscht, und dann wieder angelegt.
Das Löschen funktioniert scheinbar auch, die Userform ist weg.
Nun funktionert das neuerliche Anlegen der Userform aber nur, wenn die Datei zwischendurch gespeichert wird.
ThisWorkbook.Save
Das möchte ich aber nicht, da es an dieser Stelle nicht nötig ist.
Ohne das Speichern kommt es aber in der letzten Zeile zum Fehler der im Kommentar steht.
Offenbar greift das Remove nicht komlett durch.
Ich habe (auch hier im Forum) nach Lösungen gesucht und etliches ausprobiert -> kein Erfolg.
Hat da jemand einen Tip?
Besten Dank
BCM

Anzeige
AW: VBA - Userform löschen
03.07.2009 13:19:17
Tino
Hallo,
ich würde sagen das geht nicht, dies ist auch nicht von Hand möglich.
Warum muss man eine Userform immer wieder löschen und neu erstellen?
Gruß Tino
AW: VBA - Userform löschen
03.07.2009 13:31:43
BCM
Hallo Tino,
in dieser Form passiert das auch nicht.
Im Projekt wird die Userform dynamisch erzeugt und sieht dabei jedesmal anders aus, das hängt von der aktiven Arbeitsmappe ab.
Nachdem die Userform geschlossen wird soll sie wirkungsvoll gelöscht werden um bei einem neuerlichen Aufruf neu (und diesmal anders) wieder aufgebaut zu werden.
Das Löschen funktioniert ja auch, nur hängt offenbar noch irgendwo im Hintergrund der Name der Userform als vergeben herum. Das wird dann scheinbar erst beim Speichern der Datei, in der der Code liegt, bereinigt.
Und das sollte ja auch anders funktionieren als über ein in diesem Moment nicht sinnvolles Speichern.
lG
BCM
Anzeige
wie schon geschrieben...
03.07.2009 13:53:36
Tino
Hallo,
geht von Hand auch nicht.
Teste dies doch mal,erstelle zwei UF lösche die erste und versuche mal der zweiten den Namen der gelöschten ersten zu geben.
Gruß Tino
AW: wie schon geschrieben...
03.07.2009 16:51:05
Bernhard
Hallo Tino,
ja, schon klar, aber wieso bereinigt einfaches Speichern das Problem?
Nicht einmal schließen und neu öffnen ist notwendig.
Versuchs mal. Einfach nach dem Löschen der ersten Userform die Datei speichern und danach die 2. Userform umbenennen.
Die Frage ist, ob die Routine, die beim Speichern offenbar den Speicher von diesen Resten befreit, nicht auch direkt ansprechbar ist.
lG
BCM
Anzeige
AW: VBA - Userform löschen
03.07.2009 13:31:48
fcs
Hallo BCM,
ich bin nicht unbedingt der Freund solcher dynamischer UF.
Auf alle Fälle sollte jedes Schließen des dyn. UF vor dem Löschen auch mit einem

Unload Me 


verbunden sein. Dadurch werden alle flüchtigen UF-Informationen aus dem Arbeitsspeicher gelöscht.
Und warum stört das Speichern, um verschieden Informationen, die Excel bei der Bearbeitung sammelt zurückzusetzen? Außer es dauert extrem lange oder Daten nicht immer gleich gespeichert und ggf. verworfen werden. Dann in einer Arbeitskopie arbeiten, deren Daten dann ggf. vor dem Schließen in das Original zurückgespeichert werden.
Gruß
Franz

Anzeige
AW: VBA - Userform löschen
03.07.2009 13:36:31
BCM
Hallo Franz,
da die Userform jedesmal anders aussieht sollte sie jedesmal komplett neu generiert werden.
Und genau die Zeitverzögerung beim Speichern stört.
Unload Me bringt auch nichts.
Danke+lG
BCM
AW: VBA - Userform löschen
03.07.2009 13:44:44
Jogy
Hi.
Wieso löschst Du nicht einfach alle Controls auf der UserForm und erstellst die dann neu (und paßt ggf. noch die Größe der UF an)? So hast Du auch Dein dynamisches Verhalten.
Gruss, Jogy
Anzeige
AW: VBA - Userform löschen
03.07.2009 16:59:35
Bernhard
Hallo Jogy,
das wäre natürlich eine Möglichkeit.
Obwohl das bei uns bezüglich Weitergabe des Codes ein wenig umständlicher wäre. Reiner Code ist ja in 2 Sekunden verschickt; jeder baut sich das dann in seine eigene Toolsammlung ein wie er will.
Mit statischer Userform muß man exportieren, zippen (solche Dateien werden sonst in unserem Mailsystem konsequent eliminiert), entpacken, importieren .....
Wenn man faul ist ...... :-)
Interessiert mich einfach wieso das nicht gehen soll, vor allem da es ein dezidiertes Remove gibt.
Aber Deine Idee hat was.
Danke&lG
Bernhard
Anzeige
AW: VBA - Userform löschen
03.07.2009 13:42:56
Rudi
Hallo,
warum gibst du der UF überhaupt einen Namen? Du kannst doch mit dem Objekt arbeiten.

Sub test()
Set frmTemp = ThisWorkbook.VBProject.VBComponents.Add(3)
With ThisWorkbook.VBProject
.VBComponents.Remove frmTemp
End With
Set frmTemp = ThisWorkbook.VBProject.VBComponents.Add(3)
End Sub


Gruß
Rudi

Anzeige
AW: VBA - Userform löschen
03.07.2009 17:02:47
Tino
Hallo,
warum dies so ist weis ich auch nicht und warum Excel z. Bsp. nach dem löschen der Userform1 und neu erstellen einer Userform auch wieder den Namen Userform1 vergeben kann (ohne speichern) weis ich auch nicht.
Aber wie ist es mit dem Tipp von Rudi, der geht auch ohne speichern.
Gruß Tino
Anzeige
sorry Rudi, sollte zu Bernhard oT.
03.07.2009 17:23:51
Tino
AW: VBA - Userform löschen
03.07.2009 17:25:50
Bernhard
Hallo Rudi,
natürlich, da bringst Du mich auf was!
Ich habs gerade in meiner Konfiguration getestet, das Remove kann ich nämlich nicht direkt in den generierenden Code einbauen, sonder muß es ins Terminate-Ereignis der UserForm einbinden (da ich die Userform Modeless öffne).
Zu diesem Zeitpunkt steht frmTemp natürlich nicht mehr zur Verfügung, aber mit

Private Sub UserForm_Terminate()
With ThisWorkbook.VBProject
.VBComponents.Remove .VBComponents(Me.Name)
End With
End Sub


funktioniert es!
Erstaunlicherweise legt jetzt Excel immer wieder eine UserForm1 an, ohne zwischenspeichern etc.
Wieso es mit Name nicht auch so funktioniert ist mir zwar noch immer nicht ganz klar, aber wenns so geht ists mir auch recht.
Besten Dank
BCM

Anzeige
Danke allen
03.07.2009 17:28:25
Bernhard
allen voran Rudi für die Bemühungen, Problem gelöst :-)
Schönes WE
BCM
;
Anzeige
Anzeige

Infobox / Tutorial

Dynamisches Erstellen und Löschen von Userforms mit VBA


Schritt-für-Schritt-Anleitung

  1. Userform erstellen: Du kannst eine dynamische Userform in VBA erstellen, indem du folgenden Code verwendest:

    Sub test()
       Set frmTemp = ThisWorkbook.VBProject.VBComponents.Add(3) ' 3 steht für UserForm
       frmTemp.Properties("Name") = "frmTest"
    End Sub
  2. Userform löschen: Um die Userform zu löschen, füge folgendes hinzu:

    With ThisWorkbook.VBProject
       .VBComponents.Remove .VBComponents(frmTemp.Name)
    End With
  3. Userform erneut erstellen: Wenn du die Userform wieder erstellen möchtest, musst du sicherstellen, dass die vorherige Userform korrekt gelöscht wurde. Dies kann manchmal nur durch Speichern der Arbeitsmappe geschehen:

    ThisWorkbook.Save
    Set frmTemp = ThisWorkbook.VBProject.VBComponents.Add(3)
  4. Fehlerbehandlung: Stelle sicher, dass du die Userform entlädst, bevor du sie löschst. Das kannst du mit Unload Me machen.

    Unload Me

Häufige Fehler und Lösungen

  • Fehler bei der erneuten Benennung: Wenn du nach dem Löschen einer Userform versuchst, eine neue Userform mit dem gleichen Namen zu erstellen, kann es zu einem Fehler kommen. Dies geschieht häufig, wenn Excel noch Referenzen auf die gelöschte Userform hat. Oft hilft es, die Datei zwischenzeitlich zu speichern.

  • Dynamische Userforms: Bei dynamisch generierten Userforms kann es sein, dass Excel die Referenzen nicht richtig bereinigt. Dies kann zum Beispiel durch das Einfügen der Löschroutine in das Terminate-Ereignis der Userform gelöst werden.


Alternative Methoden

Eine alternative Methode zum Löschen von Userforms besteht darin, alle Steuerelemente der Userform abzurufen und sie zu löschen, anstatt die Userform selbst zu entfernen. Dies kann den Code übersichtlicher machen und die Erstellung neuer Userforms vereinfachen.

Sub ClearUserForm(frm As UserForm)
    Dim ctrl As Control
    For Each ctrl In frm.Controls
        frm.Controls.Remove ctrl.Name
    Next ctrl
End Sub

Praktische Beispiele

Hier ist ein einfaches Beispiel, wie du eine Userform dynamisch erstellen und löschen kannst:

Sub ManageUserForm()
    Dim frmTemp As Object
    Set frmTemp = ThisWorkbook.VBProject.VBComponents.Add(3) ' UserForm
    frmTemp.Properties("Name") = "frmDynamic"

    ' Userform öffnen und verwenden
    ' ...

    ' Userform löschen
    Unload frmTemp
    ThisWorkbook.VBProject.VBComponents.Remove frmTemp
End Sub

Tipps für Profis

  • Modales vs. Modelless: Achte darauf, ob du die Userform modal oder modeless öffnest. Dies kann Auswirkungen auf die Art und Weise haben, wie du die Userform verwaltest.

  • Verwendung von Unload Me: Vergiss nicht, Unload Me zu verwenden, um sicherzustellen, dass alle Referenzen auf die Userform gelöscht werden, bevor du sie entfernst.

  • Vermeide unnötiges Speichern: Wenn du dynamische Userforms verwendest, überlege dir, ob du die Userform tatsächlich löschen und neu erstellen musst oder ob du sie nicht einfach anpassen kannst.


FAQ: Häufige Fragen

1. Warum muss ich die Datei speichern, um die Userform korrekt zu löschen? Es scheint, dass Excel beim Speichern interne Referenzen bereinigt, die beim Löschen einer Userform bestehen bleiben können. Dies ist ein häufiges Problem bei dynamischen Userforms.

2. Gibt es eine Möglichkeit, die Userform ohne Speichern zu löschen? Ja, eine Möglichkeit besteht darin, die Löschroutine im Terminate-Ereignis der Userform zu implementieren. Dadurch wird die Userform automatisch entfernt, wenn sie geschlossen wird.

3. Kann ich die Userform auch ohne Namen erstellen? Ja, du kannst mit dem Objekt arbeiten, ohne der Userform einen Namen zu geben. Dies kann den Code vereinfachen und Probleme mit Namenskonflikten vermeiden.

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