@ Astander дал правильный ответ, но имейте в виду, что не все элементы управления имеют одинаковые коллекции элементов управления.
TextBoxes, ComboBoxes, ListBoxes, CheckBoxes имеют максимум 1 элемент в своей коллекции элементов управления (прикрепленная метка), но если метка не прикреплена, они даже не будут иметь этого, поэтому .Controls (0) будет выдать ошибку.
Группа параметров имеет несколько элементов управления, метку и кнопку выбора или кнопки переключения внутри рамки. Когда вы удаляете группу параметров в форме с панели инструментов инструментов формы, рамка создается с прикрепленной меткой, поэтому она будет элементом управления с индексом 0. Но если, например, вы удалите метку по умолчанию, добавьте кнопки параметров и затем добавьте обратно метку, это будет не индекс 0, а индекс .Controls.Count - 1.
Таким образом, для заголовка метки группы параметров вы также должны быть осторожны: если вы удаляете метку по умолчанию, вы также удаляете элементы управления внутри фрейма после добавления метки обратно. Если это не так, вам нужно назвать ярлык и ссылаться на него по имени, потому что ярлыки для кнопок выбора / переключения являются частью коллекции элементов управления группы параметров (меня это удивило - я ожидал, что они будут только в элементах управления). коллекция кнопки выбора / переключения, к которой они были прикреплены).
Чтобы избежать этой проблемы, я могу представить себе извилистый код, в котором вы просматривали коллекцию Controls группы параметров, ища метки, прикрепленные к кнопкам выбора / переключения, а затем повторяли циклично коллекцию Controls группы параметров во второй раз, на этот раз просматривая только на этикетках. Примерно так:
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
Теперь, это ломается, если нет прикрепленной метки, так что, вероятно, было бы более разумно вернуть имя метки, а не контрольную ссылку:
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
Возможно, это можно сделать одним циклом в коллекции элементов управления группы параметров, но уже поздно! То, что там кажется довольно близким к пуленепробиваемому, не то, чтобы кто-то давал задницу крысе, конечно! :)