🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Raccourcis clavier VBA dans Excel — affecter des raccourcis Ctrl+Maj à vos macros avec OnKey et MacroOptions

|

Raccourcis clavier VBA dans Excel — affecter des raccourcis Ctrl+Maj à vos macros avec OnKey et MacroOptions

TL;DR — Excel possède deux systèmes différents pour lancer une macro au clavier. Le raccourci des options de macro (Alt+F8 > Options, ou Application.MacroOptions dans le code) est enregistré dans le classeur et fonctionne tant que ce fichier est ouvert ; il n'accepte que Ctrl+lettre ou Ctrl+Maj+lettre. Application.OnKey est défini par le code, accepte presque toutes les touches, y compris les touches de fonction, et reste actif pendant toute la session Excel, dans tous les classeurs, jusqu'à ce que vous le réinitialisiez. Utilisez Ctrl+Maj+lettre, car Ctrl+lettre remplace sans prévenir un raccourci d'Excel comme Ctrl+C. Réinitialisez chaque OnKey dans Workbook_BeforeClose. Et si la macro ouvre un classeur, attendez d'abord que la touche Maj soit relâchée, sinon Excel arrête votre code juste après Workbooks.Open.

' Systeme 1 : enregistre dans le fichier, actif tant que ce classeur est ouvert
Application.MacroOptions Macro:="FormatReport", _
    HasShortcutKey:=True, ShortcutKey:="R"        ' R majuscule = Ctrl+Maj+R

' Systeme 2 : vit dans la session Excel jusqu'a reinitialisation
Application.OnKey "{F9}", "RefreshAll"            ' affecter
Application.OnKey "{F9}"                          ' rendre a Excel son propre F9

Voici le premier article d'une série consacrée aux macros qu'Excel lance pour vous : depuis une touche, depuis l'horloge avec OnTime, ou depuis des frappes simulées avec SendKeys. Une idée les relie, et elle explique l'essentiel de leurs surprises : aucun de ces mécanismes n'appelle votre macro directement. Chacun dépose une demande dans la file d'attente d'Excel, et Excel ne l'exécute que lorsqu'il est inactif et disponible. Il faut donc raisonner en termes de file : ce qui retient une demande, ce qui la supprime, et ce qui attend encore quand le classeur se ferme.

Ce que vous allez apprendre

  • Le modèle mental : deux systèmes de raccourcis, avec une portée et une durée de vie différentes
  • Affecter un raccourci dans la boîte de dialogue « Macro » et avec MacroOptions
  • OnKey : les codes de touches et les trois formes de l'appel
  • Pourquoi Ctrl+lettre est un piège, et pourquoi Ctrl+Alt en est un sur les claviers français
  • La touche Maj qui arrête une macro après Workbooks.Open
  • Faire le ménage pour qu'une touche ne survive pas à son classeur
  • Retrouver les raccourcis qu'un classeur a affectés

Le modèle mental : deux systèmes, deux durées de vie

Quand vous appuyez sur une touche dans Excel, Excel cherche quelque chose à exécuter. Il regarde à deux endroits, qui se comportent de façon très différente :

Raccourci des options de macro Application.OnKey
Défini par Alt+F8 > Options, ou MacroOptions le code, en général dans Workbook_Open
Stocké dans le classeur, avec la macro nulle part ; uniquement dans l'Excel en cours
Actif tant que ce classeur est ouvert pendant toute la session, dans tous les classeurs
Touches Ctrl+lettre ou Ctrl+Maj+lettre presque toutes les combinaisons, touches F, Entrée, Suppr
Fin à la fermeture du classeur quand vous le réinitialisez ou qu'Excel se ferme

La colonne de gauche est une propriété du fichier. Celle de droite est une modification d'Excel lui-même, faite par votre code et laissée en place si votre code ne l'annule pas. Presque tous les bugs de raccourcis viennent d'un oubli : lequel des deux systèmes avez-vous utilisé ?

