Startseite

Mehrere Objekte über eine Schleife ansprechen

Angenommen wir haben in einem UserForm mehrere Optionsschaltflächen, denen per VBA die Beschriftungen zugewiesen werden sollen. Das könnte man zum Beispiel so lösen:
Private Sub UserForm_Initialize()
OptionButton1.Caption = "Buchhalter"
OptionButton2.Caption = "Einkaufsleitung"
OptionButton3.Caption = "Inhaber"
OptionButton4.Caption = "Marketing"
OptionButton5.Caption = "Vertrieb"
End Sub
Nun man kann es schon ahnen, da gibt es auch andere Möglichkeiten. Zumal diese Begriffe in der Tabelle möglicherweise hinterlegt sind und dort ausgelesen werden können. Es liegt der Gedanke nahe, die Begriffe über eine Schleife einzulesen. Etwa nach diesem Muster:
Private Sub UserForm_Initialize()
Dim s As Integer
For s = 1 To 5
    "OptionButton" & s = Cells(s, 1)
Next s
End Sub
Um es kurz zu machen, ganz so einfach ist das leider nicht. Eine funktionierende Lösung wäre diese:
Private Sub UserForm_Initialize()
Dim s As Integer
For s = 1 To 5
    Controls("OptionButton" & s).Caption = Cells(s, 1)
Next s
Oder auch so:
Private Sub UserForm_Initialize()
Dim obj As Object
Dim i As Integer
' Namen für Optionsschaltflächen einlesen
For Each obj In Me.Controls
    If Left(TypeName(obj), 12) = "OptionButton" Then
        i = i + 1
            obj.Caption = Worksheets("Parameter").Cells(i, 1)
    End If
Next obj
End Sub
Wobei im ersten Beispiel alle OptionButtons von 1 bis 5 angesprochen werden. Im zweiten Beispiel alle im UserForm vorkommenden OptionButtons.

Alle Quelltexte eingefügt mit: Excel Code Jeanie
Dieses Prinzip läßt sich (in angepasster Form) auf alle Objekte anwenden. Grundsätzlich ist es so, dass die Zeile:
For Each obj In Me.Controls
alle Objekte einliest, die es in dem UserForm gibt. Um nun gezielt auf unsere OptionsButton's einzuwirken, benötigen wir diese Zeile:
If Left(TypeName(obj), 12) = "OptionButton" Then
Damit spechen wir alle OptionButtons an und können ihnen so einen Text zuweisen. Es werden die ersten zwölf Zeichen von links ausgelesen, das bedeutet, die Nummer der (Standard)Objektbezeichnung wird in der Schleife nicht berücksichtigt. Trotzdem werden die Daten in der richtigen Reihenfolge an die Objekte übergeben.
Bei dem Beispiel von oben, wurden die Objekte über ihre Standardnamen (TypeName) angesprochen. Das ist auch möglich, wenn der Anwender die Objekte umbenannt hat. Es ist natürlich auch möglich, Objekte über die Anwenderdefinierten Namen anzusprechen. Dann muß
Left(TypeName(obj), 5)
in
Left(obj.Name, 4)
geändert werden. Wobei die Zahl hinter dem Komma die Anzahl der zu berücksichtigenden Zeichen repräsentiert. Sie ist somit frei wählbar, sollte aber mindestens so groß sein, das der Vergleich eindeutig wird.
Mit dieser Methode ist es sogar möglich, verschiedene Objekte anzusprechen. Man könnte also die Inhalte von TextBoxen und Comboboxen auslesen und in eine Tabelle übertragen.