Steuerelemente (Controls) verfügen über alle Arten von Eigenschaften und viele damit verbundene Ereignisse, aber zunächst betrachten wir nur einige, die bei der Programmierung auf VBA verwendet werden.
Beginnen wir mit dem Hinzufügen von drei Steuerelementen – Label, TextBox und CommandButton:
Bearbeiten Sie den Namen und die Eigenschaften dieses Steuerelements (mithilfe der Eigenschaft Caption, die den Text enthält), um das folgende Ergebnis zu erhalten:
Wenn wir nun die Nummer eingeben und auf OK klicken, passiert nichts.
Um eine Aktion zu erstellen, fügen wir ein Ereignis hinzu, das den eingegebenen Wert aus dem Textfeld in Zelle A1 schreibt und das Formular schließt.
Sie können auf die unten angezeigten Optionen zugreifen, indem Sie auf das Steuerelement doppelklicken:
Diese Dropdown-Liste enthält verschiedene Steuerelemente und dieses Formular.
Wählen Sie die Schaltfläche (Button) und das Ereignis Click aus:
Private Sub CommandButton_validate_Click() Range("A1") = Textbox_number.Value 'Textbox_Nummer ist der Name des Textfelds 'Value ist eine Eigenschaft, die den Wert des Textfelds enthält Unload Me 'Unload schließt das Formular (UserForm) 'Wir verwenden „Me“ anstelle des Formularnamens (da sich dieser Code in der Mitte von UserForm befindet, das wir schließen möchten) End Sub
Der eingegebene Wert wird nun bereits vor dem Schließen dieses Formulars in Zelle A1 gespeichert (UserForm).
Fügen Sie eine zweite Beschriftung hinzu (Label) und bearbeiten Sie die folgenden Eigenschaften: Caption, Forecolor (Farbe: Rot) und Visible (False, um das Standardsteuerelement auszublenden):
Fügen wir nun ein Ereignis hinzu, das ausgelöst wird, wenn der Wert im Textfeld vom Benutzer geändert wird. Das Ereignis zeigt eine Fehlermeldung an, wenn der Wert nicht numerisch ist.
Private Sub Textbox_number_Change() If IsNumeric(Textbox_number.Value) Then 'IF ist ein numerischer Wert... Label_error.Visible = False 'Titel (Label) ist ausgeblendet Else 'ANSONSTEN... Label_error.Visible = True 'Der Name wird angezeigt End If End Sub
Der eingegebene Wert wird bei jeder Eingabe des nächsten Zeichens überprüft.
Wir müssen noch eine Überprüfung (Validierung) der eingegebenen Werte im Formular hinzufügen. Wir zeigen eine Meldung an, wenn der Wert keine Zahl ist:
Private Sub CommandButton_validate_Click() If IsNumeric(Textbox_number.Value) Then 'IF ist ein numerischer Wert... Range("A1") = Textbox_number.Value 'Auf A1 kopieren Unload Me 'Ich schließe Else 'ANSONSTEN... MsgBox "Incorrect value" 'Ungültiger Wert End If End Sub
Um die rechte Seite des Formulars nicht leer zu lassen, wenn keine Fehlermeldung vorliegt, können wir die Größe reduzieren, indem wir die Eigenschaft Width dieses Formulars anpassen:
Private Sub Textbox_number_Change() If IsNumeric(Textbox_number.Value) Then 'IF ist ein numerischer Wert... Label_error.Visible = False 'Titel (Label) ist ausgeblendet Me.Width = 156 'Formularbreite Else 'ANSONSTEN... Label_error.Visible = True 'Der Name wird angezeigt Me.Width = 244 'Formularbreite End If End Sub
Sie können die Beispieldatei Excel herunterladen: userform1.xls
Hier ist das Ergebnis:
Hier ist ein Beispiel für die Verwendung von CheckBox:
Wenn das Kontrollkästchen aktiviert/deaktiviert ist, kann der Wert der zugehörigen Zelle mithilfe des Ereignisses Click geändert werden:
Private Sub CheckBox1_Click() 'Nummer 1 If CheckBox1.Value = True Then 'WENN ausgewählt... Range("A2") = "Checked" Else 'WENN nicht ausgewählt... Range("A2") = "Unchecked" End If End Sub Private Sub CheckBox2_Click() 'Nummer 2 If CheckBox2.Value = True Then 'WENN ausgewählt... Range("B2") = "Checked" Else 'WENN nicht ausgewählt... Range("B2") = "Unchecked" End If End Sub Private Sub CheckBox3_Click() 'Nummer 3 If CheckBox3.Value = True Then 'WENN ausgewählt... Range("C2") = "Checked" Else 'WENN nicht ausgewählt... Range("C2") = "Unchecked" End If End Sub
In diesem Beispiel sind die Kontrollkästchen zunächst deaktiviert, wenn das Formular zum ersten Mal geöffnet wird.
Um jedes Kontrollkästchen zu aktivieren, wenn der Wert der entsprechenden Zelle „Geprüft“ („Checked“) ist, führen wir die Prüfung bei der Formularaktivierung mit UserForm_Initialize durch:
Private Sub UserForm_Initialize() 'Wenn aktiviert If Range("A2") = "Checked" Then CheckBox1.Value = True End If If Range("B2") = "Checked" Then CheckBox2.Value = True End If If Range("C2") = "Checked" Then CheckBox3.Value = True End If End Sub
Hier sehen Sie ein Beispiel in der fertigen Excel-Datei: userform2.xls
Bei Verwendung von Optionsschaltflächen (Option Buttons oder manchmal auch Radio Buttons genannt) kann der Benutzer nur eine Option pro „Gruppe“ auswählen, im Gegensatz zu Kontrollkästchen, bei denen der Benutzer mehrere Kästchen gleichzeitig ankreuzen kann.
Um eine „Gruppe“ zu erstellen, fügen Sie zuerst Frame und dann OptionButton ein:
Hier sehen Sie ein Beispiel in der fertigen Excel-Datei: userform3.xls
Beim Absenden des Formulars werden Daten in die Zelle eingegeben, die dem ausgewählten Spaltennamen (column_value) und der Zeile (row_value) zugeordnet ist.
Um zu wissen, welche Optionen ausgewählt wurden, könnten wir dasselbe wie im vorherigen Beispiel tun (mit Kontrollkästchen), aber wir werden eine Schleife verwenden, um die Codegröße zu reduzieren.
Wir werden die For Each-Schleife verwenden, einen Schleifentyp, den wir bisher noch nicht behandelt haben. Mit dieser Schleife können Sie Anweisungen für jedes Objekt in einer „Objektgruppe“ ausführen:
Private Sub CommandButton1_Click() Dim column_value As String, row_value As String 'Schleife für jedes Frame_column-Steuerelement For Each column_button In Frame_column.Controls 'Wenn Kontrollwert = True (dann wenn ausgewählt) ... If column_button.Value Then 'Die Variable „column_value“ übernimmt den Textwert der Schaltfläche column_value = column_button.Caption End If Next 'Gehen Sie einen weiteren Block weiter For Each row_button In Frame_row.Controls If row_button.Value Then row_value = row_button.Caption End If Next Range(column_value & row_value) = "Cell chosen!" '„Zelle ausgewählt!“ 'Schließen (Entladen) Sie das Formular (Ich) Unload Me End Sub
Unser Formular gibt nun den Wert „Zelle ausgewählt!“ ein. in der ausgewählten Zelle.
Um einen Fehler zu vermeiden, müssen wir prüfen, ob der Benutzer aus zwei Optionssätzen richtig ausgewählt hat.
Wenn das Formular in diesem Beispiel noch nicht vollständig ist, ist die Schaltfläche „Confirm“ ausgegraut (deaktiviert). Es ist nicht die einfachste Lösung, aber es ist ein gutes Beispiel dafür, warum Funktionen/Prozeduren in der Mitte eines Formulars (UserForm) nützlich sind.
Bearbeiten Sie den Text und die Eigenschaft „Enabled“, um die Schaltfläche zu deaktivieren.
Das Ergebnis wird wie folgt sein:
Im vorherigen Code haben wir zwei For Each-Schleifen verwendet, um die Werte der Optionsschaltflächen abzurufen (Option Buttons). Jetzt müssen wir für die zehn Optionen dieselben Werte für die Schaltfläche „Bestätigen“ („Confirm“) und das Ereignis Click verwenden.
Dazu müssen wir die Schleifen nicht für jedes Ereignis kopieren, sondern rufen sie über eine Funktion auf.
Wenn wir mit dem vorherigen Code beginnen und ihn modifizieren, werden wir dieses Ergebnis erzielen:
Private Function column_value() 'Funktion, die einen Textwert für die ausgewählte Schaltfläche zurückgibt (column_value) For Each column_button In Frame_column.Controls If column_button.Value Then column_value = column_button.Caption End If Next End Function Private Function row_value() 'Eine Funktion, die einen Textwert für die ausgewählte Schaltfläche zurückgibt (row_value) For Each row_button In Frame_row.Controls If row_button.Value Then row_value = row_button.Caption End If Next End Function Private Sub CommandButton1_Click() 'Aktion, die ausgeführt wird, wenn Sie auf „Bestätigen Sie Ihre Auswahl“ klicken. Range(column_value & row_value) = "Cell chosen!" '„Zelle ausgewählt!“ 'column_value und row_value sind die von diesen Funktionen zurückgegebenen Werte Unload Me End Sub
Jetzt müssen wir nur noch eine Routine erstellen, die prüft, ob die Optionsschaltflächen richtig ausgewählt wurden (durch den Aufruf zweier Funktionen) und die diese Schaltfläche bei Bedarf aktiviert.
Auch hier erfolgt die Validierung in einem separaten Verfahren, um zu vermeiden, dass der Code für jedes Ereignis jedes Optionsfelds zehnmal kopiert wird:
Private Sub activate_button() 'Aktivieren der Schaltfläche, wenn die Bedingung erfolgreich getestet wurde If column_value <> "" And row_value <> "" Then 'column_value und row_value sind die von diesen Funktionen zurückgegebenen Werte CommandButton1.Enabled = True CommandButton1.Caption = "Confirm your selection" '„Bestätigen Sie Ihre Auswahl“ End If End Sub Private Sub OptionButton11_Click() activate_button 'Wir starten die Prozedur „activate_button“. End Sub Private Sub OptionButton12_Click() activate_button End Sub Private Sub OptionButton13_Click() activate_button End Sub Private Sub OptionButton14_Click() activate_button End Sub Private Sub OptionButton15_Click() activate_button End Sub Private Sub OptionButton16_Click() activate_button End Sub Private Sub OptionButton17_Click() activate_button End Sub Private Sub OptionButton18_Click() activate_button End Sub Private Sub OptionButton19_Click() activate_button End Sub Private Sub OptionButton20_Click() activate_button End Sub
Hier sehen Sie ein Beispiel in der fertigen Excel-Datei: userform3b.xls