TL;DR —
PasteSpeciales un pegado filtrado: haces.Copyde un rango al portapapeles y luego eliges qué única capa cruza — valores, formatos, fórmulas o anchos de columna — y, opcionalmente, una operación (sumar, multiplicar, transponer). La trampa es que lee un portapapeles en vivo, así que debe ir justo después de un.Copy; cualquier cosa que borre el portapapeles entre medias — unMsgBox, otra copia, incluso que Excel pierda el foco — te daPasteSpecial method of Range class failed. Si estás copiando todo tal cual, no necesitasPasteSpecialen absoluto — para eso está Copy Destination.
' PasteSpecial lee el portapapeles, copia justo antes.
Range("A1:A20").Copy ' carga el portapapeles
Range("C1").PasteSpecial Paste:=xlPasteValues ' solo cruzan los valores
Application.CutCopyMode = False ' borra el marco en movimiento
' Elige que cruza Y como aterriza en una sola llamada:
Range("E1:E20").Copy
Range("G1").PasteSpecial Paste:=xlPasteValues, _
Operation:=xlPasteSpecialOperationAdd, Transpose:=False
PasteSpecial es el gemelo en código del cuadro de diálogo Pegado especial — el que
te deja pegar solo valores, solo formatos, o transponer una columna en una fila. El
simple Copy Paste mueve la celda entera; PasteSpecial es lo
que usas cuando quieres una sola capa de ella y nada más. Ese poder viene con una
restricción estricta que hace tropezar a casi todo el mundo la primera vez, así que
empezamos por ahí y construimos desde ahí.
Lo que aprenderás
- El modelo mental —
PasteSpeciales un filtro sobre un pegado, no un tipo distinto de copia - La regla que evita casi todos los fallos — lee un portapapeles en vivo, así que el
.Copydebe ir justo antes - Los dos ejes — qué cruza (
Paste:=) y cómo aterriza (Operation:=,Transpose:=) - El pegado de solo valores y su trampa de formato (
xlPasteValuesfrente axlPasteValuesAndNumberFormats) - Limpiar con
Application.CutCopyMode = False - Cuándo
PasteSpeciales la herramienta equivocada y un movimiento directo es mejor
El modelo mental: un filtro sobre un pegado
Un pegado normal copia una celda entera — su valor, su fórmula, su formato de número,
sus bordes, su relleno, todo a la vez. PasteSpecial pone un filtro delante de ese
pegado. Sigues haciendo .Copy de todo el origen al portapapeles, pero en el momento de
pegar dices «deja pasar solo esta capa». Piensa en el portapapeles como una pila de
láminas transparentes — valor, fórmula, formato, ancho de columna — y en PasteSpecial
como la única herramienta que te deja levantar una sola lámina y depositarla sobre el
destino.
Esa es toda la idea, y explica por qué PasteSpecial siempre viene en dos mitades: un
.Copy que carga cada capa en el portapapeles, y un .PasteSpecial que elige qué capa
conservar. Si te saltas la primera mitad no hay nada que filtrar — que es exactamente el
modo de fallo de abajo.
La regla que más importa: lee un portapapeles en vivo
Aquí está el error detrás de casi todos los PasteSpecial method of Range class failed.
PasteSpecial no recuerda el rango que copiaste — lee el portapapeles de Windows en
el instante en que se ejecuta. Si algo borra el portapapeles entre tu .Copy y tu
.PasteSpecial, el pegado no tiene con qué trabajar y lanza un error en tiempo de
ejecución:
Range("A1:A20").Copy
MsgBox "About to paste" ' este MsgBox puede borrar el portapapeles
Range("C1").PasteSpecial xlPasteValues ' error en tiempo de ejecucion 1004: PasteSpecial method ... failed
El portapapeles es volátil y frágil. Lo borra otro .Copy o .Cut,
Application.CutCopyMode = False, a menudo un MsgBox o InputBox, y a veces basta con
que Excel pierda el foco. La solución es disciplina, no un truco: mantén el .Copy y
el .PasteSpecial pegados, sin nada entre medias — ni diálogos, ni otras copias, ni
interacción del usuario. Si necesitas un bucle, copia dentro del bucle justo antes de
cada pegado, nunca una sola vez fuera de él.
Los dos ejes: qué cruza y cómo aterriza
Toda llamada a PasteSpecial se describe con dos decisiones independientes. La primera,
Paste:=, elige qué capa cruza:
Range("A1").PasteSpecial Paste:=xlPasteValues ' solo los valores resultantes
Range("A1").PasteSpecial Paste:=xlPasteFormulas ' las formulas (las referencias se desplazan)
Range("A1").PasteSpecial Paste:=xlPasteFormats ' fuentes, rellenos, bordes - sin datos
Range("A1").PasteSpecial Paste:=xlPasteColumnWidths ' solo los anchos de columna
Range("A1").PasteSpecial Paste:=xlPasteAll ' todo (igual que un pegado normal)
La segunda, Operation:=, decide cómo se combinan los números entrantes con lo que ya
hay — xlPasteSpecialOperationAdd, Subtract, Multiply, Divide, o None. Dos
interruptores completan el conjunto: Transpose:=True convierte filas en columnas, y
SkipBlanks:=True deja el destino intacto donde la celda de origen está vacía. El truco
clásico de «sumar una corrección a cada número de una columna» es una sola llamada: pon
la corrección en una celda, hazle .Copy, y luego PasteSpecial Paste:=xlPasteValues, Operation:=xlPasteSpecialOperationAdd sobre el rango.
El pegado más común — solo valores — y su trampa de formato
Pegar solo valores es la razón por la que la mayoría abre Pegado especial: convierte
fórmulas vivas en los números que produjeron, para que puedas borrar el origen o dejar
de recalcular fórmulas volátiles (la historia completa está en
Paste Values). Pero hay una trampa. El xlPasteValues a
secas copia el número, no el formato de número, así que una columna de fechas se
pega como números de serie tipo 45000 y la moneda pierde su símbolo:
srcDates.Copy
dst.PasteSpecial Paste:=xlPasteValues ' las fechas llegan como 45000, 45001, ...
dst.PasteSpecial Paste:=xlPasteValuesAndNumberFormats ' las fechas llegan como fechas - normalmente lo que quieres
Usa xlPasteValuesAndNumberFormats siempre que la visualización importe, que para
fechas, moneda y porcentajes es casi siempre. Reserva el xlPasteValues a secas para
cuando de verdad quieras los números en bruto sin ningún formato heredado.
Limpieza: CutCopyMode y el marco en movimiento
Después de un .Copy, Excel dibuja un borde brillante de «hormigas en marcha» alrededor
del origen y deja el portapapeles armado. Poner Application.CutCopyMode = False borra
ambas cosas — quita el borde y le dice a Excel que has terminado. No es estrictamente
necesario para que el pegado funcione, pero dejarlo activo hace que la siguiente tecla
Enter perdida vuelva a pegar, y un rango copiado que queda «vivo» es una fuente
habitual de la fragilidad de arriba. Conviértelo en la última línea de cualquier bloque
de copiar/pegar, justo después del PasteSpecial.
Cuándo PasteSpecial es la herramienta equivocada
PasteSpecial se gana su sitio solo cuando necesitas una sola capa (valores,
formatos, fórmulas) o una operación (transponer, sumar). Si estás copiando un rango
tal cual — valor, fórmula y formato juntos — no necesitas el portapapeles en absoluto:
src.Copy Destination:=dst hace toda la copia en una sola instrucción sin nada que
borrar ni corromper. Y si quieres solo valores, dst.Value = src.Value es aún más
rápido y nunca toca el portapapeles, esquivando cada modo de fallo de esta guía. El
criterio es simple: recurre a PasteSpecial para un pegado filtrado, y para una copia
completa prefiere Copy Destination. Un PasteSpecial
donde bastaría una asignación simple es una línea frágil esperando a romperse.
Cómo ayuda ExcelMaster
El tándem .Copy-luego-.PasteSpecial es exactamente el tipo de cosa que funciona en
una prueba rápida y se rompe en producción — un MsgBox se cuela entre las dos líneas,
un bucle copia una vez fuera en lugar de dentro, xlPasteValues borra en silencio los
formatos de fecha, y de repente la macro lanza PasteSpecial method of Range class failed o pega números de serie a alguien que confía en ellos.
ExcelMaster te
deja describir el pegado que quieres — «pega aquí solo los valores», «copia solo el
formato de ese bloque», «transpón esta columna en una fila» — y escribe el
PasteSpecial correcto con el .Copy pegado justo antes, xlPasteValuesAndNumberFormats
cuando la visualización importa, y Application.CutCopyMode = False para limpiar.
Cuando basta una copia completa, se salta el portapapeles por completo. Tú conservas el
libro y el código.
Preguntas frecuentes
¿Por qué ocurre PasteSpecial method of Range class failed?
Porque PasteSpecial lee el portapapeles en vivo y no hay nada en él. No recuerda el
rango que copiaste antes — lee lo que sea que haya en el portapapeles en el instante en
que se ejecuta. Si un MsgBox, otro .Copy, Application.CutCopyMode = False, o que
Excel perdiera el foco borraron el portapapeles entre tu copia y tu pegado, el método
falla. Mantén el .Copy y el .PasteSpecial en líneas adyacentes sin nada entre medias.
¿Cómo pego solo valores en VBA?
Haz .Copy del origen y luego target.PasteSpecial Paste:=xlPasteValues, terminando
con Application.CutCopyMode = False. Si las celdas son fechas, moneda o porcentajes,
usa xlPasteValuesAndNumberFormats en su lugar para que el formato viaje con ellas — el
xlPasteValues a secas pega los números en bruto y las fechas llegan como series tipo
45000. Para solo valores sin portapapeles alguno, target.Value = source.Value es
todavía más simple.
¿Cuál es la diferencia entre xlPasteValues y xlPasteValuesAndNumberFormats?
xlPasteValues pega solo los números y textos resultantes, descartando el formato de
número, así que una fecha se muestra como su número de serie y la moneda pierde su
símbolo. xlPasteValuesAndNumberFormats pega los valores y el formato de
visualización, así que las fechas siguen siendo fechas y la moneda conserva su símbolo.
Usa el segundo siempre que la visualización importe, que es la mayoría de las veces.
¿Cómo transpongo un rango con PasteSpecial?
Haz .Copy del origen y luego pega con Transpose:=True, por ejemplo
target.PasteSpecial Paste:=xlPasteValues, Transpose:=True. Eso convierte filas en
columnas y columnas en filas. Combínalo con xlPasteValues cuando solo quieras
transponer los datos, o con xlPasteAll para llevar también el formato.
¿Puedo usar PasteSpecial para sumar o multiplicar un rango de números?
Sí — para eso está el eje Operation:=. Pon el operando en una celda, hazle .Copy, y
luego sobre el rango destino llama a PasteSpecial Paste:=xlPasteValues, Operation:=xlPasteSpecialOperationAdd (o Multiply, Subtract, Divide). Excel
combina el número copiado con cada valor existente en su sitio — una forma de una sola
llamada para subir toda una columna con una corrección o escalarla por un factor.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 09/09/2026.
Guías relacionadas: VBA Pegar valores · VBA Copy Destination · VBA Copiar y pegar · VBA Range · VBA Formula
