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.