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

VBA Select vs Activate dans Excel — rompez avec l'habitude du .Select de l'enregistreur de macros

|

VBA Select vs Activate dans Excel — rompez avec l'habitude du .Select de l'enregistreur de macros

TL;DRSelect met en surbrillance des cellules (une ou plusieurs) ; Activate définit l'unique cellule active (et doit tomber à l'intérieur de la sélection courante). Mais la leçon plus large, c'est que vous n'avez que rarement besoin de l'un ou de l'autre. L'enregistreur de macros remplit votre code de .Select et de .Activate parce qu'il enregistre des clics de souris — c'est ainsi qu'une personne navigue, pas ainsi que le code devrait. Chaque .Select est un détour lent et fragile qui modifie l'état global de l'interface et ne fonctionne que si la bonne feuille est active. Les pros nomment l'objet une fois et agissent dessus directement — Worksheets("Data").Range("A1").Value = 1 — et suppriment presque tous les Select.

' Ce que l'enregistreur écrit (clic, clic, saisie) :
Sub Recorded()
    Sheets("Data").Select
    Range("A1").Select
    ActiveCell.Value = "Total"
    Range("B1").Select
    ActiveCell.Value = 100
End Sub

' Ce que vous devriez écrire (nommez une fois, agissez directement) :
Sub Direct()
    With Worksheets("Data")
        .Range("A1").Value = "Total"
        .Range("B1").Value = 100
    End With
End Sub

Si vous avez appris VBA avec l'enregistreur de macros, votre code est probablement truffé de .Select et de .Activate. Ça marche, alors il est tentant de le laisser — mais c'est la première raison pour laquelle les macros de niveau intermédiaire sont lentes, fragiles, et cassent quand quelqu'un les lance depuis la « mauvaise » feuille. Comprendre ce que font réellement Select et Activate est la première étape pour en supprimer la plupart.

Ce que vous allez apprendre

  • Le modèle mental — l'enregistreur enregistre des clics, pas une intention
  • Select contre Activate — la vraie différence, précise
  • La règle — vous n'avez presque jamais besoin de l'un ou de l'autre ; agissez sur la référence
  • Pourquoi .Select est fragile et lent — trois modes de défaillance concrets
  • Les rares raisons légitimes de sélectionner
  • Comment refactoriser le code de l'enregistreur, étape par étape

Le modèle mental : l'enregistreur enregistre des clics, pas une intention

Activez l'enregistreur de macros et faites quelque chose de simple — saisir un total en B1 sur la feuille Data — et vous obtiendrez quatre lignes : activer la feuille, sélectionner la cellule, agir sur la sélection, et ainsi de suite. C'est une transcription fidèle de votre souris et de votre clavier, car cliquer est la seule façon dont vous pouvez dire à Excel « agis sur cette cellule ».

Le code n'a pas cette limite. Une macro peut atteindre Worksheets("Data").Range("B1") et fixer sa valeur sans jamais s'y rendre — aucun changement de feuille, aucune surbrillance, aucun déplacement du curseur. Le style bourré de Select de l'enregistreur n'est donc pas un modèle dont s'inspirer ; c'est un artefact du fonctionnement de l'enregistreur. Le déclic mental est celui-ci : arrêtez de traduire des clics ; nommez l'objet que vous visez et parlez-lui directement.

Select contre Activate : la vraie différence

Ils sont liés mais pas identiques, et la distinction est précise :

Select Activate
Ce qu'il fait Met en surbrillance des cellules Définit l'unique cellule active
Combien de cellules Une ou plusieurs (Range("A1:C10").Select) Toujours exactement une
Effet sur la sélection Remplace la sélection Déplace l'ancre à l'intérieur de la sélection
Sur une feuille de calcul Sélectionne aussi l'onglet de cette feuille Rend cette feuille active
Se relit via Selection ActiveCell

L'interaction est la partie subtile. Si vous faites Select sur un bloc puis Activate sur une cellule à l'intérieur, le bloc reste sélectionné et seule l'ancre se déplace :

