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

unload me, werd noch wahnsinnig

Forumthread: unload me, werd noch wahnsinnig

unload me, werd noch wahnsinnig
stev
folgendes problem:
hauptuserform:
frmhauptuserform.hide
frmuserform1.show
userform1(query_close)
unload userform1
hauptuserform.show
selber code im ende_knopf
problem:
funktioniert genau einmal, beim 2. mal wird userform1 nicht mehr entladen
jetzt hab ich nur experimentiert mit unload me statt unload userform1 nun wird userform1
überhaupt nicht mehr entladen
ich fummle nun schon seit 3 stunden mit 2 zeilen code, und drehe bald durch...
selbige prozedur wiederholt sich dann, wenn von userform1 aus userform2 geladen wird
und so weiter auf anderen "zweigen".
noch etwas ist mir aufgefallen, wenn ich mein programm starte wird machmal nicht die
mappe geöffnet sondern nur excel ohne alles.
ich kann nicht mehr vielleicht weis einer was?!
gruß
Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: unload me, werd noch wahnsinnig
12.02.2011 23:18:22
stev
hi,
dachte ich auch schon dran, aber wie soll ichs rausfinden? msgbox ins initialize klappt.
msgbox ins terminiert kommt nie. mit F8 wird der befehl korrekt abgearbeitet aber uform bleibt offen,
hauptuform wird einfach drübergeblendet...
ich nix verstehen das
Anzeige
AW: unload me, werd noch wahnsinnig
13.02.2011 00:01:04
stev
achso...
mit me.hide oder frmxxx.hide gehts
dieser code im query_close funktioniert GENAU ein mal.
dann passiert nix mehr, wenn ich aufs kreuz klicke.
ich will aber nicht, das wenn sich einer durch alle ebenen klickt 15 oder 20 userforms geöffnet sind.
AW: unload me, werd noch wahnsinnig
13.02.2011 09:45:10
Nepumuk
Hallo,
ganz einfach, deine QueryClose-Events werden nie richtig beendet.
Userform1 öffnet Userform2, das QueryClose-Event kann nicht auf End <pre>Sub laufen da er durch den Aufruf von Userform2 blockiert wird. Genauso ist es dann von Userform2 zurück auf Userform1, auch hier kann das QueryClose-Event nicht abgeschlossen werden. Nachdem du einmal hin- und hergewechselt bist, stehen in beiden Userforms die Pointer des Codes vor dem End Sub</pre>. Die Events sind also noch aktiv und können daher nicht mehr aufgerufen werden.
Jetzt verstanden warum es genau einmal funktioniert?
Mit dem Event und Modalen Userforms kommst du da also nicht weiter. Schalte die X'e ab und lass die Userforms nur noch über den Button oder ESC beenden. Was besseres fällt mir dazu auch nicht ein.
Gruß
Nepumuk
P.S. Die pre-Tags im Text macht die Forensoftware rein, trotz Tilde f Tilde. Also einfach ignorieren.
Anzeige
vielleicht mit Application.OnTime
13.02.2011 12:17:39
Tino
Hallo,
ich könnte mir denken dies mit einem Timer zu lösen und die StartForm verzögert aufzurufen.
Gruß Tino
AW: unload me, werd noch wahnsinnig
13.02.2011 16:17:54
dan
Hallo Stev,
das Problem liegt in der Methode Show().
Laut Help:
Show method displays a UserForm object. When a UserForm is modal, the user must respond before using any other part of the application. No subsequent code is executed until the UserForm is hidden or unloaded.
Also wenn man UserForm.Show() ruft, wird kein nachfolgender Code executed, bis man UserForm.Hide() oder Unload(UserForm) ruft.
Das heisst:
hauptuserform.show
... und der Code hier wird nich weiter luafen, wie der Nepumuk schreibt... bis man Hide oder Unload ruft, was man aber nicht tut. Also die Prozedure die hauptuserform.show gerufen hat endet nicht.
Ich wuerde z.B. so etwas vorschlagen:
' Parent UserForm
Option Explicit
Private frmChild As childUserForm
Private Sub ShowChildUserFormButton_Click()
' hier beginnt das Leben des Child-UserForms
Set frmChild = New childUserForm
' man postiert den 'Child' genau ueber dem 'Parent'
frmChild.StartUpPosition = Me.StartUpPosition
frmChild.Top = Me.Top
frmChild.Left = Me.Left
frmChild.Height = Me.Height
frmChild.Width = Me.Width
VBA.Global.Load frmChild ' Loads an object but doesn't show it.
frmChild.Show vbModal ' Displays a UserForm object
' Hier wartet man, bis der Benutzer den Child-UserForm schliesst...
' und wenn der Child-UserForm geschlossen worden ist,
' landen wir hier wieder und beseitigen den UserForm aus dem Speicher, also hier endet das  _
Leben des UserForms
VBA.Global.Unload frmChild
End Sub

