Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Userform : Astuce pour pourvoir utiliser le bouton UnLoad Me - quand exit Cancel sur textbox

RyuAutodidacte

XLDnaute Impliqué
Bonjour à tous en ce dimanche,

Dans un UserForm (Pas de code ActiveX svp qui ne sont pas géré chez moi) , j'ai 2 TextBox qui utilisent un event Exit.
Pour les TextBox : Tant que les conditions ne sont pas remplis (donnée valide) le Exit est en Cancel True et garde donc le focus

Ce que j'aimerai et malgré ce focus est une astuce qui me permettrait quand même de pouvoir cliquer sur le Bouton qui UnLoad me
Déjà est ce possible ? et si oui comment svp ?
 
Solution
Il y a 2 problèmes:

1 - Le MsgBox à la sortie duquel un _Exit() / Cancel = True ne repositionne pas le curseur dans la TextBox qui a gardé le Focus si le UserForm a été affiché en vbModeless.

2 - Forcer la sortie du UserForm dans un _Exit() / Cancel = True

Le problème #1 se règle avec un Application.OnTime (voir le module dédié Module_SetFocus dans le fichier)

Le problème #2 est beaucoup plus délicat, car même en appuyant sur un CommandButton, l'_Exit() sera exécuté en priorité et un _Exit() / Cancel = True empêchera l'exécution du _CommandButton_Click() !!!

Les solutions:

a) - Accepter une saisie...

patricktoulon

XLDnaute Barbatruc
re
bonsoir
pour ma part et pour avoir testé diverses choses ,tout ce toin toin autour de l'event exit n'est que de l'exercice de style
et je pense que contrairement ce qui a été dit ,dans messages précédents ,il est très bien conçu
comme je l'ai dis au départ s,i il doit y avoir retour sur le textbox
avec l'event click sur un bouton (par exemple) sans focus on peut très bien le renvoyer dessus
et si le exit est auto déclenché autant se servir du enter(voir d'un autre event) du next control
et au pire (et surtout !!!)en dernier recours on utilise simplement le cancel=true
et une dernière
j'aimerais rappeler que comme je l'ai montré tant de fois , les events de substitution(classe ou subclassing intra userform) ne réagissent pas de la même manière
donc méditer
avant de se lancer dans une usine a gaz pour quelques textboxs

et peut être regarder aussi dans le formatage et assistance saisie de textbox qui utilisent les event keydown ou keypress avec mask de sasie ce qui est un plus en terme visuel




 

Dudu2

XLDnaute Barbatruc
Le bouton ou le Enter d'un autre contrôle pour remplacer l'Exit() du contrôle concerné c'est de la pure daube.

D'abord par ce que cliquer sur un bouton pour valider une zone parmi N ça n'a aucun sens.
On ne peut pas passer son temps à cliquer sur des boutons à moins de faire un contrôle global de toutes les zones sur un bouton Valider. Ce qui n'est absolument pas applicable quand la saisie d'autres zones est conditionnée par la valeur du Control saisi dont l'Exit() permet le traitement.

Ensuite parce que le Enter d'un autre contrôle n'a de signification que si l'utilisateur veut bien y entrer, ce qui est totalement impossible à prévoir dans des formulaires un peu plus que basiques.

Quant aux KeyDown() c'est pareil. C'est bien pour intercepter de l'Escape ou autre. Mais pour intercepter la sortie d'un Control qui peut se faire par Enter, Tab, Maj+Tab, clic de souris dans un autre Control, c'est pipo.

Si je publie ces ressources (une à venir sur le SetFocus en Control.Exit()) c'est parce que je suis précisément confronté à ces problèmes que je n'ai pas inventés, utilisant souvent des UserForms Modeless.
L'utilisateur est friand d'ergonomie (replacement automatique du curseur dans la zone, positionnement sur une Control variable selon la valeur saisie...) surtout si c'est un professionnel qui passe son temps sur les exports récupérés de ses clients.

D'ailleurs je ne te demande pas ton avis, je fais ce dont mes utilisateurs ont besoin et je partage le résultat des mes trouvailles. Ce n'est pas pour toi qui sais déjà tout et es le seul à faire les choses comme il faut.

Edit: j'ajouterais que peu importe que les fonctions utilitaires soient (si peu) complexes et perçues avec la bienveillance habituelle d'usines à gaz. Ce qui est important c'est que leur utilisation soit simple et sûre car la complexité apparente est au service de la simplicité.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonjour
1° non je ne sais pas tout

2° moi, je n'ai jamais dis que ce que tu fais c'est de la daube , mais de l'exercice de style, chose que je pratique moi aussi, mais ce n'est que de l’amusement cérébral

3° si tu pousse un peu plus tes investigations , tu te rendra compte pourquoi j'ai parlé de click sur un eventuel bouton ou le enter (ou autre event )d'un autre textbox ou control

D'ailleurs je ne te demande pas ton avis, je fais ce dont mes utilisateurs ont besoin et je partage le résultat des mes trouvailles. Ce n'est pas pour toi qui sais déjà tout et es le seul à faire les choses comme il faut.

4° pardon je pensais être dans un forum c'est pour ça que je donne mon avis
je pensais que vu que je suis la discussion depuis le début j'avais une certaine légitimité a donner mon avis mille excuses

5° je te renvoie a ma réponse 3

exemple
j'ai un userform avec 3 textbox qui doivent être contrôlés

pour les tests, je vais simplement déclencher un msgbox dans le exit
VB:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
MsgBox "cc1"
End Sub
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
MsgBox "cc2"
End Sub
Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
MsgBox "cc3"
End Sub

et bien tu n'a pas 36 solutions
le seul moyen que tu a de sortir du textbox quel qu’il soit et donc de déclencher l'exit , c'est:
soit la touche enter
soit la touche flèche haut et bas(selon la position dans le "TabIndex"
soit la sélection d'un autre control avec la souris
soit la sortie (la fermeture du userform)

donc au final par extrapolation on peut pratiquement dire que c'est le focus (ou click ou autre )sur un autre control qui déclenche l'exit
sauf que l'event exit déclenché avec un code à exécuter , tu n'a plus la main (sauf comme je l'ai dis précédemment avec le cancel)
tandis qu'avec l'event enter ou autre d'un autre control là!!!!! tu a la main (ET AU MOMENT DIT ET VOULU !!!)
et en utilisant ces autres event tu n'a pas le problème à la fermeture du userform

voilà

et ça te dispense de faire du code et d'alourdir tes apps
de plus on est pas à l'abri d'un retard dans l'event exit du à une faiblesse ou manque de puissance du pc(déjà vu)

pour moi et c'est primordial le control d'une donnée dans un textbox doit être pilotée par l'utilisateur
pas des pseudos automatismes alambiqués qui tôt ou tard vont te jouer des tours

on pourrait aussi parler de la responsabilité de l'utilisateur ( mais c'est un autre débat)

j'ai parlé tout a l'heure d'investigation
pose toi la question pourquoi l'event click (exemple parmi d'autres) n'a pas de callback( et donc pas d'argument dans ces parenthèses)
 

