TL;DR —
PasteSpecialest un collage filtré : vous faites un.Copyd'une plage vers le presse-papiers, puis vous choisissez quelle couche unique traverse — valeurs, formats, formules ou largeurs de colonnes — et, en option, une opération (addition, multiplication, transposition). Le piège, c'est qu'il lit un presse-papiers vivant : il doit donc suivre un.Copyimmédiatement ; tout ce qui vide le presse-papiers entre les deux — unMsgBox, un autre copier, ou même Excel qui perd le focus — vous donnePasteSpecial method of Range class failed. Si vous copiez tout tel quel, vous n'avez pas besoin dePasteSpecialdu tout — c'est à ça que sert Copy Destination.
' PasteSpecial lit le presse-papiers, donc Copy juste avant, sans rien entre les deux.
Range("A1:A20").Copy ' charge le presse-papiers
Range("C1").PasteSpecial Paste:=xlPasteValues ' seules les valeurs traversent
Application.CutCopyMode = False ' efface les pointilles animes
' Choisir ce qui traverse ET comment ca atterrit en un seul appel :
Range("E1:E20").Copy
Range("G1").PasteSpecial Paste:=xlPasteValues, _
Operation:=xlPasteSpecialOperationAdd, Transpose:=False
PasteSpecial est le jumeau, en code, de la boîte de dialogue Collage spécial — celle qui vous laisse
coller seulement les valeurs, seulement les formats, ou transposer une colonne en ligne. Un
Copy Paste ordinaire déplace la cellule tout entière ; PasteSpecial est
l'outil que vous sortez quand vous voulez une seule couche et rien d'autre. Cette puissance a une
contrainte stricte qui piège presque tout le monde la première fois, alors on commence par elle avant
d'élargir.
Ce que vous allez apprendre
- Le modèle mental —
PasteSpecialest un filtre posé sur un collage, pas un autre type de copie - La règle qui évite la plupart des échecs — il lit un presse-papiers vivant, donc
.Copydoit venir juste avant - Les deux axes — ce qui traverse (
Paste:=) et comment ça atterrit (Operation:=,Transpose:=) - Le collage valeurs seules et son piège de format (
xlPasteValuescontrexlPasteValuesAndNumberFormats) - Nettoyer avec
Application.CutCopyMode = False - Quand
PasteSpecialest le mauvais outil et qu'un déplacement direct vaut mieux
Le modèle mental : un filtre posé sur un collage
Un collage ordinaire copie une cellule tout entière — sa valeur, sa formule, son format de nombre, ses
bordures, son remplissage, tout à la fois. PasteSpecial place un filtre devant ce collage. Vous faites
toujours un .Copy de toute la source vers le presse-papiers, mais au moment de coller vous dites
« ne laissez passer que cette seule couche ». Imaginez le presse-papiers comme une pile de feuilles
transparentes — valeur, formule, format, largeur de colonne — et PasteSpecial comme le seul outil qui
vous permette de soulever une seule feuille et de la déposer sur la cible.
C'est toute l'idée, et cela explique pourquoi PasteSpecial vient toujours en deux moitiés : un .Copy
qui charge chaque couche sur le presse-papiers, et un .PasteSpecial qui choisit quelle couche garder.
Ratez la première moitié et il n'y a plus rien à filtrer — ce qui est exactement le mode de défaillance
décrit ci-dessous.
La règle qui compte le plus : il lit un presse-papiers vivant
Voici l'erreur derrière presque tous les PasteSpecial method of Range class failed. PasteSpecial ne
se souvient pas de la plage que vous avez copiée — il lit le presse-papiers Windows à l'instant précis où
il s'exécute. Si quoi que ce soit vide le presse-papiers entre votre .Copy et votre .PasteSpecial, le
collage n'a plus rien sur quoi travailler et déclenche une erreur d'exécution :
Range("A1:A20").Copy
MsgBox "About to paste" ' ce MsgBox peut vider le presse-papiers
Range("C1").PasteSpecial xlPasteValues ' erreur d'execution 1004 : PasteSpecial method ... failed
Le presse-papiers a un état, et il est fragile. Il est effacé par un autre .Copy ou .Cut, par
Application.CutCopyMode = False, souvent par un MsgBox ou un InputBox, et parfois simplement parce
qu'Excel perd le focus. Le correctif est une discipline, pas une astuce : gardez le .Copy et le
.PasteSpecial adjacents, sans rien entre les deux — aucune boîte de dialogue, aucun autre copier,
aucune interaction utilisateur. Si vous devez boucler, copiez à l'intérieur de la boucle juste avant
chaque collage, jamais une seule fois au-dessus.
Les deux axes : ce qui traverse, et comment ça atterrit
Chaque appel à PasteSpecial se décrit par deux choix indépendants. Le premier, Paste:=, choisit
quelle couche traverse :
Range("A1").PasteSpecial Paste:=xlPasteValues ' seulement les valeurs resultantes
Range("A1").PasteSpecial Paste:=xlPasteFormulas ' les formules (les references se decalent)
Range("A1").PasteSpecial Paste:=xlPasteFormats ' polices, remplissages, bordures - pas de donnees
Range("A1").PasteSpecial Paste:=xlPasteColumnWidths ' seulement les largeurs de colonnes
Range("A1").PasteSpecial Paste:=xlPasteAll ' tout (comme un collage ordinaire)
Le second, Operation:=, décide comment les nombres entrants se combinent avec ce qui est déjà là —
xlPasteSpecialOperationAdd, Subtract, Multiply, Divide, ou None. Deux options complètent
l'ensemble : Transpose:=True bascule les lignes en colonnes, et SkipBlanks:=True laisse la cible
intacte partout où la cellule source est vide. Le classique « ajouter une correction à chaque nombre
d'une colonne » tient en un appel : mettez la correction dans une cellule, faites .Copy dessus, puis
PasteSpecial Paste:=xlPasteValues, Operation:=xlPasteSpecialOperationAdd sur la plage.
Le collage le plus courant — valeurs seules — et son piège de format
Coller seulement les valeurs est la raison pour laquelle la plupart des gens ouvrent Collage spécial :
cela transforme des formules vivantes en nombres qu'elles ont produits, ce qui permet de supprimer la
source ou d'arrêter le recalcul de formules volatiles (l'histoire complète est dans
Paste Values). Mais il y a un piège. xlPasteValues tout seul copie le
nombre, pas le format de nombre, si bien qu'une colonne de dates revient sous forme de numéros de
série comme 45000 et que la monnaie perd son symbole :
srcDates.Copy
dst.PasteSpecial Paste:=xlPasteValues ' les dates arrivent en 45000, 45001, ...
dst.PasteSpecial Paste:=xlPasteValuesAndNumberFormats ' les dates arrivent en dates - en general ce que vous voulez
Utilisez xlPasteValuesAndNumberFormats chaque fois que l'affichage compte, ce qui, pour les dates, la
monnaie et les pourcentages, est presque toujours le cas. Réservez xlPasteValues tout seul aux cas où
vous voulez vraiment des nombres bruts, sans aucune mise en forme transportée.
Nettoyer : CutCopyMode et les pointillés animés
Après un .Copy, Excel dessine autour de la source une bordure animée en pointillés et laisse le
presse-papiers armé. Définir Application.CutCopyMode = False efface les deux à la fois — la bordure
disparaît et vous dites à Excel que vous avez terminé. Ce n'est pas strictement nécessaire pour que le
collage fonctionne, mais le laisser actif signifie que la prochaine touche Entrée égarée colle à
nouveau, et une plage copiée laissée « vivante » est une source courante de la fragilité décrite plus
haut. Faites-en la dernière ligne de tout bloc copier/coller, juste après le PasteSpecial.
Quand PasteSpecial n'est pas le bon outil
PasteSpecial ne mérite sa place que lorsque vous avez besoin d'une seule couche (valeurs, formats,
formules) ou d'une opération (transposition, addition). Si vous copiez une plage telle quelle —
valeur, formule et format ensemble — vous n'avez pas du tout besoin du presse-papiers :
src.Copy Destination:=dst fait toute la copie en une instruction, sans rien à effacer ni à corrompre.
Et si vous voulez seulement les valeurs, dst.Value = src.Value est encore plus rapide et ne touche
jamais au presse-papiers, ce qui évite tous les modes de défaillance de ce guide. Le jugement est simple :
tournez-vous vers PasteSpecial pour un collage filtré, et pour une copie entière préférez
Copy Destination. Un PasteSpecial là où une simple affectation
suffirait est une ligne fragile qui attend de casser.
Comment ExcelMaster aide
Le duo .Copy puis .PasteSpecial est exactement le genre de chose qui marche dans un test rapide et
casse en production — un MsgBox se glisse entre les deux lignes, une boucle copie une fois au-dessus au
lieu de le faire à l'intérieur, xlPasteValues retire silencieusement les formats de date, et soudain la
macro déclenche PasteSpecial method of Range class failed ou colle des numéros de série à quelqu'un qui
leur fait confiance.
ExcelMaster vous laisse décrire
le collage que vous voulez — « colle seulement les valeurs ici », « copie juste la mise en forme de ce
bloc », « transpose cette colonne en ligne » — et il écrit le bon PasteSpecial avec le .Copy gardé
adjacent, xlPasteValuesAndNumberFormats quand l'affichage compte, et
Application.CutCopyMode = False pour nettoyer. Quand une copie entière suffirait, il se passe
complètement du presse-papiers. Vous gardez le classeur et le code.
Questions fréquentes
Pourquoi PasteSpecial method of Range class failed se produit-il ?
Parce que PasteSpecial lit le presse-papiers vivant et qu'il n'y a rien dessus. Il ne se souvient pas
de la plage que vous avez copiée plus tôt — il lit ce qui se trouve sur le presse-papiers à l'instant où
il s'exécute. Si un MsgBox, un autre .Copy, Application.CutCopyMode = False, ou Excel qui perd le
focus ont vidé le presse-papiers entre votre copie et votre collage, la méthode échoue. Gardez le .Copy
et le .PasteSpecial sur des lignes adjacentes, sans rien entre les deux.
Comment coller uniquement les valeurs en VBA ?
Faites .Copy sur la source, puis target.PasteSpecial Paste:=xlPasteValues, et terminez par
Application.CutCopyMode = False. Si les cellules sont des dates, de la monnaie ou des pourcentages,
utilisez plutôt xlPasteValuesAndNumberFormats pour que la mise en forme suive — xlPasteValues tout
seul colle les nombres bruts, et les dates arrivent en numéros de série comme 45000. Pour des valeurs
seules sans aucun presse-papiers, target.Value = source.Value est encore plus simple.
Quelle est la différence entre xlPasteValues et xlPasteValuesAndNumberFormats ?
xlPasteValues colle seulement les nombres et le texte résultants, en laissant tomber le format de
nombre, si bien qu'une date s'affiche sous son numéro de série et que la monnaie perd son symbole.
xlPasteValuesAndNumberFormats colle les valeurs et le format d'affichage, si bien que les dates
restent des dates et que la monnaie garde son symbole. Utilisez le second chaque fois que l'affichage
compte, ce qui est le cas la plupart du temps.
Comment transposer une plage avec PasteSpecial ?
Faites .Copy sur la source, puis collez avec Transpose:=True, par exemple
target.PasteSpecial Paste:=xlPasteValues, Transpose:=True. Cela bascule les lignes en colonnes et les
colonnes en lignes. Combinez-le avec xlPasteValues quand vous voulez seulement transposer les données,
ou avec xlPasteAll pour transporter aussi la mise en forme.
Puis-je utiliser PasteSpecial pour additionner ou multiplier une plage de nombres ?
Oui — c'est l'axe Operation:=. Mettez l'opérande dans une cellule, faites .Copy dessus, puis sur la
plage cible appelez PasteSpecial Paste:=xlPasteValues, Operation:=xlPasteSpecialOperationAdd (ou
Multiply, Subtract, Divide). Excel combine le nombre copié avec chaque valeur existante en place —
une façon, en un seul appel, d'augmenter toute une colonne d'une correction ou de l'échelonner par un
facteur.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 09/09/2026.
Guides connexes : VBA Paste Values · VBA Copy Destination · VBA Copy Paste · VBA Range · VBA Formula
