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

VBA Worksheet_SelectionChange dans Excel — exécuter du code quand le curseur se déplace (surligner la ligne active sans latence)

|

VBA Worksheet_SelectionChange dans Excel — exécuter du code quand le curseur se déplace (surligner la ligne active sans latence)

TL;DRWorksheet_SelectionChange est un événement qu'Excel déclenche chaque fois que la sélection se déplace — un clic, une touche fléchée, un appui sur Entrée. Il vous remet la nouvelle sélection sous forme de Target, pour que vous puissiez suivre le curseur : surligner la ligne active, afficher un panneau contextuel, mettre à jour une cellule d'état. La règle unique qui le gouverne : il se déclenche en permanence, donc le gestionnaire doit être ultraléger — tout ce qui est lent donne à toute la feuille un air poussif et cassé. Et s'il modifie lui-même la sélection, protégez-le avec Application.EnableEvents, sinon il se redéclenche comme le fait Worksheet_Change.

' Réside dans l'objet propre à la feuille (p. ex. Sheet1), PAS un Module ni ThisWorkbook.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ' Surligner la ligne active — n'effacer que ce que l'on a posé, puis réappliquer.
    Cells.Interior.ColorIndex = xlNone            ' effacer le surlignage précédent
    Target.EntireRow.Interior.Color = RGB(255, 255, 200)
End Sub

Là où Worksheet_Change réagit aux modifications, SelectionChange réagit au mouvement. C'est l'événement derrière tout effet « suivre le curseur » — la ligne active surlignée qui rend lisibles les tableaux larges, le panneau latéral qui se met à jour à mesure que vous descendez une liste avec les flèches, la référence de cellule affichée dans une barre d'état. C'est aussi l'événement le plus susceptible de rendre un classeur poussif, car Excel l'appelle à chaque déplacement du curseur — des dizaines de fois par seconde quand vous maintenez une touche fléchée.

Ce que vous allez apprendre

  • Le modèle mental — un traqueur de curseur qui vous remet la nouvelle sélection sous forme de Target
  • La règle qui gouverne tout — il se déclenche en permanence, alors gardez-le léger
  • L'astuce que tout le monde réclame — surligner la ligne active sans saccager la mise en forme
  • Le piège qu'il partage avec Change — modifier la sélection redéclenche l'événement
  • Ce qu'est réellement Target — la nouvelle sélection, qui peut compter plusieurs cellules

Le modèle mental : un traqueur de curseur, pas un capteur de modification

SelectionChange est un traqueur relié au curseur. Vous ne l'appelez jamais ; chaque fois que la cellule ou la plage sélectionnée se déplace, c'est Excel qui vous appelle, en passant la nouvelle sélection sous forme d'un Range nommé Target. Rien n'a changé dans les données — seulement l'endroit que regarde l'utilisateur. C'est la ligne de partage nette entre les deux événements « réagir à l'utilisateur » : Change = une valeur a changé ; SelectionChange = le curseur s'est déplacé.

Comme tous les événements de feuille, le gestionnaire réside dans l'objet de code de la feuille concernée (Sheet1 dans l'Explorateur de projets), pas ThisWorkbook ni un Module, avec la signature figée Private Sub Worksheet_SelectionChange(ByVal Target As Range). La version à l'échelle du classeur, qui se déclenche pour chaque feuille, est Workbook_SheetSelectionChange dans ThisWorkbook.

La règle qui gouverne tout : il se déclenche en permanence, alors gardez-le léger

C'est la règle qui sépare une feuille réactive d'une feuille poussive. SelectionChange s'exécute à chaque déplacement de sélection — chaque appui sur une touche fléchée, chaque clic, chaque Tab et Entrée. Maintenez la flèche vers le bas et il peut se déclencher plusieurs fois par seconde. Quoi que fasse le gestionnaire, l'utilisateur en paie le coût à chaque déplacement.

