J'ai créé un formulaire dans Excel. Il se compose de 3 boutons de commande et d'un cadre contenant des cases à cocher. Les cases à cocher sont remplies dynamiquement au userform_initialize
en fonction des tableaux d'une feuille Excel (l'idée étant la personnalisation facile de l'utilisateur). La raison de la trame est qu'il peut y avoir beaucoup de cases à cocher et je veux que l'utilisateur puisse les faire défiler.Impossible de définir Userform.KeyPreview sur true
Mon but est maintenant de créer des raccourcis clavier pour le formulaire. Où je suis coincé est que je ne peux pas force brute écrire KeyDown
gestionnaires pour chacune des cases à cocher parce que je ne sais pas lesquels existeront. Je me rends compte que ce serait aussi mieux si je pouvais avoir le gestionnaire d'événement au niveau du formulaire. Googling m'a trouvé la propriété KeyPreview
du formulaire. Malheureusement, la fenêtre de propriétés dans VBA IDE ne l'affiche pas et quand j'essaie d'y accéder par programmation en réglant Me.KeyPreview = True
à userform_initialize
VBA renvoie une erreur de compilation: "Méthode ou membre de données introuvable" - ce que je m'attendais à ce qu'il ne soit pas dans la fenêtre des propriétés, mais valait la peine d'essayer. J'ai l'impression qu'il y a quelque chose qui me manque, alors j'ai pensé que je demanderais avant de passer du temps à apprendre à écrire puis à réécrire le formulaire entièrement en classe comme dans le code MSDN: https://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview(v=vs.110).aspx. Suis-je chanceux? J'avoue être à la limite de mes connaissances VBA et je cherche à aller plus loin. Tous les concepts généraux ou le contexte que je devrais rouge seraient grandement appréciés.
MISE À JOUR
Je pense maintenant au sujet GetAsyncKeyState
et Application.Onkey
. D'après ce que je comprends, GetAsyncKeyState
fonctionne seulement dans une boucle infinie DoEvents
. J'ai essayé d'en initier un en espérant que le formulaire serait toujours chargé, mais bien sûr, il n'a pas - je suis coincé dans la boucle.
Le problème avec Application.Onkey
est que je ne peux pas affecter la fonction d'événement à la clé dans le module userform. Cela m'intrigue parce que d'autres gestionnaires d'événements peuvent aller dans le module userform. En fait, je le mettrais dans la procédure Userform_Initialize
. Est-ce parce que ce n'est pas un événement de formulaire mais un événement d'application?
EDIT
Il me semble avoir quelque chose qui fonctionne, mais pour la question étrange décrit ici: Event handling class will not fire unless I use a breakpoint when initializing form Merci @UGP
Le lien est pour VB.NET et non VBA. Cela ne peut pas simplement s'appliquer à cela. KeyPreview est seulement une méthode dans Access VBA et ne fonctionne pas dans Excel. – UGP
Peut-être que [this] (https://codereview.stackexchange.com/questions/44361/form-controls-single-event-handler-for-multiple-controls-without-sacrifices) peut vous aider. – UGP
Merci beaucoup @UGP, j'espérais jusqu'à la toute fin. L'affiche dit "KeyPress" est un cas spécial - en activant KeyPreview au niveau du formulaire, je peux capturer le KeyAscii requis dans mlastKeyPressedAscii dans l'événement Form_KeyPress du formulaire, et le transmettre ". Il semble que je suis de retour à la case départ? Aussi, mise à jour posté ci-dessus. – PKB