@Astander hat die richtige Antwort angegeben, aber bedenken Sie, dass nicht alle Steuerelemente dieselbe Art von Controls-Sammlungen haben.
TextBoxen, ComboBoxen, ListBoxen, CheckBoxes haben maximal 1 Element in ihrer Steuerelementsammlung (das angehängte Label), aber wenn das Label nicht angehängt ist, haben sie nicht einmal das, also .Controls (0) wird einen Fehler auslösen.
Eine Optionsgruppe hat mehrere Steuerelemente, das Label und die Optionsschaltfläche oder Umschaltflächen innerhalb des Rahmens. Wenn Sie eine Optionsgruppe in einem Formular aus der Formwerkzeugleiste löschen, wird der Rahmen mit einem angehängten Label erstellt, sodass es das Steuerelement mit dem Index 0 ist. Wenn Sie jedoch beispielsweise das Standardlabel löschen, fügen Sie die Optionsfelder und hinzu Fügen Sie dann ein Label zurück, es wird nicht Index 0 sein, aber index .Controls.Count - 1.
Also, für die Beschriftung eines Optionsgruppenlabels, möchten Sie entweder vorsichtig sein, dass wenn Sie das Standardlabel löschen , löschen Sie auch die Steuerelemente innerhalb des Rahmens, nachdem Sie das Label wieder hinzugefügt haben. Wenn dies nicht der Fall ist, müssen Sie die Bezeichnung benennen und auf den Namen verweisen, da die Beschriftungen für die Options-/Umschalttasten Teil der Controls-Sammlung der Optionsgruppe sind (das hat mich überrascht - ich habe erwartet, dass sie nur in den Steuerelementen enthalten sind) Sammlung der Options-/Umschalttaste, an die sie angehängt wurden).
Um dieses Problem zu vermeiden, stelle ich mir gewundenen Code vor, bei dem Sie die Controls-Auflistung der Optionsgruppe durchsucht und nach den an die Options-/Umschalttasten angehängten Beschriftungen suchen und dann ein zweites Mal durch die Steuerelementsammlung der Optionsgruppe laufen nur auf die Etiketten schauen.Etwas wie folgt aus:
Public Function FindOptionGroupLabel(ctlOptionGroup As Control) As Control
Dim ctl As Control
Dim strOptionToggleLabels As String
If ctlOptionGroup.ControlType <> acOptionGroup Then
MsgBox ctlOptionGroup.Name & " is not an option group!", _
vbExclamation, "Not an option group"
Exit Function
End If
For Each ctl In ctlOptionGroup.Controls
Select Case ctl.ControlType
Case acOptionButton, acToggleButton
If ctl.Controls.Count = 1 Then
strOptionToggleLabels = strOptionToggleLabels & " " & ctl.Controls(0).Name
End If
End Select
Next ctl
strOptionToggleLabels = strOptionToggleLabels & " "
For Each ctl In ctlOptionGroup.Controls
Select Case ctl.ControlType
Case acLabel
If InStr(" " & strOptionToggleLabels & " ", ctl.Name) = 0 Then
Set FindOptionGroupLabel = ctl
End If
End Select
Next ctl
Set ctl = Nothing
End Function
Nun bricht diese, wenn kein Etikett angebracht ist, so dass es wahrscheinlich mehr Sinn machen würde, für den Markennamen zurückzukehren, anstatt die Steuer Referenz:
Public Function FindOptionGroupLabel(ctlOptionGroup As Control) As String
Dim ctl As Control
Dim strOptionToggleLabels As String
If ctlOptionGroup.ControlType <> acOptionGroup Then
MsgBox ctlOptionGroup.Name & " is not an option group!", _
vbExclamation, "Not an option group"
Exit Function
End If
For Each ctl In ctlOptionGroup.Controls
Select Case ctl.ControlType
Case acOptionButton, acToggleButton
If ctl.Controls.Count = 1 Then
strOptionToggleLabels = strOptionToggleLabels & " " & ctl.Controls(0).Name
End If
End Select
Next ctl
strOptionToggleLabels = strOptionToggleLabels & " "
For Each ctl In ctlOptionGroup.Controls
Select Case ctl.ControlType
Case acLabel
If InStr(" " & strOptionToggleLabels & " ", ctl.Name) = 0 Then
FindOptionGroupLabel = ctl.Name
End If
End Select
Next ctl
Set ctl = Nothing
End Function
Dies könnte wahrscheinlich mit einer einzelnen Schleife durch die Controls-Sammlung der Optionsgruppe erfolgen, aber es ist spät! Was dort ist, scheint ziemlich kugelsicher zu sein, nicht dass irgendjemand einen Rattenarsch gibt, natürlich! :)
Ja, das ist es. Vielen Dank! – Markus