XL 2016 VBA - Évènement TextBox_Enter() non géré en module de Classe

Dudu2

XLDnaute Barbatruc
Bonjour,
Alors l'évènement _Enter() n'est pas géré en Classe ? Une solution ?
 

Pièces jointes

  • Test Classe.xlsm
    40.3 KB · Affichages: 5
Dernière édition:

Dudu2

XLDnaute Barbatruc
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.
 

patricktoulon

XLDnaute Barbatruc
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
 

Dudu2

XLDnaute Barbatruc
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.
 

patricktoulon

XLDnaute Barbatruc
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
 

Pièces jointes

  • classe enter exit version 3.xlsm
    26.4 KB · Affichages: 2

Dudu2

XLDnaute Barbatruc
tu n'a pas compris
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.
 

patricktoulon

XLDnaute Barbatruc
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
 

Dudu2

XLDnaute Barbatruc
passer par 3 module(userform classe/module/userform) pour avoir le activecontrol
Je vois que tu as pigé le truc.

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.
 

Pièces jointes

  • Classe Event TextBox Enter() et Exit().xlsm
    39.5 KB · Affichages: 0
Dernière édition:

Dudu2

XLDnaute Barbatruc
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.
 

Dudu2

XLDnaute Barbatruc
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.
 

Discussions similaires

Réponses
6
Affichages
454
Réponses
29
Affichages
2 K

Statistiques des forums

Discussions
314 634
Messages
2 111 445
Membres
111 139
dernier inscrit
Double-V