eine UserForm ist auch nur eine Klasse, also kannst du ihr einfach eine Function schenken, die dir das Ergebnis der Auswahl zurückgibt. Dabei läuft dein Haupt-Code auch nicht weiter:
Code:
Option Explicit 'ClassName: ChoiceBox
Private mRetVal As Variant
Public Function GetChoice(choices As Variant, Optional Prompt As String = "Bitte Auswahl treffen") If IsArray(choices) Then Me.ComboBox1.List = choices Else Me.ComboBox1.AddItem choices End If Me.Show GetChoice = mRetVal End Function Private Sub CommandButton1_Click() 'OK If Me.ComboBox1.ListIndex <> -1 Then mRetVal = Me.ComboBox1.Text Me.Hide Else MsgBox "Bitte erst eine Auswahl treffen, oder Abbrechen", vbCritical End If
End Sub
Private Sub CommandButton2_Click() 'Cancel mRetVal = -1 Me.Hide End Sub
aufrufen kannst du den Code beispielsweise wie folgt:
Code:
Option Explicit
Sub test() Dim cb As New ChoiceBox Dim auswahl As Variant auswahl = cb.GetChoice(Array("Franz", "jagt", "im", "komplett", "verwahrlosten", "Taxi", "quer", "durch", "Bayern"))
If auswahl = -1 Then Debug.Print "Abgebrochen" Else Debug.Print auswahl End If
End Sub
Aber unabhängig davon; sobald du die UserForm mit der .Show()-Methode modal anzeigst (das ist der Standard) fährt der Code erst fort, wenn du die Userform wieder ausgeblendet hast.
Private Sub CommandButton1_Click() If Me.ComboBox1.ListIndex > -1 Then Unload Me End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = 0 Then Cancel = True End Sub
Der zweite Teil verhindert dann noch, dass das UF über X verlassen wird. Statt Unload Me kannst Du auch Me.Hide nehmen, wenn Du den Inhalt der Combo danach aus ihr holen willst. Ich würde aber ggf. eine Variable verwenden ...
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
ich bin inhaltlich ganz bei dir und Matthieu. In diesem Fall würde ich allerdings sagen, dass die Business-Logik nie skaliert werden muss. Zudem scheint der TE weder an Programmierung noch an der Begleitung seiner eigenen Threads interessiert.
Aber ja, als Faustregel: Objekte werden -wenn überhaupt- nur im Terminate-Event entladen und wie sooft betont, eine UserForm wird nur als Klassenmodul benutzt, das nur für Tests mit den Public-Accessors verwendet wird und sonst natürlich über eigene Accessoren bedient wird.