Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
XL 2016VBA - Évènement TextBox_Enter() non géré en module de Classe
Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
En fait c'est infernal d'essayer de trouver par le code le Control activé après une touche (Keycode), notamment à cause les touches Up et Down car elle ne vont hélas pas sur le TabIndex suivant ou précédent contrairement à Tab, mais sur le Control en-dessous ou au-dessus qu'on ne connait pas !
Donc, pour ne pas s'emm... à deviner ce qu'Excel va faire après un KeyCode, il faut capter le UserForm.ActiveControl. Mais ça ne peut se faire qu'en Asynchrone car sur la fonction KeyDown() on est toujours dans le Control qui a pris la KeyCode et on ne connait pas encore le Control sur lequel Excel va pointer. Et an Asynchrone, il faut un Module car ni la Classe ni le UserForm ne peuvent l'héberer.
re
tu n'es pas loin
ce n'est pas UserForm.ActiveControl
mais le parent.activecontrol
en fait je te dis ou j'en suis
il te faut les deux events de la même manière que je gère mes textboxs formaté
l'astuce est simple
DANS le keydown de TAB le textboX(ou le control) est celui dans le quel tu tape c'est le control actif DANS le key_up de TAB l'action est entérinée(validée) et le control actif est le suivant
Finalement on s'en fiche de savoir ce qu'un KeyCode va faire. Tab ou Up ou Down ou A, B, C, ...
Il faut juste savoir qu'un KeyCode a été entré pour se poser la question de savoir si le UserForm.ActiveControl a changé. Pareil pour un MouseUp.
Le seul problème, c'est qu'on ne peut le savoir qu'en Asynchrone comme je l'ai souligné précédemment, et hélas, cela ne peut se faire qu'avec un module, car ni la Classe ni le UserForm ne peuvent accueillir une fonction appelée par OnTime.
Donc voilà un exemple qui traite:
- Label
- TextBox
- CommandButton
Après faudra que je l'étende à d'autre Controls.
Restera à gérer aussi les fonctions Utilisateurs à appeler sur Enter() et Exit(). Pour l'instant ce ne sont que des traces sur la feuille.
re
tu n'a pas compris
il faut rien du tout pas de doevents ni rien du tout
seulement keydown et keyup (je le redit c'est comme ça que je gère mes textbox formatés et que je peux intercepter la touche
voici ou j'en sui pour le moment
je doit régler le problème des optionbutton et checkbox que la touche tab ne prends pas en compte visiblement
je vais devoir comme mes textboxs formatés bloquer la touche tab sans la bloquer en fait (astuce à bibi)
tape tab sans t’arrêter même au bout ralenti quand tu arrive avant l'optionbutton pour comprendre le problème
dans le fichier tu a l'exemple sans classe et un autre avec la classe
quand tu va tester sans classe dans le userform2 tu va comprendre tout de suite
Ouais, c'est ça !
Tu ne t'en sortiras pas à tester le Tab (9) et Enter (13) seulement.
D'abord avec Tab (9) tu as aussi Shift Tab qui fait l'inverse de Tab.
Tu as les Up, Down qui changent aussi le Focus de Controls sans relation avec le TabIndex.
A moins de forcer le Focus mais alors ce n'est plus du standard Excel.
En plus, selon les Controls, ça ne fait pas la même chose. L'enfer ! Ingérable.
Dans mon code, je me fiche de savoir si c'est Tab ou Up ou Down ou n'importe quoi d'autre.
Je ne m'intéresse qu'au Control activé après un KeyDown. Et ça c'est 100% sûr.
re
ca y est j'ai a peu près pigé ton truc pour du asyncrone c'est du asyncrone 😂
passer par 3 module(userform classe/module/userform) pour avoir le activecontrol
ben mon ami .......
si c'est vraiment que les textboxs et uniquement les textboxs qui t'interessent on aurait pu faire beaucoup plus simple
dans la classe engranger les controls(uniquement les textboxs) dans chaque instances et en même temp un tableau d'object textbox
dans le keydown case 9 ou enter mettre le keycode à 0 et focus le control suivant dans la variable tableau
avec les tab index c'est pas un problème
terminé
une classe toute minuscule
Dans cette version j'ai:
- Simplifié l'Asynchrone pour n'avoir plus qu'à passer par 2 modules (classe / module / classe)
- Placé les variables utilisées au niveau UserForm pour les garder spécifiques au UserForm au cas où on jouerait avec plusieurs UserForms Modeless simultanément
- Réorganisé / commenté les fonctions de la classe
Reste maintenant à gérer les fonctions utilisateur Enter() et Exit() et le retour d'Exit() si Cancel = True.
juste une idée comme ça en passant
je sais tu va lever les yeux au ciel mais je te soumet l'idée quand même
ne serait il pas possible de faire un set timer en addressof dans la classe afin de se passer du module qui renvoie la balle
Toute idée est bonne à prendre. Ce Module est effectivement un peu un boulet dans la structure.
Mon expérience perso de AddressOf c'est que c'est pareil que OnTime dans les Classes ou UserForm.
Mais si tu sais faire ça, je veux bien.
En attendant, j'ai déporté les TextBox_Enter() et TextBox_Exit() dans le UserForm où ils doivent être et géré le Cancel de l'Exit.
On fait ça pour se dire qu'on est arrivé à le faire mais c'est quand même une belle usine à gaz.
Surtout qu'il faudrait maintenant intégrer tous les types de Controls dans la Classe.
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD