UserForm Controls(i) modifier les indices des contrôles
Bonjour,
En listant les contrôles de mon Userform de cette façon :
Code:
1 2 3 4
| Dim i As Integer
For i = 0 To ActiveControl.Controls.Count - 1
Debug.Print i, ActiveControl.Controls(i).Name
Next i |
Je me suis rendu compte que l'ordre était totalement aléatoire en apparence. Il me semble que l'ordre (l'indice) des contrôles est en fait leur ordre de création. Cependant, cela ne me convient pas et j'aimerais donc pouvoir modifier ces indices mais je ne parviens pas à trouver comment faire
Pour des raisons de lisibilité, mes contrôles sont nommés ainsi, chaque chekbox étant en face de sa textbox :
- CheckBoxNom
- TextBoxNom
- CheckBoxPrénom
- TextBoxPrénom
- ...
Je voudrais que le premier indice soit celui de CheckBoxNom, le deuxième celui de TextBoxNom etc.
Mon but est de créer une fonction générique qui active le champ à renseigner par clic sur la checkbox quelque soit son type (j'arrive à le faire en utilisant .Replace et TypeName() entre checkbox et textbox et je pourrais utiliser un Select Case sur l'ordre de création des contrôles mais ça fait un peu bricolage)
Du coup j'en fais appel à vos conseils. Si j'ai raté de la doc je suis preneur aussi :)
Parcours des contrôles avec une boucle et test sur le TabIndex
D'après ce que j'ai pu constater dans mes recherches, la modification des indices des contrôles (qui correspondent bien à la chronologie de leur création) n'est pas possible.
J'ai néanmoins trouvé une alternative : parcourir les contrôles avec une boucle For Each (d'autres types de boucle sont également possibles bien entendu) et faire un test d'égalité entre indice de la boucle et la propriété .TabIndex du contrôle.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| Private Sub UserForm_Activate()
Dim ctrli, ctrlj As Control
Dim intCurrentTabIndexi, intCurrentTabIndexj As Integer
intCurrentTabIndexi = 0
For Each ctrli In Me.Controls
intCurrentTabIndexj = intCurrentTabIndexi
For Each ctrlj In Controls
If ctrlj.TabIndex = intCurrentTabIndexi Then Debug.Print intCurrentTabIndexi, ctrlj.Name, ctrlj.TabIndex
Next ctrlj
intCurrentTabIndexi = intCurrentTabIndexi + 1
Next ctrli
End Sub |
Notes : si vous n'avez pas modifié les les valeurs des .TabIndex, elles sont égales aux indices de leurs contrôles et donc une seule boucle suffit et les deux boucles imbriquées donnent les mêmes résultats cependant dès que les .TabIndex sont modifiés, une boucle seule n'affiche plus rien ! Deux boucles sont donc nécessaires et ce d'autant plus que si on parcourt en faisant des tests sur les .TabIndex c'est justement qu'on les a modifiés...