Testé sur : Excel 365 v2509 · Excel 2021 · Excel 2019 · dernière vérification le 12/06/2026
En bref — L'enregistreur de macro écrit Select → Copy → Paste : trois étapes qui font transiter vos données par le presse-papiers Windows. C'est lent, ça peut être effacé par n'importe quoi d'autre en cours, et l'écran clignote. Si vous ne voulez que les valeurs, tout se réduit à une ligne qui ne touche jamais le presse-papiers : rngB.Value = rngA.Value.
Sub CopyDemo()
' (1) Valeurs seules — pas de presse-papiers, instantané, ininterruptible
Sheet2.Range("A1:C100").Value = Sheet1.Range("A1:C100").Value
' (2) Valeurs ET mise en forme en une étape — .Copy avec Destination
Sheet1.Range("A1:C100").Copy Destination:=Sheet2.Range("A1")
' (3) Un seul aspect (valeurs / formats / formules) — utilise le presse-papiers
Sheet1.Range("A1:C100").Copy
Sheet2.Range("A1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False ' effacer le « cadre clignotant » du presse-papiers
End Sub
Le modèle mental : le presse-papiers est un intermédiaire dont votre code n'a pas besoin
Quand vous copiez-collez, le presse-papiers est une zone de transit — vous copiez ici, cliquez là, collez. L'enregistreur reproduit fidèlement ces gestes humains, d'où un code enregistré plein de .Select, Selection.Copy et ActiveSheet.Paste. Mais votre code détient déjà des références directes aux deux plages. Il n'a rien à cliquer et n'a pas besoin de transit — il peut déplacer les données directement.
Ce seul déplacement explique tout ce qui suit. Le copier-coller n'est pas faux ; c'est la traduction d'un flux manuel en code, et le plus souvent ce flux manuel avait une étape que votre code peut simplement sauter. Demandez « est-ce que je déplace des valeurs, des valeurs-et-mise-en-forme, ou un aspect précis ? » et le bon outil tombe — et deux des trois réponses n'approchent jamais le presse-papiers.
La seule règle : l'affectation déplace les valeurs ; le presse-papiers, c'est pour les aspects
Voici la règle qui remplace 90 % du copier-coller enregistré :
Pour déplacer des valeurs, affectez le
.Valued'une plage à une autre — pas deCopy, pas dePaste, pas de presse-papiers. Vous n'avez besoin deCopy+PasteSpecialque pour un aspect précis d'une cellule (valeurs seules, formats seuls, formules seules) et rien d'autre.
.Value = .Value est direct, instantané et — surtout — ininterruptible. Rien ne peut l'effacer en cours, car il n'utilise jamais d'état global partagé. Comparez les deux façons de « coller des valeurs » :
' ⚠ STYLE ENREGISTREUR — presse-papiers, trois étapes, fragile
Range("A1:A100").Select
Selection.Copy
Range("C1").Select
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
' ✓ DIRECT — une ligne, pas de presse-papiers, rien à effacer ni à interrompre
Range("C1:C100").Value = Range("A1:A100").Value
La forme directe est plus rapide, plus courte, et survit à tout ce qui se passe sur la machine pendant son exécution. La forme enregistrée fait le même travail en passant par une ressource globale que trois autres programmes utilisent peut-être.
Le piège : PasteSpecial dépend d'un presse-papiers que tout peut effacer
Quand vous avez besoin de PasteSpecial — par exemple garder la mise en forme d'une cellule mais lâcher ses formules — rappelez-vous que Copy place les données sur le presse-papiers système, un état global et volatil. Deux choses piègent :
Range("A1:A100").Copy
MsgBox "Sur le point de coller" ' ⚠ certaines boîtes / recalculs effacent le presse-papiers...
Range("C1").PasteSpecial xlPasteValues ' ...et là ça échoue ou ne colle rien
Les solutions sont des habitudes, pas des astuces :
- Ne mettez rien entre
CopyetPasteSpecial— pas deMsgBox, pas de calcul, pas de second copy. Copier, coller, fini. - Effacez toujours avec
Application.CutCopyMode = Falseensuite, pour ne pas laisser les cellules source entourées du « cadre clignotant » et le presse-papiers armé. - Si vous ne voulez que des valeurs, ne touchez pas du tout à
PasteSpecial— prenez.Value = .Valueet toute la classe de problèmes de presse-papiers disparaît.
Pour copier valeurs et mise en forme ensemble, rng.Copy Destination:=target est le bon compromis : une seule instruction, elle emporte tout, et la forme Destination fait le déplacement sans laisser le presse-papiers armé.
Quand utiliser quoi
| Vous voulez déplacer… | Utilisez | Presse-papiers ? |
|---|---|---|
| Les valeurs seules | rngB.Value = rngA.Value |
Non |
| Valeurs et formats, formules, tout | rngA.Copy Destination:=rngB |
Non |
| Valeurs seules (et vous êtes déjà en plein Copy) | .PasteSpecial xlPasteValues |
Oui |
| Formats seuls | .PasteSpecial xlPasteFormats |
Oui |
| Formules seules | .PasteSpecial xlPasteFormulas |
Oui |
| Transposer lignes ↔ colonnes | .PasteSpecial Transpose:=True |
Oui |
L'opinion : ne jamais livrer un copier-coller enregistré
La ligne que je défends : le copier-coller enregistré est un brouillon, pas une destination. L'enregistreur est un excellent moyen de découvrir quel objet et quelle méthode il vous faut, mais le code qu'il écrit — Select, Selection, ActiveSheet.Paste, sans nettoyage de CutCopyMode — est la façon la plus lente et la plus fragile. Il dépend de ce qui est sélectionné, il fait clignoter l'écran, et il fait transiter tout par un presse-papiers que n'importe quelle autre app peut piétiner.
Retirez les .Select, décidez ce que vous déplacez vraiment, et la réponse tient presque toujours en une ligne. Si ce sont juste des valeurs, .Value = .Value. Si c'est tout, .Copy Destination:=. Gardez PasteSpecial pour le vrai cas « un seul aspect », serrez-le entre Copy et le collage, et effacez CutCopyMode après. Une macro écrite ainsi s'exécute en une fraction du temps et ne peut être brisée par une boîte de dialogue égarée — ce qui est tout l'intérêt de l'automatiser.
Erreurs courantes de VBA Copy-Paste (et la solution)
| Symptôme | Cause | Solution |
|---|---|---|
| PasteSpecial échoue / ne colle rien | Une boîte ou un recalcul a effacé le presse-papiers en cours | Rien entre Copy et PasteSpecial |
| Macro lente sur de grandes plages | Copier-coller cellule par cellule ou basé sur Select |
Déplacer des plages entières avec .Value = .Value |
| La source reste entourée (cadre clignotant) | Application.CutCopyMode = False oublié |
L'effacer juste après le collage |
| Les formats ont suivi alors que vous vouliez des valeurs | Copy/Paste au lieu des valeurs seules |
.Value = .Value ou PasteSpecial xlPasteValues |
| « La méthode Paste de la classe Worksheet a échoué » | Collage dans une plage de forme différente, ou rien copié | Aligner les dimensions ; vérifier que Copy a tourné |
| L'écran clignote pendant la copie | .Select/.Activate dans la boucle |
Référencer les plages directement ; ScreenUpdating = False |
Quand la copie s'accumule — décrivez plutôt le déplacement
Vous ne vouliez pas apprendre les modes de panne du presse-papiers. Vous vouliez « tirer les lignes payées de cette feuille vers le récapitulatif, valeurs seules, chaque matin ». Le temps de dé-enregistrer les .Select, de trancher entre .Value et PasteSpecial, et de penser à effacer CutCopyMode, la plomberie de copie est la macro. ExcelMaster Agent vous laisse décrire le déplacement en français clair — « copie les lignes où le statut est payé vers la feuille Récapitulatif en valeurs, en gardant l'en-tête » — et écrit du Python qui déplace les données directement, sans presse-papiers, en sauvegardant d'abord votre classeur. Essayer gratuitement →
Guides associés
- VBA Range — référencer des cellules sans les sélectionner
- VBA Array — lire et écrire une plage en un coup
- VBA VLookup — le plantage « introuvable » et quand un Dictionary gagne
- VBA Outlook — envoyer un e-mail depuis une macro, correctement
- VBA boucle For dans Excel — 8 exemples concrets
FAQ
Comment copier-coller en VBA sans le presse-papiers ?
Pour les valeurs, affectez directement : Range("C1:C100").Value = Range("A1:A100").Value. Pour emporter valeurs et mise en forme en une étape sans laisser le presse-papiers armé, utilisez Range("A1:A100").Copy Destination:=Range("C1"). Les deux évitent l'aller-retour lent et interruptible Copy → PasteSpecial.
Comment coller uniquement les valeurs en VBA ?
Le plus propre est plageCible.Value = plageSource.Value, qui copie les valeurs sans aucun presse-papiers. Si vous êtes déjà en plein Copy, utilisez Range("C1").PasteSpecial Paste:=xlPasteValues puis Application.CutCopyMode = False. Ne placez ni MsgBox ni calcul entre la copie et le collage, sinon le presse-papiers peut être effacé avant.
Que fait Application.CutCopyMode = False ?
Il efface le « cadre clignotant » du presse-papiers et la copie en attente après votre collage. Cela évite un état de presse-papiers obsolète et une plage source visiblement entourée. Exécutez-le juste après une séquence Copy + PasteSpecial.
Pourquoi mon copier-coller VBA est-il si lent ?
En général parce qu'il .Selecte les plages et fait transiter les données par le presse-papiers bloc par bloc, souvent dans une boucle. Déplacez des plages entières d'un coup avec .Value = .Value, retirez les .Select/.Activate, et mettez Application.ScreenUpdating = False pendant l'exécution.
Quelle est la différence entre Copy Destination et PasteSpecial ?
rng.Copy Destination:=target copie tout (valeurs, formats, formules) en une instruction, sans laisser le presse-papiers armé. PasteSpecial existe pour copier un seul aspect — valeurs, formats ou formules — et exige un Copy préalable plus un nettoyage CutCopyMode = False. Prenez Destination pour une copie complète, PasteSpecial quand vous ne voulez qu'une partie.