Les deux systèmes partagent une règle de la série : Excel ne regarde la touche que lorsqu'il est disponible. Tant qu'une cellule est en mode Modification, qu'une boîte de dialogue ou un UserForm modal est ouvert, ou qu'une autre macro tourne, le raccourci ne fait rien.

Système 1 : le raccourci des options de macro

La méthode manuelle : appuyez sur Alt+F8, sélectionnez la macro, cliquez sur le bouton Options et tapez une lettre dans le champ « Touche de raccourci ». Une minuscule donne Ctrl+lettre ; maintenir Maj en la tapant donne Ctrl+Maj+lettre.

La même chose en code, utile quand vous construisez ou réparez un classeur depuis VBA :

Sub AssignReportShortcut()
    Application.MacroOptions Macro:="FormatReport", _
        Description:="Format the active report sheet", _
        HasShortcutKey:=True, _
        ShortcutKey:="R"            ' "r" = Ctrl+R, "R" = Ctrl+Maj+R
End Sub

Le raccourci est enregistré avec le classeur : pensez donc à enregistrer le fichier ensuite. Il fonctionne depuis n'importe quel classeur ouvert tant que celui-ci l'est aussi, et il disparaît avec le fichier. C'est le bon choix pour une macro qui appartient à un seul classeur : le raccourci voyage avec le fichier et ne laisse aucune trace derrière lui.

