TL;DR —
src.Copy Destination:=dstcopie une plage directement vers sa cible en une seule instruction. Le presse-papiers n'est jamais touché, donc rien ne peut le corrompre en cours d'exécution, il n'y a pas de pointillés animés à effacer, et pas de.Selectpour ralentir les choses. Cela transporte la cellule entière — valeur, formule et format. Si vous voulez seulement les valeurs,dst.Value = src.Valueest encore plus direct. Réservez le presse-papiers (PasteSpecial) pour quand vous avez besoin d'une seule couche ou d'une opération.
' Une seule instruction, pas de presse-papiers, pas de Select :
Range("A1:C100").Copy Destination:=Sheet2.Range("A1")
' Valeurs seules, encore plus direct (pas de formats, pas de formules) :
Sheet2.Range("A1:C100").Value = Range("A1:C100").Value
Ouvrez n'importe quelle macro enregistrée et vous trouverez les trois mêmes lignes : Range(...).Select,
Selection.Copy, puis ActiveSheet.Paste. C'est l'enregistreur de macros qui consigne fidèlement ce
qu'un humain fait — cliquer, copier, cliquer, coller — routé via le presse-papiers Windows. Votre code
n'a besoin de rien de tout cela. Il détient déjà des références vers les deux plages, il peut donc
déplacer les données directement de l'une à l'autre. Copy Destination est la façon de le faire, et
c'est le plus gros nettoyage que vous puissiez apporter à du code Copy Paste
enregistré.
Ce que vous allez apprendre
- Le modèle mental — votre code détient déjà les deux plages, donc pas besoin d'intermédiaire presse-papiers
- La règle qui répare les macros enregistrées — supprimez
.Selectet copiez directement vers unDestination - La règle du coin supérieur gauche —
Destinationn'a besoin que de la première cellule de la cible - Ce que transporte un
Copy Destinationcomplet face à ce que transportedst.Value = src.Value - Copier entre feuilles et classeurs avec un
Destinationqualifié - Quand vous avez encore vraiment besoin du presse-papiers
Le modèle mental : un déplacement direct, sans intermédiaire
Quand vous copiez-collez, le presse-papiers est une zone d'attente — vous copiez ici, bougez les mains, collez là. L'enregistreur capture ces mouvements de main, ce qui explique pourquoi le code enregistré sélectionne et active constamment. Mais VBA n'est pas une paire de mains. Il a déjà une référence directe vers la plage source et une référence directe vers la cible, il peut donc transférer les données sans aucune zone d'attente au milieu.
Copy Destination est ce transfert direct écrit en une ligne : source.Copy Destination:=target. Il n'y
a aucune étape presse-papiers susceptible d'échouer, aucune sélection dont dépendre, aucun écran qui
clignote à mesure que le curseur saute. Une fois que vous voyez la copie comme un déplacement de données
entre deux références que vous détenez déjà, la version presse-papiers apparaît pour ce qu'elle est —
la traduction d'une habitude manuelle que votre code n'a jamais eue.
La règle qui compte le plus : sautez Select et le presse-papiers
Voici pourquoi le motif enregistré mérite d'être remplacé, pas seulement nettoyé. Range("A1:A10").Copy
puis Range("C1").Select puis ActiveSheet.Paste est lent, fragile et dépendant du focus :
' Enregistre - lent, fragile, depend de ce qui est selectionne et actif :
Range("A1:A10").Copy
Range("C1").Select
ActiveSheet.Paste
' Direct - une ligne, pas de presse-papiers, pas de selection :
Range("A1:A10").Copy Destination:=Range("C1")
La version enregistrée redessine l'écran à chaque .Select, elle casse si la mauvaise feuille est active,
et son presse-papiers peut être effacé par un Ctrl+C égaré, un MsgBox, ou Excel qui perd le focus
entre la copie et le collage. La version directe n'a aucun de ces modes de défaillance, parce qu'il n'y a
rien vers quoi perdre le focus et rien sur le presse-papiers à corrompre. Supprimez chaque .Select et
.Activate écrit par un enregistreur, et copiez directement vers un Destination — c'est plus rapide
et cela ne peut pas être interrompu.
La règle du coin supérieur gauche : Destination se dimensionne seule
Une inquiétude courante est que la destination doive avoir exactement la même taille que la source. Pour
Copy Destination, ce n'est pas le cas : vous donnez à Excel la cellule en haut à gauche de la cible et
il remplit le reste pour correspondre à la forme de la source :
Range("A1:C100").Copy Destination:=Sheet2.Range("A1") ' A1 seule - remplit A1:C100 pour vous
Passer une seule cellule est la norme et le choix le plus sûr. Si vous passez quand même un
Destination multi-cellules, il doit être un multiple entier de la source (Excel y répète la copie en
mosaïque) sinon vous obtenez une erreur d'exécution, donc à moins de vouloir spécifiquement cette
mosaïque, nommez juste la première cellule. C'est l'inverse du raccourci valeurs seules ci-dessous, où
les deux plages doivent être de la même taille.
Ce que transporte Copy Destination — et ce que transporte Value = Value
Les deux méthodes directes déplacent des choses différentes, et choisir entre elles est tout le jeu :
src.Copy Destination:=dstest une copie complète — valeurs, formules, formats de nombre, bordures, remplissages, tout. C'est le remplacement direct d'un collage enregistré ordinaire.dst.Value = src.Valuedéplace seulement les valeurs — pas de formules (les résultats sont collés comme des nombres), pas de formats. C'est plus rapide et cela ne peut pas être interrompu, et les deux plages doivent être de la même taille.
La décision est donc : ai-je besoin que la mise en forme et les formules suivent ? Utilisez
Copy Destination. Est-ce que je veux juste les nombres, avec les formules source de préférence figées
en résultats ? Utilisez .Value = .Value (ce gel est le sujet de
Paste Values). Les deux évitent le presse-papiers ; ils ne diffèrent que par
ce qui traverse.
Copier entre feuilles et classeurs
Destination est juste une plage, elle peut donc se trouver sur n'importe quelle feuille ou dans
n'importe quel classeur ouvert — qualifiez-la entièrement et la copie va où vous la pointez :
' Entre feuilles - pas besoin d'activer l'une ou l'autre :
ThisWorkbook.Worksheets("Data").Range("A1:D50").Copy _
Destination:=ThisWorkbook.Worksheets("Report").Range("A1")
' Vers un autre classeur ouvert :
Range("A1:D50").Copy Destination:=Workbooks("Summary.xlsx").Worksheets("Sheet1").Range("A1")
Comme rien n'est sélectionné ni activé, la feuille source et la feuille cible peuvent toutes deux rester en arrière-plan — la copie ne dérange pas ce que l'utilisateur regarde. Qualifier entièrement les deux extrémités (classeur, feuille, plage) est l'habitude qui fait fonctionner une copie quelle que soit la feuille active au moment où la macro s'exécute.
Quand vous avez encore besoin du presse-papiers
Les méthodes directes couvrent les cas courants — une copie complète ou un déplacement de valeurs
seules. Vous avez quand même besoin du presse-papiers pour un collage filtré : valeurs seules avec
les formats mais sans les formules, formats seuls, largeurs de colonnes seules, ou une opération comme la
transposition ou l'addition. C'est exactement à cela que sert
PasteSpecial, et là, le .Copy et le .PasteSpecial doivent rester
adjacents. Le jugement à avoir : par défaut, Copy Destination pour une copie entière et
.Value = .Value pour des valeurs, et ne descendez vers le presse-papiers que lorsque vous avez besoin
d'une seule couche ou d'une opération que les méthodes directes ne peuvent pas exprimer.
Comment ExcelMaster aide
La plupart des macros enregistrées sont plus lentes et plus fragiles qu'elles ne devraient l'être, pour
une seule raison : elles copient et collent via le presse-papiers avec une traînée de lignes .Select,
alors que les données pourraient se déplacer directement. Cela marche jusqu'à ce qu'un Ctrl+C arrive en
plein milieu de l'exécution, ou que la mauvaise feuille soit active, et là ça colle la mauvaise chose ou
ça plante.
ExcelMaster écrit la
version directe dès le départ — Copy Destination:= pour une copie complète, dst.Value = src.Value
quand vous avez seulement besoin des valeurs, les deux extrémités entièrement qualifiées pour qu'aucune
feuille n'ait besoin d'être active, et aucun .Select nulle part. Il ne descend vers PasteSpecial que
lorsque vous demandez vraiment une seule couche ou une transposition. Vous gardez le classeur et le code.
Questions fréquentes
Comment copier une plage vers une autre feuille sans la sélectionner ?
Utilisez un Destination qualifié :
Worksheets("Data").Range("A1:C100").Copy Destination:=Worksheets("Report").Range("A1"). Aucune des deux
feuilles n'a besoin d'être active ou sélectionnée — nommer les deux plages suffit. C'est plus rapide que
le Select / Copy / Paste enregistré, et cela ne dérange pas ce que l'utilisateur regarde
actuellement.
La plage de destination doit-elle avoir la même taille que la source ?
Pas pour Copy Destination — passez juste la cellule en haut à gauche de la cible et Excel dimensionne
la copie pour correspondre à la source. Passer une destination multi-cellules ne fonctionne que si elle
est un multiple entier de la source (Excel y répète la copie en mosaïque), donc nommer une seule cellule
est le choix sûr par défaut. La forme valeurs seules dst.Value = src.Value est l'exception : là, les
deux plages doivent être de la même taille.
Quelle est la différence entre Copy Destination et .Value = .Value ?
Copy Destination est une copie complète — valeurs, formules et formats traversent tous. dst.Value = src.Value ne déplace que les valeurs (les formules arrivent sous forme de résultats, la mise en forme ne
suit pas) mais c'est plus rapide et cela ne touche jamais au presse-papiers. Utilisez Copy Destination
quand la mise en forme compte ; utilisez .Value = .Value quand vous voulez juste les nombres.
Copy Destination est-il plus rapide que Copy et Paste ?
Oui, et plus fiable. C'est une seule instruction au lieu de trois, cela évite les redessins d'écran que
déclenche chaque .Select, et cela ne passe jamais par le presse-papiers, si bien que rien d'externe ne
peut effacer ou corrompre les données en cours d'opération. Pour des valeurs seules, dst.Value = src.Value est plus rapide encore.
Faut-il Application.CutCopyMode = False après Copy Destination ?
Non. Copy Destination ne laisse pas le presse-papiers armé comme le fait un .Copy ordinaire suivi
d'un collage, donc il n'y a pas de pointillés animés à effacer. Vous n'avez besoin de
Application.CutCopyMode = False qu'après un collage presse-papiers comme PasteSpecial.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 09/09/2026.
Guides connexes : VBA PasteSpecial · VBA Paste Values · VBA Copy Paste · VBA Range · VBA Cells
