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

VBA Copy Destination dans Excel — déplacer une plage sans toucher au presse-papiers

|

VBA Copy Destination dans Excel — déplacer une plage sans toucher au presse-papiers

TL;DRsrc.Copy Destination:=dst copie 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 .Select pour ralentir les choses. Cela transporte la cellule entière — valeur, formule et format. Si vous voulez seulement les valeurs, dst.Value = src.Value est 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 .Select et copiez directement vers un Destination
  • La règle du coin supérieur gauche — Destination n'a besoin que de la première cellule de la cible
  • Ce que transporte un Copy Destination complet face à ce que transporte dst.Value = src.Value
  • Copier entre feuilles et classeurs avec un Destination qualifié
  • 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:=dst est 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.Value dé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