Comment manipuler un contrôle par son nom ?
IntroductionIl est possible avec VB de manipuler un contrôle de façon indirecte, c'est à dire par son nom plutôt que par manipulation directe de l'objet. Il y a plusieurs façons de faire cela. Cet article expose les différentes méthodes possibles, le lecteur choisira la meilleure ou la plus pratique en fonction de l'application.
La collection ControlsLa collection "Controls" est attachée à une Form. Tous les contrôles présents sur une feuille se retrouvent dans cette collection. En utilisant cette collection "Controls", il est facile d'accéder aux contrôles présents par leurs noms. L'exemple suivant montre comment affecter le texte "Hello, World" à une TextBox nommée "Text1" : Dim controlName As String
controlName = "Text1"
Controls(controlName).Text = "Hello, World" L'exemple suivant montre comment changer la couleur de fond de tous les contrôles de type "TextBox" de la feuille : Dim ctl As Control
For Each ctl In Controls If TypeOf ctl Is TextBox Then ctl.BackColor = RGB(255, 0, 0) End If Next L'exemple suivant montre comment changer la couleur de fond de tous les TextBox en vert, sauf pour la TextBox nommée "Text2" (si elle existe), auquel cas on change la couleur de fond en rouge : Dim ctl As Control
For Each ctl In Controls If TypeOf ctl Is TextBox Then If ctl.Name = "Text2" Then ctl.BackColor = RGB(128, 0, 0) Else ctl.BackColor = RGB(0, 128, 0) End If End If Next End Sub L'exemple suivant affecte la propriété Caption de 4 labels (Label1, Label2, Label3 et Label4) avec 4 textes différents. On parcourt les labels avec une simple boucle For : Dim i As Integer
For i = 1 To 4 Controls("Label" & Trim$(Str$(i))).Caption = "COUCOU - " & Str$(i) Next i Variables ObjetIl est aussi possible de créer des variables objets pour référencer les contrôles de la form. Par exemple, le code suivant crée une variable permettant de garder une référence sur le contrôle text1. Puis en utilisant la variable, on change la couleur de fond à jaune : Dim MyControl As Object
Set MyControl = Text1 MyControl.BackColor = RGB(255, 255, 0) Il est aussi possible, si on connaît à l'avance le type de contrôle que l'on veut référencer de déclarer une variable avec exactement le type du contrôle, ce qui permet entre autre de bénéficier de l'intellisense. Par exemple, une variable permettant de manipuler un Label: Dim MyLabel As Label
Set MyLabel = Label1 MyLabel.Caption = "COUCOU" Les groupes de contrôlesUne alternative souvent valable pour ce genre de problématique est d'utiliser les contrôles indexés ou groupe de contrôles . Il suffit lors de la création d'affecter la propriété index du contrôle. Ainsi, pour créer 4 textBox ayant comme nom "txtSample", il suffit de créer txtSample(0), txtSample(1), txtSample(2) et txtSample(3). Note: cette focntionalité n'existe pas en VBA. Pour affecter un texte à ces 4 contrôles, une simple boucle For suffit : Dim i As Integer For i = 0 To 3 txtSample(i).Text = "Hello " & Str$(i) Next i
Il faut souligner que sauf pour des cas très particuliers de programmation avancée, un design bien réfléchi devrait permettre d'éviter d'avoir à manipuler un contrôle par son nom. Les groupes des contrôles sont une excellente solution alternative, valable dans presque tous les cas. L'usage de la collection Controls peut en revanche s'avérer utile, par exemple pour changer une propriété d'un ensemble de contrôles de même nature, comme on peut le voir dans le deuxième exemple de cet article. Pour aller plus loin |