TOP

VBA-Lektion 12.2. Steuerelemente (Controls)

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:

Checkboxes

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

Optionsschaltflächen (Option Buttons)

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