Le gestionnaire doit donc être d'une complexité minuscule. Le mode de défaillance est sans ambiguïté : mettez ici une requête lente, une grosse boucle For ou une remise en forme de toute la feuille, et la feuille développe une latence visible — le curseur saccade, les touches fléchées deviennent molles, et les utilisateurs concluent que le fichier est « cassé ». La règle : faites le minimum dans SelectionChange ; ne parcourez jamais de grandes plages, n'accédez pas au disque et ne recalculez pas depuis l'intérieur. Si un travail lourd s'impose, déclenchez-le depuis un bouton, pas en déplaçant le curseur.

L'astuce que tout le monde réclame : surligner la ligne active (bien fait)

L'usage de loin le plus demandé de cet événement est de surligner la ligne de la cellule active pour qu'un tableau large se lise facilement de bout en bout. La version naïve fonctionne, mais fait des dégâts en douce :

' Naïve — détruit tous les remplissages existants et les couleurs de mise en forme conditionnelle de la feuille
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Cells.Interior.ColorIndex = xlNone            ' efface le remplissage de CHAQUE cellule
    Target.EntireRow.Interior.Color = RGB(255, 255, 200)
End Sub

Deux vrais problèmes s'y cachent. D'abord, Cells.Interior.ColorIndex = xlNone efface le remplissage de chaque cellule — y compris les remplissages voulus et les résultats d'un rayage à la manière de la mise en forme conditionnelle que vous avez posé à la main — si bien que votre surlignage dévore la mise en forme de l'utilisateur. Ensuite, modifier .Interior vide la pile d'annulation d'Excel : une fois l'événement exécuté, le Ctrl+Z de l'utilisateur est perdu. Sur une feuille de saisie, c'est un vrai coût d'ergonomie.

L'approche robuste consiste à modifier l'affichage, pas la mise en forme des cellules — pilotez une règle de mise en forme conditionnelle depuis une cellule d'appoint que vous mettez à jour dans le gestionnaire :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ' Stocker le numéro de la ligne active dans une cellule d'appoint (par ex. Z1) ;
    ' une règle de mise en forme conditionnelle =ROW()=$Z$1 colore la ligne.
    Application.EnableEvents = False        ' écrire dans Z1 est une modification — ne pas redéclencher les événements
    Range("Z1").Value = Target.Row
    Application.EnableEvents = True
End Sub

Désormais, c'est la mise en forme conditionnelle qui colore, aucun remplissage réel n'est touché, et la pile d'annulation survit. Le gestionnaire reste minuscule — il écrit un seul nombre. C'est le motif à privilégier quand « surligner la ligne active » doit coexister avec une vraie mise en forme.

Le piège qu'il partage avec Change : re-sélectionner redéclenche l'événement

SelectionChange présente le même risque d'auto-déclenchement que Worksheet_Change, simplement par une action différente. Si votre gestionnaire déplace la sélectionTarget.Offset(1, 0).Select, ou Range("A1").Select — c'est en soi un changement de sélection, qui redéclenche SelectionChange. Faites-le sans condition et vous obtenez une récursion, ou un curseur qui se bat contre l'utilisateur.

Le même correctif s'applique : encadrez tout changement de sélection (ou écriture de cellule, comme la cellule d'appoint ci-dessus) par Application.EnableEvents = False … = True, et réactivez dans un gestionnaire d'erreurs pour qu'un plantage ne puisse pas laisser les événements globalement désactivés :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    On Error GoTo Done
    Application.EnableEvents = False
    Range("Z1").Value = Target.Row     ' ou un .Select protégé, si vous devez déplacer le curseur
Done:
    Application.EnableEvents = True
End Sub

Si un jour les événements cessent de fonctionner après vos essais ici, c'est qu'un gestionnaire en erreur a laissé EnableEvents désactivé — la même histoire que celle racontée dans VBA On Error. Exécutez Application.EnableEvents = True dans la fenêtre Exécution pour vous en sortir.

Ce qu'est réellement Target : la nouvelle sélection, peut-être plusieurs cellules

Target est ce qui est désormais sélectionné — et ce n'est pas toujours une seule cellule. Cliquez sur un en-tête de colonne et Target est la colonne entière ; tirez un bloc et Target est ce bloc ; Ctrl+clic et c'est une plage à zones multiples. Un code qui suppose une cellule unique — Target.Value, Target.Row traité comme « l'unique ligne » — peut mal se comporter sur une grande sélection.

