Clever-Excel-Forum

Normale Version: Nach geladenen Userformen suchen und alle unloaden
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Moin

Ich hab eine Userform, aus der verschiedene andere Userformen geladen werden können, je nach Auswahl in Userform_1.


Nun soll es möglich sein, über einen CommandButton auf der Userform_a zurück auf die Userform_1 zu kommen, dort eine andere Auswahl zu treffen und somit die Userform_b zu öffnen.

Bisher hab ich immer mit Userform_X.Show resp. .Hide gearbeitet. Nun ist es aber so, dass wenn ich folgende Reihenfolge habe: _1 => _a => _1 => _b => _a

Dann wird beim 2. Mal wo _a.kommt, diese Userform nicht neu initialisiert. Deswegen hab ich mir gedacht ich könnte es so programmieren, dass jedes mal wenn von _1 aus eine andere Userform gestartet werden soll, zuerst alle vorher bereits geladenen Userformen mit 'Unload' geschlossen werden.

Den Code hab ich dafür:


Code:
Dim frm As Object
Dim frm_string As String

For Each frm In UserForms
frm_string = frm.Name
    If frm_string <> "UserForm_Module" Then
    MsgBox frm.Name
    Unload frm.Name
    End If
Next

Nur kommt beim Unload frm.Name die Meldung, dass ein Object erforderlich sei. Wenn ich nur Unload frm nehme, kommt dafür 'Ungültiger Prozeduraufruf oder ungültiges Argument'.

Ich kann auch nicht hingehen und sagen unload _a, unload _b, denn wenn die vorher gar nicht geladen wurden, kann er sie auch nicht unloaden.

Wäre es möglich aus frm_string den namen der userform zu nutzen, und den dann zu frm zuzuweisen, damit Unload frm klappt? Also den String frm_string einem Object zuzuweisen?

Danke im Voraus
Das sollte Dir helfen, zumindest eine der beiden Antworten
https://stackoverflow.com/questions/5281...ded-or-not
Hallo,

(08.03.2019, 12:48)Lopezoli schrieb: [ -> ]Ich kann auch nicht hingehen und sagen unload _a, unload _b, denn wenn die vorher gar nicht geladen wurden, kann er sie auch nicht unloaden.
sagt wer?

Gruß Uwe
Code:
Option Explicit
Public Function isFormVisible(FrmName As String) As Boolean
Dim Frm As Object
   On Error GoTo EH
   isFormVisible = False
   For Each Frm In VBA.UserForms
       If LCase$(Frm.Name) = LCase$(FrmName) Then
           If Frm.Visible Then
               isFormVisible = True
               Exit Function
           End If
       End If
   Next
EH:
   isFormVisible = False
End Function
Public Function isFormLoaded(FrmName As String) As Boolean
   Dim Frm As UserForm
On Error GoTo EH
   isFormLoaded = False
   For Each Frm In VBA.UserForms
       If LCase$(TypeName(Frm)) = LCase$(FrmName) Then
          isFormLoaded = True
          Exit Function
       End If
   Next
EH:
   isFormLoaded = False
End Function

Public Function getForm(FrmName As String) As UserForm
   Dim Frm As UserForm
   For Each Frm In VBA.UserForms
       If LCase$(TypeName(Frm)) = LCase$(FrmName) Then
           Set getForm = Frm
           Exit Function
       End If
   Next
End Function


Sub testIt()
   Dim f As frmTest
   
   Set f = New frmTest
   Load f
   If isFormLoaded("frmtest") Then
       Unload getForm("frmtest")
   End If

   Set f = New frmTest
   f.Show vbModeless
   If isFormVisible("frmtest") Then
       Unload getForm("frmtest")
   End If
End Sub
Habs jetzt so lösen können:


Code:
Userform_Module.Hide
For Each frm In VBA.UserForms
    frm_string = frm.Name
    If frm_string <> "UserForm_Module" Then
        If TypeOf frm Is UserForm Then
            Unload frm
        End If
    End If
Next frm
Userform_Mast1.Show
Mir erschliesst sich jetzt diese Prüfung nicht

Code:
        If TypeOf frm Is UserForm Then
            Unload frm
        End If

denn Dein Loop geht genau über diesen Typ
Code:
For Each frm In VBA.UserForms
...
Next frm
Stimmt, diese If-Abfrage könnt ich rausnehmen...
Da hatte ich vorhin eigentlich die If String <> "_Module" noch drin