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 :

Gestion du tabindex dans un userform


Sujet :

Macros et VBA Excel

  1. #1
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut Gestion du tabindex dans un userform
    Bonjour à tous,

    Je suis en train de travailler sur un userform de saisie qui est exclusivement constitué de boutons, labels, combobox et textbox
    qui sont créés dynamiquement en fonction de la feuille concernée.

    Tant que le traitement doit fonctionner sans contraintes, il n'y a pas de souci, avec un module de classe tout va bien.

    J'ai par contre une feuille où la saisie serait plus correcte si certains contrôles pourraient ne pas être utilisés
    selon l'ordre des rubriques de la feuille.
    Par exemple je voudrais saisir les contrôles dans l'ordre 1 5 8 2 3 4 6 7 9
    car le 5 est un combo dont dépend le combo 8 suivant qui lui va permettre de contrôler les textbox suivantes qui précédent sur la feuille.

    Pour cela j'ai essayé d'utiliser le tabindex en le mettant à zéro, dans l'ordre inverse de l'utilisation souhaitée,
    c'est-à-dire en partant de 9 pour arriver à 1,
    mais le résultat n'est pas conforme à ce que j'espérai : l'ordre récupéré n'est pas toujours le même.

    Si quelqu'un a une idée pour faire fonctionner le principe de façon correcte et fiable, je l'en remercie par avance.

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Bonjour à toi,

    Tu est parti sur le bon principe, il te faut en effet jouer avec les TabIndex de chaque contrôles pour les mettre dans l'ordre que tu désire.
    Après le TabIndex ne sert qu'à définir l'ordre lors de l'appui sur la touche Tab.

    Si tu souhaite réellement bloquer un contrôle tant que tu n'est pas passé dans celui d'avant qui en dépends tu peut le désactiver avec Enable = False

    Peut tu poster le code de ta macro qui gère cette partie la qu'on en voit un peu plus ?

  3. #3
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour,

    Merci de ta réponse encourageante et voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        For Each obj In Me.Controls
            If Not Left(obj.Name, 2) = "WT" Then obj.TabIndex = 0
        Next obj
        For col = UBound(tbr, 2) To 1 Step -1
            For ctl = UBound(tbr, 2) To 1 Step -1
                If prc(col) = tbr(1, ctl) Then
                    Me.Controls("WT_" & ctl).TabIndex = 0
                    Exit For
                End If
            Next ctl
            If ctl < 1 Then MsgBox "Erreur : " & prc(col)
        Next col
    Comme cela ne fonctionnait pas j'ai commencé par traiter les contrôles non combo/textbox
    pour ensuite positionner en tête les contrôles de saisie mais certains tabindex générés sont au-delà du nombre de mes combo/textbox.

    prc est la table de mes rubriques dans l'ordre où je les veux
    tbr est la table des rubriques dans l'ordre des contrôles.

    Il y a peut-être une faille que je ne vois pas, pourtant c'est presque bon.

  4. #4
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Dans un premier temps il faut établir l’ordre des contrôles quelques part pour chaque feuille.

    Genre dans une feuille caché tu fais un petit tableau :
    Nom de feuille Ordre contrôles
    Feuille1 Txt1;Cmb2;Ctrlxxx
    Feuille2 Cmb2;Ctrlxxxxx;Txt1

    Ensuite à l'ouverture de ton USF tu va chercher par rapport au nom de la feuille concerné l'odre des contrôles appliquer.
    Tu Split sur ; et tu parcours le résultat et tu applique le TabIndex dans l'ordre en partant de 0 puis tu défini le focus sur le contrôle que à le TabIndex à 0

  5. #5
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Citation Envoyé par cerede2000 Voir le message
    Dans un premier temps il faut établir l’ordre des contrôles quelques part pour chaque feuille.
    C'est bien ce que j'ai dans mes deux tables mémoire tbr et prc


    tu applique le TabIndex dans l'ordre en partant de 1 puis tu défini le focus sur le contrôle que à le TabIndex à 1
    en recréant le tabindex de cette façon, cela ne fonctionne pas car si je met le tabindex 3 au contrôle 8 par exemple, cela perturbe tous les autres et l'on obtiens un peu n'importe quoi car excel ne gère pas de trou dans sa table. C'est pour cela que j'étais parti sur ma solution en ordre inverse.

    Je vais modifier mon algorithme pour faire selon ta proposition et je te donne le résultat.

  6. #6
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Il faut absolument tous les renseigner en partant de 0 vers le plus haut.

    Car si l’ordre n'est pas respecté et cohérent ils se retrouvent numéroté aléatoirement

    D'ou la liste dans l’ordre souhaité avec incrément de 0 à Nombre de contrôle avec le TabIndex défini par cet incrément

  7. #7
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonsoir,

    Citation Envoyé par cerede2000 Voir le message
    Il faut absolument tous les renseigner en partant de 0 vers le plus haut.
    Je sais bien que c'est le fonctionnement obligatoire mais si tu veux mettre 0 dans le contrôle 1, il y a déjà un contrôle à zéro
    et cela perturbe le fonctionnement. Voilà ce que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tabulations affectées
    0 - 2 - 7 - 1 - 3 - 4 - 5 - 6 - 8 - 9 - 10 - 11 - 12 - 14 - 13 - 15 - 16 - 17 - 18 - 19 - 20 - 21 
    tabulations effectives
    0 - 3 - 1 - 4 - 5 - 6 - 7 - 2 - 8 - 21 - 9 - 10 - 11 - 13 - 12 - 14 - 15 - 16 - 17 - 18 - 19 - 46
    J'ai bien affecté les contrôles dans l'ordre souhaité :
    contrôle 1 => tabindex 0
    contrôle 3 => tabindex 1
    contrôle 8 => tabindex 2
    contrôle 2 => tabindex 3 etc

    Dès le second c'est faux

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heu
    Bonjour

    je pense pas qu'il faille se prendre la tete a remettre les tabindex a leur places
    puisque tu construit dynamiquement et donc utilise une classe
    a la construction met dans tag du ctrl le nom ou ce que tu veux du ctrl suivant

    et dans l'évènement associé dans ta classe tu agi en fonction du tag
    alors oui prépare tes deux array et fait avec pendant la construction
    et pour palier a la touche Tab ou autre tu a les évènement onkeypress qui se gèrent aussi dans la classe de la même manière que dans le userform
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Ben j'ai fais un test rapide avec 10 TextBox je n'ai pas le souci.
    J'ai rajouté le fait de rajouter 10 a chaque TabIndex au cas ou....

    Je te le joint.
    Classeur1.xlsm

    Edit : Hey patricktoulon ! Non justement il ne construit pas dynamiquement son USF.
    Ses contrôles sont déjà présent, il change juste l'ordre de tabulation

    Edit 2 : je confirme ce bout la n'est pas nécessaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        For Each ctrl In Me.Controls
            ctrl.TabIndex = ctrl.TabIndex + 10
        Next
    Tu peux le virer.

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    salut cefede2000 dans ce cas la c'est mal pensé des le départ
    surtout que si je ne me trompe pas si il part de zero ca va buguer car peut etre surement d'ailleurs!!!!! ce tab index est utilisé
    je sais pas si on pourrait partir d'un index du genre me control.count*2.1
    et descendre vers le dernier

    si vba l'accepte ca peut passer
    mais je le redis c'st mal pensé
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Je ne vois pas pourquoi.

    Il est tout à fais prévu de pouvoir changer le TabIndex de cette manière.
    Le premier contrôle devant être mis à 0 puis 1, 2, 3.....

    Mon exemple fonctionne très bien

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    je l'ai fait dans un fichier vierge et effectivement
    on peut changer les tabindexs sans prendre en considérations les index déjà en places

    je suis étonné on pouvait pas avant ca c'est sur car quand j'ai débuté je me prenait la tète avec ca et je me souviens que ca n'était pas possible a moins de partir d'index plus haut et inexistants
    bon ben voila
    un array dans l'ordre choisi et une boucle sur cet array en mettant la variable d'incrémentation comme tabindex et ca suffit
    ca fonctionne chez moi
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  13. #13
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Exactement ce que j'ai dans mon exemple....

    Je n'ai jamais eu de soucis avec les TabIndex et j'en ai géré !
    Ce qu'il m'est arrivé de faire en effet c'est augmenter tous les TabIndex du nombre de controls pour pas avoir de doublons puis les renumérotés.

    Mais depuis un moment ils sont gérés sans soucis juste en les réindexants

    Pas si mal pensé que ça finalement....

  14. #14
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    c'est une méprise sur ce que j'ai dis
    c'est pas ta proposition qui est mal pensé mais le fait d'être obligé de faire ca surtout avec des controls existant
    et toi meme tu viens de le dire tu index plus haut pour les doublons hors maintenant c'est plus la peine visiblement c'était ma dernière remarque dans mon précédant post
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  15. #15
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Je suis parti de la demande initiale qui est de pouvoir gérer l'ordre de tabulation

    Il semble que ça suffise à répondre au besoin sans partir dans une fabrique d'USF avec gestion de contrôles dynamique
    Tiens ça me rappel quelques chose

    Ce n'est pas en soit trop déconnant, je pense qu'il faudrait tout de même rajouter une petite couche d'activation/désactivation des contrôles pour les rendre interdépendants.

  16. #16
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonsoir à vous deux,

    Citation Envoyé par patricktoulon Voir le message
    dans l'évènement associé dans ta classe tu agi en fonction du tag
    alors oui prépare tes deux array et fait avec pendant la construction
    et pour palier a la touche Tab ou autre tu a les évènement onkeypress qui se gèrent aussi dans la classe de la même manière que dans le userform
    Effectivement j'utilise les classes get et lost focus mais si l'on veux revenir sur un contrôle précédent cela pose des problème car il faut alors ne pas forcer le suivant.
    C'est pour cela que le tabindex me paraissait plus adapté.

    Citation Envoyé par cerede2000
    Edit : Hey patricktoulon ! Non justement il ne construit pas dynamiquement son USF.
    Ses contrôles sont déjà présent, il change juste l'ordre de tabulation
    Et si !
    Citation Envoyé par anasecu
    userform de saisie qui est exclusivement constitué de boutons, labels, combobox et textbox qui sont créés dynamiquement en fonction de la feuille concernée
    Par contre je suis sidéré ! mais bon il doit y avoir un truc que je ne vois pas

    Sur ton classeur, j'ai créé un second formulaire dynamique avec labels, textbox et combo et cela fonctionne nickel !!!

    Je pensais que cela pouvait venir de ma syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Controls("WT_" & ctl).TabIndex = idx
    mais en prenant la tienne mon classeur ne veux pas m'obéir !

    Citation Envoyé par patricktoulon
    je suis étonné on pouvait pas avant ca c'est sur car quand j'ai débuté je me prenait la tète avec ca et je me souviens que ca n'était pas possible a moins de partir d'index plus haut et inexistants
    bon ben voila
    Tilt ! j'avais mis mon classeur en xls car un utilisateur est en 2003 et Patrick me donne la raison !

    eh bien pas du tout le classeur de test avec formulaire dynamique fonctionne parfaitement en xls sous 2003.
    le voilà cerede2000.xls
    Par contre le mien continue de me mélanger les tabindex avec le même code.

    Il y a sans doute un truc à trouver ... après une bonne nuit

    Bonne nuit à vous et merci pour la confirmation que la procédure devrait fonctionner !

  17. #17
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Tu construit les controles de ton USF en dynamique ???

    Alors pourquoi ne pas mettre dans le bon ordre a la création ?

  18. #18
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour,

    Citation Envoyé par cerede2000 Voir le message
    Alors pourquoi ne pas mettre dans le bon ordre a la création ?
    Bien sûr, c'est une idée sauf que le monde ne se crée jamais de zéro.

    Le formulaire que je construit est un peu plus complexe qu'un test bidon.
    Les contrôles n'ont pas tous la même taille en fonction des données à saisir.
    Les combobox contiennent des données d'autres feuilles qui alimentent certaines rubriques
    et c'est entre autre la raison de mon idée d'utiliser tabindex.

    Comme tu m'as prouvé que cela fonctionne, il n'y a pas de raison que je n'arrives pas à trouver la faille dans mon classeur.
    Il n'est pas toujours profitable de contourner l'obstacle car l'on progresse plus en découvrant la raison.

    Merci en tout cas pour ton exemple qui me rassure.

  19. #19
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut et
    re
    et oui c'est un peu l'erreur des débutant une chose après l'autre mais dans le cas qui te concerne c'est pas la chose a faire visiblement

    tu dis que tu construit tes contrôles dynamiquement
    alors tu dois faire un truc du genre

    add control textboxs puis add control textboxbox2 puis add listbox puis list box .list patin couffin etc.....

    alors que ta construction dynamique doit se faire dans l'ordre de tabulation puis seulement!!!!!! après remplir tes combo ,list textbox label etc

    et comme ca tu n'aura pas de soucis d'ordre de tabindex

    construit d'abords tes controls dans l'ordre que tu souhaite et ensuite tu leur donne les instructions

    si tu a des labels devant chaque controls fait d'abords tout ceux la ensuite fait tes contrôles dont tu te sert, ils seront dans l'ordre tu verra
    c'est pas grand chose a changer dans ton classeur
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  20. #20
    Invité
    Invité(e)
    Par défaut
    bonjour,
    le TabIndex permet d'identifier l'ordre de tabulation. comme le suggère Patrick,il te sufis de modifier l'ordre de création de contrôles pour modifier l'ordre de tabulation.

    mais visiblement ton problème est de passer certaine tabulation, pour cela il existe TabStop qui vas te faire passer les contrôles à éviter dans la tabulation!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.TextBox1.TabStop = False
    note que ça n'interdit pas l'utilisateur de clicker sur un contrôle et d'en effectuer la saisie!

    si tu veux que l'utilisateur ne puisse saisir certaines données sens en avoir saisie d'autre avant,dan ce cas, il faut en interdire dynamiquement l'accès!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.TextBox1.Enabled = False

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2007] Gestion Erreur dans un userform - CDate
    Par mouftie dans le forum Excel
    Réponses: 4
    Dernier message: 31/03/2014, 13h01
  2. Réponses: 14
    Dernier message: 20/05/2012, 16h55
  3. Gestion des headers dans un Makefile
    Par Weren dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 09/11/2004, 10h44
  4. Gestion du blit dans un moteur2D
    Par Fry dans le forum DirectX
    Réponses: 2
    Dernier message: 01/11/2004, 02h05
  5. [VB6] Gestion des erreurs dans une dll
    Par zimba-tm dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/08/2004, 11h20

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