Les autres événements

On peut demander à VBA d'exécuter quelque chose à une heure précise, ou dans quelques muinutes, ou lorsqu'on fait Edition/Annuler. Voici tous les événements possibles :

Tous les événements s'appellent comme suit : Par exemple, imaginons que nous voulions exécuter la procédure AllonsY à 17 heures 15 précises. Pour ce faire, il faut exécuter la macro test à 17 heures 14,, aattendre une minute devant son écran. Après une minute d'attente, vous aurez un message "Il est dix-sept heures quinze !"

Sub Test()
  Application.OnTime ("17:15:00"), "AllonsY"
End Sub

Sub AllonsY()
  MsgBox "Il est dix-sept heures quinze !"
End Sub

Les différents appels seront donc :

- Application.OnKey
- Application.OnTime
- Application.OnRepeat
- Application.OnUndo
- Application.OnWindow

OnKey

Quand on presse sur une touche, ou une combinaison de touches. Ca complète d'ailleurs de façon plus exhaustive la fonction existante qui permet d'assigner l'appel d'une macro à CTRL-X (X étant une lettre ou un chiffre) - Voyez cela dans Outils/Macros/Macros, choisissez la macro que vous désirez exécuter avec CTRL-M par exemple, et cliquez sur Options, écrivez M, et Ok. Chaque fois que vous ferez CTRL M, cette macro s'exécutera. Ici, l'avantage de OnKey, c'est que ça ne s'arrête pas à CTRL-QuelqueChose. Attention donc aux conflits : On peut très bien définir CTRL-M appelle une certaine macro, et définir également CTRL-M avec OnKey. Je n'ai pas testé comment Excel gère cette situation.

