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

VBA PasteSpecial en Excel — pega solo valores, formatos o fórmulas (y por qué falla)

|

VBA PasteSpecial en Excel — pega solo valores, formatos o fórmulas (y por qué falla)

TL;DRPasteSpecial es un pegado filtrado: haces .Copy de 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 — un MsgBox, otra copia, incluso que Excel pierda el foco — te da PasteSpecial method of Range class failed. Si estás copiando todo tal cual, no necesitas PasteSpecial en 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 — PasteSpecial es 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 .Copy debe 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 (xlPasteValues frente a xlPasteValuesAndNumberFormats)
  • Limpiar con Application.CutCopyMode = False
  • Cuándo PasteSpecial es 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