@Astander doğru cevabı vermiştir, ancak tüm denetimlerin aynı türde Denetimler koleksiyonuna sahip olmadığını unutmayın.
TextBox'lar, ComboBox'lar, ListBox'lar, CheckBox'lar, denetim koleksiyonlarında (ekli etiket) en fazla 1 öğeye sahiptir, ancak etiket eklenmemişse, buna sahip olmazlar. bir hata atar.
Bir Option Group'ta çoklu denetimler, etiket ve seçenek düğmesi veya çerçevenin içindeki geçiş düğmeleri bulunur. Form araçları araç çubuğundan bir formda bir seçenek grubu bıraktığınızda, çerçeve ekli bir etiketle oluşturulur, bu nedenle dizin 0 ile kontrol olur. Ancak, örneğin, varsayılan etiketi silerseniz, seçenek düğmelerini ekleyin ve sonra bir etiket ekleyin, dizin 0 olmayacaktır, ancak dizin .Controls.Count - 1.
Bu nedenle, bir seçenek grubu etikelinin başlığı için, varsayılan etiketi silerseniz, dikkatli olmak istersiniz. etiketi de ekledikten sonra çerçevedeki kontrolleri de silersiniz. Durum böyle değilse, etiketi adlandırmanız ve isme göre isimlendirmeniz gerekir, çünkü seçenek/geçiş düğmeleri için etiketler seçenek grubunun Kontroller koleksiyonunun bir parçasıdır (bu beni şaşırttı - Sadece Kontrollerde olmasını bekledim) Eklendikleri seçenek/geçiş düğmesinin toplanması).
Bu sorunu önlemek için, seçenek grubunun Controls koleksiyonuna, seçenek/değiştirme düğmelerine eklenmiş etiketleri arayan ve ardından seçenek grubunun Controls koleksiyonuna ikinci kez bağlanan, bu sefer kodlanmış kodları hayal edebilirsiniz. sadece etiketlere bakarak.Böyle bir şey: oldukça kontrol referansı yerine, etiket adını dönmek için muhtemelen daha mantıklı olur, böylece hiçbir etiket ekli varsa
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
Şimdi, bu kırar:
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
Bu, seçenek grubunun Kontroller koleksiyonundan tek bir döngü ile yapılabilirdi, ama geç kaldı! Kurşun geçirmezliğe oldukça yakın bir şey var, tabii ki herkes bir sıçanın kıçını veriyor! :)
Evet, işte budur. Teşekkür ederiz! – Markus