Sub SelectThenActivate()
    Range("A1:C10").Select      ' met le bloc en surbrillance
    Range("B5").Activate        ' B5 est la cellule active, le bloc reste sélectionné
End Sub

Mais si vous faites Activate sur une cellule en dehors de la sélection courante, Excel réduit la sélection à cette seule cellule. Et Range("B5").Select fait toujours les deux à la fois — il met B5 en surbrillance et la rend active. En pratique, c'est pourquoi les gens recourent bien plus souvent à Select qu'à Activate : sélectionner une seule cellule la rend active par effet de bord.

La règle : vous n'avez presque jamais besoin de l'un ou de l'autre

Voici l'anti-modèle qu'enseigne l'enregistreur, et sa correction :

' ANTI-MODÈLE : sélectionner, puis agir sur la sélection
Range("A1").Select
Selection.Value = 1

' DIRECT : agir sur la cellule elle-même — une ligne, aucun effet de bord
Range("A1").Value = 1

Tout ce que vous pouvez faire à Selection ou ActiveCell, vous pouvez le faire directement à la plage — .Value, .Font, .Interior, .Copy, .NumberFormat, tout. Le .Select au milieu ne vous apporte rien, sinon changer ce qui est en surbrillance à l'écran. Le supprimer rend le code plus court, plus rapide et indépendant de ce qui est sélectionné à l'instant. C'est l'habitude au plus fort effet de levier en VBA intermédiaire.

Pourquoi .Select est fragile et lent : trois modes de défaillance

Ce n'est pas seulement verbeux — le code fondé sur Select casse activement de trois façons :

  • Il ne fonctionne que sur la feuille active. Worksheets("Data").Range("A1").Select déclenche l'erreur d'exécution 1004 à moins que Data ne soit déjà la feuille active. Le code enregistré est donc dépendant de l'ordre : il doit d'abord activer la feuille, et si une étape laisse une autre feuille active, tout ce qui suit sélectionne les mauvaises cellules ou plante. Une référence directe comme Worksheets("Data").Range("A1").Value = 1 fonctionne quelle que soit la feuille affichée.
  • Il est lent. Chaque .Select force Excel à faire défiler, à redessiner et à mettre à jour la zone Nom et la barre d'état. Un seul est imperceptible ; un millier dans une boucle, c'est la plainte classique « ma macro met 40 secondes ». Agir directement sur des références (plus Application.ScreenUpdating = False) peut ramener cela à moins d'une seconde.
  • Il écrase l'état de l'utilisateur. Sélectionner des cellules jette aux orties l'endroit où était l'utilisateur, fait défiler la vue et réinitialise l'ancre. Une macro qui laisse l'utilisateur à un endroit au hasard donne l'impression d'être cassée, même quand elle a fait ce qu'il fallait.

Les rares raisons légitimes de sélectionner

« Presque jamais » n'est pas « jamais ». Quelques situations l'exigent réellement :

  • Laisser l'utilisateur à un endroit accueillant. À la fin d'une macro, sélectionner une cellule d'accueil — Worksheets("Dashboard").Activate puis Range("A1").Select — est une jolie touche finale, car la sélection est alors le résultat, pas une étape du travail.
  • Les outils qui agissent sur la sélection. Une macro dont tout le rôle est « fais X sur ce que j'ai choisi » lit légitimement Selection / ActiveCell — voyez VBA Selection et VBA ActiveCell.
  • Une poignée d'opérations qui exigent une feuille ou un objet actif — certaines actions de graphique, de fenêtre, de figer les volets ou d'ActiveWindow ne s'appliquent qu'à ce qui est actif. Réservez-les à des cas délibérés et rares.

Le test : si sélectionner est le résultat que l'utilisateur doit voir, gardez-le. Si c'est une étape sur le chemin vers autre chose, supprimez-le.

Comment refactoriser le code de l'enregistreur, étape par étape

Transformer le code enregistré en code robuste est mécanique une fois qu'on en voit la forme :

  1. Supprimez les lignes .Select / .Activate et repliez leur cible dans la ligne suivante. Range("A1").Select + Selection.Value = 1 devient Range("A1").Value = 1.
  2. Qualifiez chaque plage avec sa feuille, pour qu'elle ne dépende plus de la feuille active : Worksheets("Data").Range("A1"), pas un simple Range("A1").
  3. Utilisez With pour éviter de répéter le qualificateur (voyez VBA With) :
