So greifen Sie auf das Etikett eines Steuerelements im Code zu
-
06-07-2019 - |
Frage
Oft ist eine Etikettensteuerung an eine Textbox oder eine ähnliche andere Steuerung gebunden. Ich weiß, dass es eine Möglichkeit gibt, über Code auf das Etikett zuzugreifen, aber ich erinnere mich nicht, wie es geht.
Kann jemand helfen?
Vielleicht so etwas wie:
Me.txtName.Child!lblName.Value
Oder
Me.txtName.Parent!lblName.Value
Ich werde dies verwenden, wenn ich für Validierungszwecke die Steuerelemente in einem Formular aufzählige. Dann möchte ich das Etikett für eine Steuerung als Informationen in der Fehlermeldung verwenden, um dem Benutzer anzuzeigen, wo sich der Fehler befindet.
Lösung
Mit dem Textfeld können Sie es versuchen
Text0.Controls.Item(0).Caption
wobei Control 0 das verknüpfte Etikett ist
Andere Tipps
@Astander hat die richtige Antwort gegeben, aber denken Sie daran, dass nicht alle Kontrollen die gleichen Kontrollkollektionen haben.
Textboxen, Comboboxen, Listboxen und Kontrollkästchen haben maximal 1 Element in ihrer Steuerungskollektion (das angehängte Etikett). Wenn das Etikett jedoch nicht angehängt ist, haben sie das nicht einmal, also. .
Eine Optionsgruppe verfügt über mehrere Steuerelemente, die Beschriftung und die Optionstaste oder die Schaltflächen für Optionen oder Umschaltungen im Rahmen. Wenn Sie eine Optionsgruppe in einem Formular aus der Symbolleiste der Form Tools fallen lassen, wird der Rahmen mit einer angehängten Etikett erstellt. Daher ist es das Steuerelement mit Index 0. Wenn Sie beispielsweise die Standardbezeichnung löschen, fügen Sie Optionsschaltflächen und fügen Sie die Optionsschaltflächen hinzu und fügen Sie dies zu. Fügen Sie dann ein Etikett zurück, es ist nicht Index 0, sondern Index .Controls.Count - 1.
Für die Überschrift einer Option Group Lable möchten Sie also entweder darauf achten, dass Sie die Steuerelemente im Rahmen auch löschen, nachdem Sie das Etikett zurückgegeben haben. Wenn dies nicht der Fall ist, müssen Sie das Etikett benennen und namentlich darauf verweisen, da die Beschriftungen für die Option/Umschalttasten Teil der Steuerung der Optiongruppe sind Sammlung der Option/Umschalttaste, an die sie angehängt wurden).
Um dieses Problem zu vermeiden, kann ich mir vorstellen Etiketten. Etwas wie das:
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
Wenn dies nun bricht, wenn kein Etikett angehängt ist, wäre es wahrscheinlich sinnvoller, den Labelnamen zurückzugeben, anstatt die Kontrollreferenz:
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 einzigen Schleife durch die Kontrollsammlung der Option Group geschehen, aber es ist spät! Was scheint kugelsicher zu sein, nicht dass jemand einen Rattenarsch gibt! :)
Wenn es zugänglich ist, denke ich, dass es ist
Formulare! YourFormName! Yourfield.Value
Oder wenn Sie eine Unterform haben, ist es:
Formulare! YourMainForm! Ihre Subform! Ihr Feld.Value
Hier ist ein Code, den ich geschrieben habe, um die mit optionbuttons verbundenen Etiketten umzubenennen. Ein Etikett verfügt über eine übergeordnete Eigenschaft, die auf die Steuerbezeichnungen hinweist. Die Funktion ist ziemlich allgemein, während die Unterroutine für OptionButtons geschrieben wird. Dieser Code sollte für fast alles funktionieren, außer dass ich keine Wiederherstellung bereitgestellt habe, wenn das Etikett nicht zugeordnet ist.
Öffentliche Funktion PanameControllabel (Formname als String, Steuerungsname als Zeichenfolge) als Zeichenfolge dim frm als Form dim CTL als Steuerungsdim -ctllabel als Steuerungsdim ctlparent als Steuerelement
Set frm = Forms(FormName)
For Each ctl In frm.Controls
Select Case ctl.ControlType
Case acLabel
If ctl.Parent.Name = ControlName Then
Debug.Print "Label " & ctl.Name & " Renamed to lbl" & ControlName
ctl.Name = "lbl" & ControlName
paNameControlLabel = ctl.Name
End If
End Select
Next ctl
Endfunktion Public Sub PanameoptionButtonLabels (Formname als String) Dim frm als Form dim CTL als Kontrolle
Set frm = Forms(FormName)
For Each ctl In frm.Controls
If ctl.ControlType = acOptionButton Then
Debug.Print paNameControlLabel(FormName, ctl.Name)
End If
Next ctl
Set frm = Nothing
End Sub
Wahrscheinlich spät, aber ich hatte nur damit zu kämpfen, und was funktioniert hat, war die Art der Kontrolle, um sicherzustellen, dass sie Etiketten unterstützt und dann verwendet werden
ctl.Properties(3) ' For the label name
Forms(ctl.Form).Controls(ctl.Properties(3)).Caption ' For the label text
Verwenden Sie im unmittelbaren Fenster einen Textindex anstelle der magischen Nummer: ctl.properties("LabelName")
hat funktioniert.
Zuerst suchte ich nach dem Etikett unter den Eigenschaften der Textbox und schlug aus. Ich schaute dann unter die Kontrollen der Form und fand sie dort.
Hoffe das hilft jemandem!