Private Sub UserForm_Initialize()
Me.StartUpPosition = 0 ' Manual
Me.Top = 150
Me.Left = 150
Me.Height = 250
Me.Width = 250
End Sub
Gruss dan, cz.
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige

Infobox / Tutorial

Userform in Excel VBA richtig entladen


Schritt-für-Schritt-Anleitung

  1. UserForm erstellen: Erstelle einen neuen UserForm in Excel VBA.

  2. Code für das Entladen: Verwende den folgenden Code, um die UserForm zu entladen:

    Private Sub btnClose_Click()
       Unload Me
    End Sub
  3. Show-Methode nutzen: Wenn Du die UserForm anzeigst, stelle sicher, dass Du die Modal-Option verwendest:

    Private Sub ShowUserForm_Click()
       UserForm1.Show vbModal
    End Sub
  4. QueryClose-Ereignis: Achte darauf, dass das QueryClose-Ereignis richtig konfiguriert ist, um sicherzustellen, dass die UserForm ordnungsgemäß geschlossen wird:

    Private Sub UserForm_QueryClose(Cancel As Integer)
       Unload Me
    End Sub
  5. Testen: Teste Deine Anwendung, um sicherzustellen, dass die UserForm beim Schließen korrekt entladen wird.


Häufige Fehler und Lösungen

  • UserForm wird nicht entladen: Stelle sicher, dass Du nicht Unload UserForm1 oder Unload Me im falschen Kontext verwendest. Die Methode sollte immer im Zusammenhang mit dem aktuellen UserForm aufgerufen werden.

  • Modalität der UserForms: Wenn Du eine UserForm modal öffnest, wird der folgende Code blockiert, bis die UserForm geschlossen wird. Dies kann zu Verwirrungen führen, wenn Du mehrere UserForms geöffnet hast.

  • X-Schaltfläche funktioniert nicht: Wenn Du die Schaltfläche zum Schließen (X) der UserForm verwendest, kann es sein, dass das QueryClose-Ereignis nicht richtig behandelt wird. Deaktiviere diese Funktion, um Probleme zu vermeiden.


Alternative Methoden

  • Anwendung von Me.Hide: Anstatt die UserForm zu entladen, kannst Du sie auch einfach verstecken:

    Private Sub btnHide_Click()
       Me.Hide
    End Sub
  • Timer verwenden: Überlege, einen Timer zu verwenden, um die UserForm nach einer bestimmten Zeit automatisch zu schließen.

  • Verwendung von Application.OnTime: Du kannst Application.OnTime verwenden, um eine zeitverzögerte Ausführung einer Schließroutine zu implementieren.


Praktische Beispiele

Hier ist ein einfaches Beispiel, das zeigt, wie Du eine UserForm entladen kannst:

Private Sub btnNext_Click()
    UserForm2.Show vbModal
    Unload UserForm1
End Sub

In diesem Beispiel wird UserForm1 geschlossen, wenn UserForm2 angezeigt wird.


Tipps für Profis

  • Vermeide überflüssige UserForms: Halte die Anzahl der gleichzeitig geöffneten UserForms so gering wie möglich, um Verwirrung zu vermeiden.

  • Schließe UserForms gezielt: Nutze Unload anstelle von Hide, wenn Du die UserForm vollständig aus dem Speicher entfernen möchtest.

  • Debugging: Verwende MsgBox oder Debug.Print, um den Status Deines Codes zu überprüfen und sicherzustellen, dass die UserForms korrekt geladen und entladen werden.


FAQ: Häufige Fragen

1. Wie kann ich eine UserForm automatisch entladen?
Verwende den Unload-Befehl in der QueryClose-Routine oder in einer Schaltfläche.

2. Was ist der Unterschied zwischen Unload und Hide?
Unload entfernt die UserForm aus dem Speicher, während Hide sie nur verbirgt. Unload sollte verwendet werden, wenn Du die UserForm nicht mehr benötigst.

3. Funktioniert das auch in Excel 365?
Ja, die beschriebenen Methoden sind in allen gängigen Excel-Versionen, einschließlich Excel 365, anwendbar.

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