Exemple 1 : Quand on appuie sur a, quelle que soit le classeur, feuille et la cellule dans laquelle on est, la procédure AllonsY sera exécutée (Excel affichera OK à chaque fois qu'on pressera sur a). Attention : Il faut qu'on appuie sur a directement. Si on se trouve dans une cellule et qu'on veut écrire abricot, on ne pourra pas, car on aura sans arrêt OK qui va s'afficher à la place de a. Mais par contre, on pourra écrire sans problème banane, car ce n'est pas la première lettre du mot.

Sub Test2()
  Application.OnKey "a", "AllonsY"
End Sub

Sub AllonsY()
  MsgBox "ok"
End Sub

Attention : Une fois que la procédure Test2 a été lancée, elle a assigné une fois pour toutes AllonsY à chaque frappe de la lettre a. C'est à dire qu'a partir de maintenant, on ne peut plus s'en débarasser jusqu'à ce qu'on ferme Excel et qu'on le rouvre. Le seul fait de fermer le classeur dans lequel se trouve Test2 ne désactive pas le OnKey, et quelque soit le classeur dans lequel on se trouve ensuite, Excel ira jusqu'à Rouvrir dans notre dos le classeur ou se trouve Test2 pour pouvoir l'exécuter.
Et ca va même plus loin : Même si on modifie la procédure OnKey pour dire que ce n'est plus a, mais b qui est capturé, alors a ET b appelleront la procédure AllonsY, même si a n'a plus rien a voir la dedans... Etrange... Comme si c'était une procédure résident en mémoire de manière indécrottable.

Exemple 2 :

Nous capturons maintenant SHIFT b (B majuscule)
Application.OnKey "+b", "AllonsY"

Exemple 3 :

CTRL ALT SHIFT ESCAPE : application.OnKey "%+^{ESC}", "AllonsY"

Liste des raccouris clavier

Chacun de ces raccouris peut-être accompagné d'une touche de contrôle : SHIFT, ALT et CTRL

MAJ est représenté par +
CTRL est représenté par ^
ALT est représenté par %

"%{F4}" = ALT F4

"+a" = SHIFT a

"^{ENTER}" = CTRL ENTER

Pour plus d'informations, cherchez SendKeys dans l'aide Visual Basic pour Excel

Rubriques

Touches
Syntaxe
Effacements

SUPPR (Del, Delete)

{DELETE} ou {DEL}

Retour arrière (Backspace)

{BACKSPACE}, {BS} ou {BKSP}

Petites lumières au dessus du pavé numérique

VERR.NUM (Num Lock () Au dessus de 7 dans le pavé numérique)

{NUMLOCK}

ARRÊT.DÉFIL (Scroll Lock)

{SCROLLLOCK}

VERR.MAJ (Caps Lock (Majuscules))

{CAPSLOCK}

Page Up, Page down

PG.SUIV (Pg Dn, Page Down)

{PGDN}

PG.PRÉC (Pg Up, Page Up)

{PGUP}

Flèches de direction

HAUT (Flèche vers le haut)

{UP}

DROITE (Flèche vers la droite)

{RIGHT}

GAUCHE (Flèche vers la gauche)

{LEFT}

BAS (Flèche vers le bas)

{DOWN}

Home, End

ORIGINE (Home)

{HOME}

FIN (End)

{END}

Touches de fonction

F1

{F1}

F2

{F2}

F3

{F3}

F4

{F4}

F5

{F5}

F6

{F6}

F7

{F7}

F8

{F8}

F9

{F9}

F10

{F10}

F11

{F11}

F12

{F12}

F13

{F13}

F14

{F14}

F15

{F15}

F16

{F16}

Divers

ATTN

{BREAK}

ENTRÉE (Enter, Return)

{ENTER}ou ~

ÉCHAP (Esc, Escape)

{ESC}

INSERTION (Ins, Insert)

{INSERT} ou {INS}

IMPR. ÉCRAN (Print Screen)

{PRTSC}

TAB (Tabulation)

{TAB}

AIDE

{HELP}

   

 

OnTime

Quand on arrive à une certaine heure

Exemple 1 : Démarrage de Allonsy à 17 heures 15

Sub Test()
  Application.OnTime ("17:15:00"), "AllonsY"
End Sub

Sub AllonsY()
  MsgBox "Il est dix-sept heures quinze !"
End Sub

Exemple 2 : Démarrage de Allons-y 5 secondes après avoir lancé Test
Application.OnTime Now + TimeValue("00:00:05"), "AllonsY"

Attention. Soit l'exemple suivant :

Sub Test()
  Application.OnTime Now + TimeValue("00:00:05"), "AllonsY"
  MsgBox "Youpi..."
End Sub

Sub AllonsY()
  MsgBox "Tralala"
End Sub

Si on lance Test, nous aurons d'abord l'affichage "Youpi...", et APRES avoir cliqué sur OK, on aura "Tralala"

OnRepeat

Cet événement permet de programmer ses macros de manière à ce que l'utilisateur puisse utiliser de manière transparente la commande Edition/Répéter. En effet cette commande fonctionne avec toutes les fonctions intégrées d'Excel, mais ne permet pas de répéter correctement une macro que l'on vient d'exécuter.

Lorsqu'une procédure contient l'instruction Application.OnRepeat, elle va préciser dans le menu Edition le nom de la macro qu'il convient d'effectuer en lieu et place de la commande répéter. Par exemple :

Sub AllonsY()
  ActiveCell = "Tagada"
  Application.OnRepeat "Réécrire Tagada s'il vous plaît ", "Recommencer"
End Sub

Lorsqu'on exécute cette macro, on écrit donc Tagada dans la cellule courante. On peut bien entendu cliquer ensuite dans une autre cellule, et relancer la même macro. Mais justement, le comble du confort est de pouvoir élégamment utiliser Edition/Répéter une fois qu'on est dans une autre cellule pour réexécuter AllonsY.

Dans cet exemple, Dès qu'on exécute AllonsY, On écrit Tagada, et quand on va ensuite dans le menu Edition, on trouve juste en dessous de Annuler : "Réécrire Tagada S'il vous plaît". Si on clique dessus, Excel va exécuter mla macro Recommencer (Si elle existe, sinon, il y a une erreur). Dans Recommencer, nous pourrions avoir le code suivant :

 

Qui est en fait une copie conforme de AllonsY. Donc en fait, mis a part pour peut-être certaines macros qui ne peuvent s'exécuter qu'une seule fois, et que quand on leur demande de se répéter, il faut effectivement appeler du code différent, on peut quand même dire que dans la plupart des cas, ce sera la même chose qui sera exécutée. ALors, on peut tout à fait imaginer que OnRepeat réappelle simplement la macro dans laquelle nous sommes. Résumons donc

Sub AllonsY()
  ActiveCell = "Tagada"
  Application.OnRepeat "Réécrire Tagada s'il vous plaît ", "Recommencer"
End Sub

Sub Recommencer()
  ActiveCell = "Tagada"
End Sub

En :

Sub AllonsY()
  ActiveCell = "Tagada"
  Application.OnRepeat "Réécrire Tagada s'il vous plaît ", "Allonsy"
End Sub

Et le tour est joué... A partir de maintenant, la commande Edition/Annuler va donc fonctionner comme d'habitude, et, en plus, quand vous allez appeler AllonsY, vous pourrez la répéter autant de fois que vous voulez avec la commande Edition/Répéter (Qui sera transformée en l'occurrence en Edition/Réécrire Tagada s'il vous plaît)

OnUndo

Cet événement fonctionnement exactement comme OnRepeat, sauf que cette fois, bien sûr, c'est la fonction d'annulation qui est intéressée. Ici, la tâche du programmeur est plus complexe. En effet, pour la fonction de répétition, il suffit de répéter indéfiniment la dernière action. Dans le cas d'une annulation, il y a le concept de multi-annulation qui entre en ligne de compte. Ce qui fait que lors de mes tests, la fonction d'annulation se comporte correctement jusqu'au moment ou je redéfinis cette fonction d'annulation. Dans ce cas, les annulations précédentes, gérées par Excel ne sont plus disponibles. Le menu Edition contient en première ligne "Impossible d'annuler".

OnWindow

Cet événement s'appelle un peu différemment des autres événements. A la différence de Workbook_WindowResize , Workbook_NewSheet,Workbook_SheetActivate,Workbook_SheetDeactivate, Workbook_WindowActivate, et Workbook_WindowDeactivate qui sont des événements qui surviennent seulement lorsqu'une action sur leur fenêtre personnelle est effectuée, Une fois que l'instruction Application.OnWindow = "Test1000" est exécutée, Test1000 sera sans arrêt appelé dès qu'on active une fenêtre dans Excel. Si vous créez coup sur coup 5 classeurs, et bien, 5 fois de suite, Test1000 sera exécuté, même si on ne se trouve plus depuis longtemps dans la feuille ou même le classeur qui contient Sub CaMarche.

Par contre les autres remarques précisées dans Workbook_WindowResize , Workbook_NewSheet, ...etc. sont valables. Par exemple, Test1000 ne sera pas effectué si on bascule d'une autre application à Excel, mais seulement lorsqu'on active une fenêtre fille d'Excel depuis une autre feuille fille d'Excel.

Sub CaMarche()
  Application.OnWindow = "Test1000"
End Sub

Sub Test1000()
  MsgBox "ok"
End Sub

Il est même possible de restreindre les fenêtres non pas à l'ensemble des fenêtres d'Excel, mais seulement aux fenêtres émanent d'un seul classeur. Il ne s'agit pas des différentes feuilles, mais des différentes fenêtres qu'on peut obtenir avec Fenêtre/Nouvelle Fenêtre, ou Fenêtre/Réorganiser/Mosaïque. Exemple :

ThisWorkbook.Windows(1).OnWindow = "Test1001"