Deux habitudes le sécurisent : lisez Target.Cells(1, 1) quand vous voulez vraiment la cellule active en haut à gauche, et court-circuitez quand une sélection énorme rend le travail inutile : If Target.Cells.Count > 1000 Then Exit Sub. Cela protège à la fois les performances (retour à la règle « gardez-le léger ») et évite de faire une bêtise quand l'utilisateur sélectionne une colonne entière. SelectionChange complète le trio : il réagit au curseur, Worksheet_Change réagit aux modifications, et Workbook_Open réagit à l'ouverture du fichier.

Comment ExcelMaster aide

Une macro qui suit le curseur est un exercice d'équilibre : réagir à chaque déplacement, mais ne presque rien faire ; surligner la ligne, mais sans dévorer la mise en forme de l'utilisateur ni son annulation ; protéger vos propres changements de sélection pour que l'événement ne se combatte pas lui-même. Il est facile d'en écrire une qui fonctionne et qui donne malgré tout à la feuille un air cassé.

ExcelMaster vous laisse décrire l'effet à la place. Dites « surligne la ligne de la cellule sur laquelle je me trouve, sans déranger mes couleurs existantes », et il écrit un Worksheet_SelectionChange léger dans le bon objet de feuille — en pilotant la mise en forme conditionnelle depuis une cellule d'appoint, protégé par EnableEvents, et maintenu assez petit pour ne pas ramer. Vous gardez le plein contrôle du code ; vous vous épargnez le moment où un surlignage bien intentionné efface une journée de mise en forme.

Questions fréquentes

Qu'est-ce que Worksheet_SelectionChange en VBA ?

C'est un événement de feuille qu'Excel déclenche chaque fois que la sélection se déplace — un clic, une touche fléchée, Tab ou Entrée. Excel passe la nouvelle sélection à votre gestionnaire sous forme d'un Range appelé Target. Contrairement à Worksheet_Change, il se déclenche au mouvement, pas aux modifications, si bien qu'on l'utilise pour suivre le curseur (surligner la ligne active, mettre à jour un panneau d'état).

Comment surligner la ligne active dans Excel avec VBA ?

La méthode robuste consiste à stocker le numéro de la ligne active dans une cellule d'appoint depuis un gestionnaire Worksheet_SelectionChange et à laisser une règle de mise en forme conditionnelle (=ROW()=$Z$1) colorer la ligne. Cela évite l'approche naïve Cells.Interior.ColorIndex = xlNone, qui efface les remplissages existants et vide la pile d'annulation à chaque déplacement du curseur.

Pourquoi ma feuille est-elle lente ou saccadée après l'ajout de SelectionChange ?

Parce que l'événement se déclenche à chaque déplacement du curseur — plusieurs fois par seconde quand vous maintenez une touche fléchée — et que votre gestionnaire en fait trop. Gardez-le ultraléger : pas de boucles sur de grandes plages, pas de recalcul, pas d'accès au disque. Déportez plutôt le travail lourd sur un bouton, et sortez tôt sur les grandes sélections avec If Target.Cells.Count > 1000 Then Exit Sub.

Quelle est la différence entre SelectionChange et Change ?

Worksheet_SelectionChange se déclenche quand le curseur se déplace vers une nouvelle cellule ou plage ; Worksheet_Change se déclenche quand le contenu d'une cellule change (tapé, collé, supprimé ou écrit par VBA). Se déplacer dans une feuille ne déclenche que SelectionChange ; modifier une valeur ne déclenche que Change.

SelectionChange se déclenche-t-il quand je déplace la sélection avec VBA ?

Oui. Range("A1").Select depuis du code compte comme un changement de sélection et déclenche l'événement, ce qui peut provoquer une récursion s'il se produit à l'intérieur du gestionnaire. Encadrez tout changement de sélection par Application.EnableEvents = False … = True, et réactivez toujours les événements dans un gestionnaire d'erreurs.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 02/08/2026.

Guides associés : VBA Worksheet_Change · VBA Workbook_Open · VBA On Error · VBA Range · VBA Boucle For