Les limites : des lettres uniquement (pas de touches F, pas d'Entrée), aucune combinaison avec Alt, et la macro doit être une Sub publique sans argument, dans un module standard.

Système 2 : Application.OnKey

OnKey prend un code de touche et le nom d'une procédure :

Application.OnKey "^+r", "FormatReport"    ' Ctrl+Maj+R
Application.OnKey "{F9}", "RefreshAll"     ' F9
Application.OnKey "^{DEL}", "ClearInputs"  ' Ctrl+Suppr

Le code de touche utilise trois caractères préfixes pour les modificateurs et des accolades pour les touches nommées :

Code Touche
^ Ctrl
+ Maj
% Alt
{F1} à {F15} touches de fonction
{ENTER} ou ~ Entrée (~ est la touche Entrée principale)
{DEL}, {INSERT}, {HOME}, {END} touches d'édition (Suppr, Inser, Début, Fin)
{PGUP}, {PGDN}, {UP}, {DOWN} touches de navigation
{ESC}, {TAB}, {BS} Échap, Tab, Retour arrière

La règle qui compte le plus : la même méthode fait trois choses différentes, selon le second argument :

Application.OnKey "^+r", "FormatReport"    ' deux arguments : lancer cette macro
Application.OnKey "^+r", ""                ' chaine vide : la touche ne fait plus rien
Application.OnKey "^+r"                    ' pas de second argument : retour au comportement d'Excel

On confond souvent les deux dernières. Pour annuler votre propre affectation, c'est la forme à un seul argument qu'il vous faut. La chaîne vide sert à désactiver volontairement une touche, par exemple Application.OnKey "^x", "" pour empêcher les utilisateurs de couper des cellules dans un modèle, et la touche reste désactivée jusqu'à ce que quelque chose la réinitialise.

Ctrl+lettre remplace les raccourcis d'Excel

Affectez une macro à Ctrl+C, Ctrl+S ou Ctrl+Z, et Excel ne vous avertit pas. Tant que le classeur est ouvert, la touche lance votre macro au lieu de copier, d'enregistrer ou d'annuler. Ctrl+Z est le pire cas : l'utilisateur l'enfonce pour annuler une erreur, votre macro s'exécute, et une macro, elle non plus, ne s'annule pas.

Excel occupe déjà presque tous les Ctrl+lettre. Les Ctrl+Maj+lettre sont pour la plupart libres, d'où une règle simple : toujours Ctrl+Maj+lettre, dans les deux systèmes.

Sur un clavier AZERTY, un second piège vous concerne directement. Pour Windows, AltGr, c'est Ctrl+Alt. Or vous tapez avec AltGr une bonne partie des caractères dont vous avez besoin tous les jours : AltGr+à donne @, AltGr+E donne €, AltGr+3 donne #, AltGr+4 donne {, AltGr+5 donne [. Un collègue qui travaille sur un clavier QWERTY américain affecte tranquillement une macro d'export à Ctrl+Alt+E ("^%e"), ou une macro quelconque à "^%q" comme on le voit dans bien des exemples ; sur votre poste, la première avale chaque €, et une affectation sur Ctrl+Alt+à vous empêche soudain de taper une adresse e-mail. Le même problème touche les claviers allemands (AltGr+Q donne @) et espagnols. Si le fichier doit tourner sur des claviers européens, bannissez purement et simplement les combinaisons Ctrl+Alt.

La touche Maj qui arrête une macro après Workbooks.Open

Celui-ci se présente sous la forme ma macro s'arrête au milieu quand j'utilise le raccourci, mais fonctionne depuis le bouton Exécuter. La macro a un raccourci Ctrl+Maj et ouvre un classeur :

Sub ImportMonthly()                         ' affectee a Ctrl+Maj+I
    Workbooks.Open "C:\Data\monthly.xlsx"
    MsgBox "Imported"                       ' jamais atteint depuis le raccourci
End Sub

Maintenir Maj pendant l'ouverture d'un classeur est le signal par lequel on demande à Excel d'ignorer les macros de démarrage de ce fichier. Quand vous lancez la macro par Ctrl+Maj+I, votre doigt est encore sur Maj au moment où Workbooks.Open s'exécute, et Excel met fin au code en cours en même temps qu'aux macros de démarrage. Pas d'erreur, pas de message : le code s'arrête, tout simplement.

La correction consiste à attendre que Maj soit relâchée avant d'ouvrir quoi que ce soit :

#If VBA7 Then
    Private Declare PtrSafe Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
#Else
    Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
#End If
Private Const VK_SHIFT As Long = &H10

Sub ImportMonthly()
    Do While GetKeyState(VK_SHIFT) < 0      ' negatif = Maj est enfoncee
        DoEvents
    Loop
    Workbooks.Open "C:\Data\monthly.xlsx"
    MsgBox "Imported"
End Sub

Le guide DoEvents explique pourquoi la boucle a besoin de DoEvents : c'est lui qui laisse Excel lire le relâchement de la touche. Autre solution : donnez aux macros qui ouvrent des fichiers un raccourci sans Maj via OnKey, par exemple une touche de fonction.

Faire le ménage : une touche ne doit pas survivre à son classeur

Une affectation OnKey appartient à Excel, pas au classeur. Fermez le classeur et la touche pointe toujours vers la macro : l'enfoncer peut rouvrir votre fichier pour exécuter la macro, ou échouer avec Cannot run the macro (« Impossible d'exécuter la macro »). Le modèle est donc toujours une paire : affectation à l'ouverture, réinitialisation à la fermeture.

' Dans ThisWorkbook
Private Sub Workbook_Open()
    Application.OnKey "{F9}", "RefreshAll"
    Application.OnKey "^+r", "FormatReport"
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.OnKey "{F9}"                ' un seul argument = retour au comportement par defaut
    Application.OnKey "^+r"
End Sub

Si les utilisateurs travaillent dans plusieurs classeurs à la fois et que les touches ne doivent s'appliquer qu'au vôtre, utilisez plutôt Workbook_Activate et Workbook_Deactivate. Les guides Workbook_Open et BeforeClose détaillent ces événements, y compris le cas où l'utilisateur annule la fermeture.

Centralisez la liste des touches, par exemple dans une procédure SetKeys(enable As Boolean) appelée par les deux événements : une touche ajoutée plus tard ne pourra pas être oubliée lors de la réinitialisation.

Quels raccourcis ce classeur a-t-il ?

Aucune propriété ne liste les raccourcis des options de macro. Excel stocke chacun d'eux sous la forme d'un attribut caché sur la procédure, que vous voyez si vous exportez le module (clic droit > Exporter un fichier) et ouvrez le fichier .bas dans un éditeur de texte :

