@Astander ha proporcionado la respuesta correcta, pero tenga en cuenta que no todos los controles tienen el mismo tipo de colecciones de controles.
TextBoxes, ComboBoxes, ListBoxes, CheckBox tienen un máximo de 1 elemento en su colección de controles (la etiqueta adjunta), pero si la etiqueta no está adjunta, ni siquiera tendrán eso, entonces .Controles (0) arrojará un error.
Un grupo de opciones tiene controles múltiples, la etiqueta y el botón de opción o botones de alternar dentro del marco. Cuando suelta un grupo de opciones en un formulario de la barra de herramientas de herramientas de formulario, el marco se crea con una etiqueta adjunta, por lo que será el control con el índice 0. Pero si, por ejemplo, elimina la etiqueta predeterminada, agregue botones de opción y a continuación, vuelva a agregar una etiqueta, no será el índice 0, pero index .Controls.Count - 1.
Por lo tanto, para el título de una etiqueta de grupo de opción, puede tener cuidado de que si elimina la etiqueta predeterminada , también elimina los controles dentro del marco después de agregar la etiqueta nuevamente. Si ese no es el caso, debe nombrar la etiqueta y referirse a ella por su nombre, porque las etiquetas de los botones de opción/alternar forman parte de la colección de controles del grupo de opciones (esto me sorprendió; esperaba que solo estuvieran en los controles). colección del botón de opción/alternar al que estaban adjuntos).
Para evitar este problema, puedo imaginar un código intrincado en el que haya realizado un bucle en la colección de controles del grupo de opciones buscando las etiquetas asociadas a los botones de opción/alternar, y luego en bucle la colección de controles del grupo de opciones por segunda vez. mirando solo las etiquetas.Algo como esto:
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
Ahora, esto rompe si no hay una etiqueta adjunta, por lo que probablemente tendría más sentido para que retorne el nombre de la etiqueta, en lugar de la referencia de control:
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
Esto probablemente podría hacerse con un solo bucle a través de la colección de controles del grupo de opciones, ¡pero es tarde! Lo que hay parece ser muy cercano a las balas, ¡no es que a nadie le importe el culo de una rata, por supuesto! :)
Sí, eso es todo. ¡Gracias! – Markus