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:
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.
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)
inLeft(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.