Sub FormatReport()
Attribute FormatReport.VB_ProcData.VB_Invoke_Func = "R\n14"

R est la touche, la majuscule signifiant Ctrl+Maj. Cette ligne est invisible dans l'éditeur VBA, ce qui explique qu'un raccourci puisse survivre des années après que tout le monde l'a oublié. Les affectations OnKey, elles, ne sont stockées nulle part : la seule liste, c'est votre propre code Workbook_Open. Raison de plus pour les regrouper dans une seule procédure.

Le parti pris : raccourcis de fichier pour les fichiers, OnKey pour les outils

Utilisez le raccourci des options de macro pour une macro qui appartient à un seul classeur. Il est enregistré avec le fichier, disparaît avec lui, et ne demande aucun code de nettoyage.

Réservez OnKey aux cas où vous avez besoin de ce que lui seul offre : les touches de fonction et autres touches non alphabétiques, ou un raccourci qu'un complément ou Personal.xlsb met à disposition dans tous les classeurs. Traitez-le alors comme une modification de l'Excel de l'utilisateur que vous devez annuler, avec une réinitialisation pour chaque touche affectée.

Dans les deux cas : Ctrl+Maj+lettre, jamais Ctrl+lettre, et jamais Ctrl+Alt sur un fichier destiné à des claviers européens. Un raccourci n'aide que s'il ne casse pas une touche sur laquelle l'utilisateur compte déjà.

Comment ExcelMaster aide

Les problèmes de raccourcis se voient mal : l'affectation est un attribut caché ou une ligne dans une procédure événementielle, et le symptôme est une touche qui ne copie plus rien, ou une macro qui s'arrête sans la moindre erreur.

ExcelMaster lit les modules du classeur, liste chaque raccourci et chaque affectation OnKey qu'il y trouve, signale ceux qui écrasent les touches d'Excel ou ne sont jamais réinitialisés, et peut écrire pour vous la paire Workbook_Open / Workbook_BeforeClose correspondante.

Questions fréquentes

Comment affecter une touche de raccourci à une macro dans Excel ?

Appuyez sur Alt+F8, sélectionnez la macro, cliquez sur Options et tapez une lettre dans le champ « Touche de raccourci ». Maintenez Maj en tapant la lettre pour obtenir Ctrl+Maj+lettre, ce qui évite de remplacer les raccourcis d'Excel. En code, utilisez Application.MacroOptions avec HasShortcutKey:=True et ShortcutKey:="R".

Quelle est la différence entre OnKey et une touche de raccourci de macro ?

Un raccourci des options de macro est enregistré dans le classeur et fonctionne tant que ce fichier est ouvert, mais uniquement avec des lettres. Application.OnKey est défini par le code, fonctionne avec presque toutes les touches, y compris les touches de fonction, et reste actif pendant toute la session Excel jusqu'à sa réinitialisation.

Comment réinitialiser une touche définie avec Application.OnKey ?

Appelez OnKey avec le seul code de touche, par exemple Application.OnKey "{F9}". Passer une chaîne vide en second argument ne réinitialise pas la touche : cela la désactive.

Pourquoi ma macro s'arrête-t-elle après Workbooks.Open quand j'utilise le raccourci ?

Maintenir Maj pendant l'ouverture d'un classeur demande à Excel d'ignorer ses macros de démarrage, et cela met aussi fin au code en cours. Attendez dans une boucle avec GetKeyState que Maj soit relâchée, ou utilisez un raccourci sans Maj.

Peut-on utiliser les touches de fonction comme raccourcis de macro dans Excel ?

Pas dans la boîte de dialogue des options de macro, qui n'accepte que des lettres. Utilisez Application.OnKey "{F9}", "MyMacro" dans Workbook_Open, et réinitialisez-la avec Application.OnKey "{F9}" dans Workbook_BeforeClose.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 03/10/2026.

Guides connexes : VBA OnTime · VBA SendKeys · VBA Workbook_Open · VBA Workbook_BeforeClose · VBA DoEvents · VBA Open Workbook · VBA Application.Run · VBA Sub