IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

UserForm Controls(i) modifier les indices des contrôles [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut UserForm Controls(i) modifier les indices des contrôles
    Bonjour,

    En listant les contrôles de mon Userform de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Salut,
    Dans ton cas, l'ordre de tabulation n'est pas forcément utile. Tu pourrais le régler en mode création (clic droit dans le frame ou le multipage ou l'userform).
    Ce qui serait intéressant c'est d'utiliser les événements Click() de tes CheckBox pour attribuer le focus au TectBox correspondant.

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    Oui effectivement mais je voudrais que mon instruction soit d'envoyer le focus sur le contrôle adjacent sans que j'en connaisse nécessairement le nom (autrement je peux d'ores et déjà le faire). Concernant l'instruction .SetFocus, j'ai pu constater que selon l'environnement que voient les contrôles et des évènement activés, il peut ne pas se faire.

    Pour ta remarque sur le mode création : dans la fenêtre VBE, je ne sais pas à quoi il sert : je n'en ai pas eu besoin pour créer mes boutons et autres contrôles et pour régler leurs propriétés (dont le TabIndex que j'ai réglé de sorte que dans une même Frame, les TabIndex de la CheckBox et du contrôle adjacent se suivent afin de pouvoir naviguer facilement lors de la saisie)

  4. #4
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    j'avais lu trop vite. Je relis plus tranquillement ;-)
    eric

  6. #6
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Tu pourrais peut-être regardé du coté des module de classe pour te faire ton propre composant constituer d'un chkBox et d'un TxtBox et gérer les histoire de focus directement "en interne"

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Remplacer les noms et les sources des contrôles d'un userform
    Par MarcelG dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 15/02/2010, 18h55
  2. [C#/Custom Control] Comment personnaliser les évènements des contrôles enfants ?
    Par Anto03 dans le forum Windows Presentation Foundation
    Réponses: 21
    Dernier message: 26/09/2008, 09h45
  3. C'est quoi les INDICES des triangles?
    Par Happy dans le forum OpenGL
    Réponses: 2
    Dernier message: 06/03/2006, 23h03
  4. Réponses: 4
    Dernier message: 05/01/2006, 10h01
  5. [VB.NET] Datagrid : Modifier les headers des colones
    Par burnedsoul dans le forum VB.NET
    Réponses: 9
    Dernier message: 05/11/2005, 12h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo