Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Actions VBA sur touches du clavier
Avec les travaux précédents, nous avons vu comment
gérer des événements spéciaux, comme ceux des feuilles ou encore ceux concernant les
intervalles de temps. Ici, nous allons apprendre à déclencher des actions lorsque des
touches spécifiques du clavier sont enfoncées.
Sur l'exemple illustré par la capture, nous travaillons sur une
base de données volumineuse. Elle est composée de plusieurs centaines de lignes. Nous souhaitons améliorer la
vitesse de navigation au travers des lignes de ce tableau. Usuellement, si vous enfoncez les
touches PageUp et
PageDown, vous faites défiler les lignes vers le haut et vers le bas, sur un nombre équivalent à celui de la quantité de lignes visibles à l'écran. Mais ici, en fonction d'indications saisies dans des cellules situées sur la droite de la feuille, avec les mêmes touches, nous sommes capables de progresser de
plusieurs centaines de lignes à la fois, que ce soit vers le haut ou vers le bas. Il est donc question d'intercepter ces touches lorsqu'elles sont enfoncées et de gérer les actions associées.
Classeur Excel à télécharger
Pour découvrir comment déclencher des actions maîtrisées sur des
touches précises du clavier, nous suggérons d'appuyer l'étude sur un
classeur Excel offrant cette
base de données.
Si vous enfoncez les
touches PageUp et
PageDown, généralement situées en haut à droite du clavier, vous faites défiler les lignes du tableau d'une quantité usuelle. Mais comme vous le constatez, des cases sont prévues sur la droite de la feuille pour personnaliser ces incréments. Il s'agit des
cellules H7 et
H11. Avec les valeurs qu'elles portent à ce stade, elles indiquent que nous souhaitons progresser de
150 lignes à la fois, dès que l'une ou l'autre de ces touches est enfoncée.
Comment écouter les touches ?
Le premier dilemme qui se dresse consiste à savoir comment intercepter les
actions de l'utilisateur au clavier. En effet, bien que le
VBA Excel offre de nombreux gestionnaires attachés aux événements survenant sur les feuilles, aucun ne concerne les
touches du clavier.
Mais une ruse intermédiaire permet de nous placer sur la bonne voie. Si l'utilisateur enfonce l'une de ces deux touches, un
changement de sélection est inévitablement observé. Nous allons donc commencer par travailler dans la
procédure événementielle qui détecte le
changement de sélection sur la feuille.
- Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Excel,
- Sur la gauche dans l'explorateur de projet, double cliquer sur l'élément Feuil1 (Id2sorties),
Nous affichons ainsi au centre de l'écran, la
feuille de code VBA associée à la
base de données du classeur.
- En haut de la feuille de code, déployer la liste déroulante de gauche,
- Dans les propositions, choisir l'objet Worksheet,
Nous créons ainsi la
procédure événementielle Worksheet_SelectionChange. Son code se déclenchera à chaque fois qu'un changement de sélection sera observé sur la feuille.
Gestionnaires d'événements à la volée
Pour autant, ce n'est pas elle qui va déterminer quelle est la
touche que l'utilisateur a enfoncée. Mais lorsque nous avions appris à gérer les
intervalles de temps, nous avions compris qu'il était possible de produire des
gestionnaires d'événements à la volée. Pour
écouter les touches du clavier, le principe est le même. Et le
gestionnaire que nous devons déclencher se nomme
OnKey.
- Dans les bornes de la procédure événementielle, ajouter les deux lignes VBA suivantes :
...
Application.OnKey "{PgUp}", "Monter"
Application.OnKey "{PgDn}", "Descendre"
...
Ce
gestionnaire OnKey attend deux paramètres et comme vous pouvez le voir, nous en créons deux pour gérer les deux touches. Ce sont les valeurs de ces touches que nous passons entre accolades en premier argument. En second paramètre, nous indiquons les actions à entreprendre quand la touche mentionnée en premier argument est enfoncée. En guise d'actions, nous appelons les
procédures Monter et
Descendre. Elles n'existent pas encore. Nous allons devoir les créer dans un nouveau module pour qu'elles puissent engendrer les
déplacements en respectant le nombre de lignes désiré et mentionné par l'utilisateur sur la feuille Excel.
Naviguer au travers des lignes
Une propriété semblable à la
fonction Excel Decaler permet de maîtriser les déplacements à effectuer. Cette propriété s'applique sur la
cellule active (ActiveCell). Elle se nomme
Offset.
- En haut de l'éditeur VBA Excel, cliquer sur le menu Insertion,
- Dans les propositions, choisir l'option Module,
Nous créons ainsi un nouveau module et sa feuille de code apparaît au centre de l'écran.
- Dans cette feuille de code, créer les deux procédures Monter et Descendre, comme suit :
...
Sub Monter()
On Error Resume Next
ActiveCell.Offset(-[H11].Value, 0).Activate
End Sub
Sub Descendre()
On Error Resume Next
ActiveCell.Offset([H7].Value, 0).Activate
End Sub
...
Nous créons tout d'abord un
gestionnaire d'exceptions (On Error Resume Next) pour éviter que le code ne plante lorsque le déplacement n'est plus possible (première ou dernière ligne atteinte). Ensuite, nous exploitons en effet la
propriété Offset de l'
objet ActiveCell pour opérer un
déplacement sur le nombre de lignes spécifié (Vers le haut : -[H11].Value ou vers le bas : [H7].Value). Bien sûr, nous restons dans la même colonne (0). Et nous exploitons la
méthode Activate pour donner le focus à la cellule de réception. C'est ainsi que le
déplacement est effectif.
- Enregistrer les modifications (CTRL + S) et basculer sur la feuille (ALT + Tab),
- Modifier les valeurs des incréments en cellules H7 et H11,
- Cliquer dans une cellule au début du tableau, par exemple D4 pour la sélectionner,
- Puis, enfoncer la touche PageDown à plusieurss reprises,
Comme vous pouvez le voir, nous avons adapté et accéléré la navigation au travers de cette base de données volumineuse grâce à des gestionnaires capables d'intercepter et d'interpréter les touches enfoncées. Cette astuce ouvre de nombreuses perspectives pour de nouvelles solutions ergonomiques à développer.