Clever-Excel-Forum

Normale Version: Excel VBA Makro soll warten bis Auswahl in UserForm
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo Leute.

Ich habe ein Makro geschrieben welches unter bestimmten Voraussetzungen ein UserForm lädt mit einer Kombobox und Button.

Das Läuft auch aber,

das Makro soll warten bis ich in der Kombobox was gewählt und den Okay Button gedrückt habe.

Ich bekomme es einfach nicht hin, wie kann ich das umsetzen?

DANKE
Hallo,

hier ein kleines Beispiel:

- Button im Sheet öffnet die Userform
- Die KomboBox ermöglicht eine Auswahl
- Der CommandButton startet eine Aktion

mfg

PS: In Foren ist es nicht so einfach Hilfe mit xlsm-Files anzubieten
Moin,

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.

Viele Grüße
derHöpp
Hallöchen,

oder so:

Code:
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 ...
Moin,

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.

Viele Grüße
derHöpp