Dudu2

XLDnaute Barbatruc
Bonjour,

Je maintiens qu'utiliser l'_Enter() d'un autre contrôle, et encore plus un KeyDown(), n'est pas une méthode réaliste. Sauf si il y a 2 TextBoxes qui se battent en duel dans le UserForm.

Ou alors il faudrait prévoir sur TOUS les Controls, un _Enter() qui traite potentiellement de TOUS les Controls précédents possibles, qu'il faudrait en plus maintenir dans une variable Private UserForm car un Control_Enter() ne sait pas quel était le Control actif précédent. Je ne vois pas la rationalité de cette approche.

La question du Bouton est différente car il s'applique en général à un ensemble de Controls voire au UserForm entier.

Bref, je ne vais pas polémiquer davantage sur cette question car la ressource que j'ai publiée:
n'est pas directement liée à la fonction _Exit() mais à un point d'ergonomie sur des UserForms vbModeless, certes un détail à l'échelle unitaire, mais qui devient significatif avec la répétition des situations en usage intense.

J'attends la publication de 2 nouvelles ressources:
  • VBA - De l'usage de la fonction évènement _Exit() sur une TextBox ou ComboBox de UserFom
    Qui explique la problématique particulière d'un Cancel = True en Control_Exit().
    Et fait référence à la ressource ci-dessous.

  • VBA - SetFocus dans une fonction d'évènement Control_Exit()
    Qui illustre l'incapacité de VBA à gérer correctement le SetFocus en Control_Exit() et donne une solution.
J'ajoute (encore une fois) que si je poste ces ressources, ce n'est pas pour le plaisir de faire du VBA et susciter des polémiques avec mon cher collaborateur et ami @patricktoulon, mais parce que j'ai été confronté à ces problèmes en développement applicatif réel face à la demande d'utilisateurs et ai dû trouver des solutions.
 
Dernière édition:

RyuAutodidacte

XLDnaute Impliqué
Hello tous @patricktoulon et @Dudu2
pour ma part, lors de la création de ce post les réponses que vous m'aviez apporté à l'époque tous les 2 mon servies et à permis de régler mes problèmes …
Il y a différentes façon de coder pour un même problème et parfois des contournements à certaines réactions du code, mais le principal c'est que le problème soit régler et que les actions demandés se fassent comme voulu.
Et un code peu très bien marcher et rapidement même si il est pas optimisé à fond … même optimisé on peut toujours aller plus loin en terme d'optimisation (extréme)
En tout cas je n'ai eu aucun retour des utilisateurs sur ce point avec le code que j'ai conçu avec votre aide.

Le forum permet de donner des points de vues qui font avancé avec l'échange des idées, même si les points de vue peuvent diverger. Le principal et que la plupart y retrouve leur compte …
Je sais que vous avez créer des ressources tous les 2 et c'est le retour des ces commentaires qui pourront remonter les améliorations à faire si il y en a …
Biz Ryu
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…