' Avant (enregistré) : 6 lignes, dépendant de l'ordre, lent
Sheets("Data").Select
Range("A1").Select
Selection.Value = "Name"
Range("A2").Select
Selection.Value = "Amount"

' Après : direct, indépendant de la feuille, rapide
With Worksheets("Data")
    .Range("A1").Value = "Name"
    .Range("A2").Value = "Amount"
End With

La version refactorisée se lit comme une intention (« mets ces valeurs sur la feuille Data ») plutôt que comme des frappes clavier, et elle peut s'exécuter depuis n'importe quelle feuille sans casser. Pour construire les références sur lesquelles vous agirez, voyez VBA Range et VBA Worksheet.

Comment ExcelMaster aide

Les macros enregistrées sont un excellent moyen de découvrir quels objets et méthodes une tâche nécessite — et un moyen désastreux de livrer du code, précisément à cause de l'habitude du .Select. Les nettoyer à la main, c'est qualifier chaque plage et raisonner sur la feuille active à chaque étape.

ExcelMaster écrit d'emblée la version directe. Décrivez le résultat — « mets ces en-têtes et ces totaux sur la feuille Data et laisse l'utilisateur sur le Dashboard » — et il produit des références qualifiées, enveloppées dans With, avec .Select seulement là où c'est vraiment le résultat, pas un détour. Vous obtenez le confort de l'enregistreur avec un code de qualité artisanale que vous pouvez toujours lire ligne par ligne.

Questions fréquentes

Quelle est la différence entre Select et Activate en VBA ?

Select met des cellules en surbrillance et peut en sélectionner plusieurs à la fois ; il remplace la sélection courante. Activate définit l'unique cellule active et, si cette cellule est à l'intérieur de la sélection courante, déplace simplement l'ancre sans changer ce qui est en surbrillance. Sélectionner une cellule la rend aussi active par effet de bord, c'est pourquoi Select est bien plus utilisé.

Faut-il utiliser Select en VBA ?

Généralement non. L'enregistreur de macros produit du .Select parce qu'il enregistre des clics de souris, mais le code peut agir sur une cellule directement — Range("A1").Value = 1 au lieu de Range("A1").Select puis Selection.Value = 1. Les références directes sont plus courtes, plus rapides et fonctionnent quelle que soit la feuille active. Ne gardez Select que pour laisser l'utilisateur sur une cellule accueillante ou pour les outils qui agissent sur la sélection courante.

Pourquoi Range.Select donne-t-il l'erreur d'exécution 1004 ?

Parce que .Select ne fonctionne que sur la feuille active. Worksheets("Data").Range("A1").Select échoue avec l'erreur 1004 à moins que Data ne soit déjà active. Soit vous activez d'abord la feuille, soit — mieux — vous supprimez le .Select et agissez directement sur la référence, ce qui fonctionne depuis n'importe quelle feuille : Worksheets("Data").Range("A1").Value = 1.

Comment accélérer ma macro VBA ?

Le plus grand gain vient généralement de la suppression des .Select/.Activate et de l'action directe sur les références, car chaque sélection force un redessin de l'écran. Combinez cela avec Application.ScreenUpdating = False au début (et True à la fin), et une boucle qui prenait des dizaines de secondes tombe souvent sous la seconde.

Comment sélectionner une plage sur une autre feuille en VBA ?

Vous devez d'abord activer la feuille : Worksheets("Data").Activate puis Worksheets("Data").Range("A1:B10").Select. Mais si votre but est d'agir sur cette plage plutôt que de la montrer à l'utilisateur, ne sélectionnez pas du tout et référencez-la directement — Worksheets("Data").Range("A1:B10").Value = ... — ce qui ne nécessite aucune activation et ne perturbe pas la vue de l'utilisateur.

Testé dans

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

Guides associés : VBA ActiveCell · VBA Selection · VBA Range · VBA With · VBA Worksheet