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

VBA Copy Paste en Excel — evita el portapapeles para macros más rápidas

|

VBA Copy Paste en Excel — evita el portapapeles para macros más rápidas

Probado en: Excel 365 v2509 · Excel 2021 · Excel 2019 · última verificación 12/06/2026

En resumen — La grabadora de macros escribe SelectCopyPaste: tres pasos que hacen pasar tus datos por el portapapeles de Windows. Es lento, cualquier otra cosa en marcha puede borrarlo, y la pantalla parpadea. Si solo quieres los valores, todo se reduce a una línea que nunca toca el portapapeles: rngB.Value = rngA.Value.

Sub CopyDemo()
    ' (1) Solo valores — sin portapapeles, instantáneo, no interrumpible
    Sheet2.Range("A1:C100").Value = Sheet1.Range("A1:C100").Value

    ' (2) Valores Y formato en un paso — .Copy con Destination
    Sheet1.Range("A1:C100").Copy Destination:=Sheet2.Range("A1")

    ' (3) Un solo aspecto (valores / formatos / fórmulas) — necesita el portapapeles
    Sheet1.Range("A1:C100").Copy
    Sheet2.Range("A1").PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False              ' borrar el "marco en marcha" del portapapeles
End Sub

El modelo mental: el portapapeles es un intermediario que tu código no necesita

Cuando copias y pegas, el portapapeles es una zona de tránsito — copias aquí, haces clic allí, pegas. La grabadora registra fielmente esos gestos humanos, por eso el código grabado está lleno de .Select, Selection.Copy y ActiveSheet.Paste. Pero tu código ya tiene referencias directas a ambos rangos. No tiene que hacer clic en nada y no necesita zona de tránsito — puede mover los datos directamente.

Ese único cambio explica todo lo que sigue. Copiar-pegar no es incorrecto; es la traducción de un flujo manual a código, y casi siempre ese flujo manual tenía un paso que tu código puede simplemente saltarse. Pregunta «¿muevo valores, valores-y-formato, o un aspecto concreto?» y la herramienta correcta cae sola — y dos de las tres respuestas nunca se acercan al portapapeles.

La única regla: la asignación mueve valores; el portapapeles es solo para aspectos

Esta es la regla que reemplaza el 90 % del copiar-pegar grabado:

Para mover valores, asigna el .Value de un rango a otro — sin Copy, sin Paste, sin portapapeles. Solo necesitas Copy + PasteSpecial cuando quieres un aspecto concreto de una celda (solo valores, solo formatos, solo fórmulas) y nada más.

.Value = .Value es directo, instantáneo y — crucial — no interrumpible. Nada puede borrarlo a mitad porque nunca usa estado global compartido. Compara las dos formas de «pegar valores»:

' ⚠ ESTILO GRABADORA — portapapeles, tres pasos, frágil
Range("A1:A100").Select
Selection.Copy
Range("C1").Select
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

' ✓ DIRECTO — una línea, sin portapapeles, nada que borrar ni interrumpir
Range("C1:C100").Value = Range("A1:A100").Value

La forma directa es más rápida, más corta y sobrevive a cualquier cosa que pase en la máquina mientras corre. La forma grabada hace el mismo trabajo pasando por un recurso global que otros tres programas podrían estar usando.

La trampa: PasteSpecial depende de un portapapeles que cualquier cosa puede borrar

Cuando necesitas PasteSpecial — por ejemplo conservar el formato de una celda pero soltar sus fórmulas — recuerda que Copy pone los datos en el portapapeles del sistema, un estado global y volátil. Dos cosas muerden:

Range("A1:A100").Copy
MsgBox "A punto de pegar"   ' ⚠ algunos diálogos / recálculos borran el portapapeles...
Range("C1").PasteSpecial xlPasteValues   ' ...y ahora esto falla o no pega nada

Las soluciones son hábitos, no trucos:

  • No pongas nada entre Copy y PasteSpecial — ni MsgBox, ni cálculo, ni un segundo copy. Copiar, pegar, listo.
  • Borra siempre después con Application.CutCopyMode = False, para no dejar las celdas origen con el «marco en marcha» y el portapapeles cargado.
  • Si solo quieres valores, no recurras a PasteSpecial en absoluto — usa .Value = .Value y toda la clase de problemas del portapapeles desaparece.

Para copiar valores y formato juntos, rng.Copy Destination:=target es el punto dulce: una sola instrucción, lo lleva todo, y la forma Destination hace el movimiento sin dejar el portapapeles cargado.

Cuándo usar cuál

Quieres mover… Usa ¿Portapapeles?
Solo valores rngB.Value = rngA.Value No
Valores y formatos, fórmulas, todo rngA.Copy Destination:=rngB No
Solo valores (y ya estás en pleno Copy) .PasteSpecial xlPasteValues
Solo formatos .PasteSpecial xlPasteFormats
Solo fórmulas .PasteSpecial xlPasteFormulas
Transponer filas ↔ columnas .PasteSpecial Transpose:=True

La opinión: nunca entregues un copiar-pegar grabado

La línea que defiendo: el copiar-pegar grabado es un borrador, no un destino. La grabadora es una forma estupenda de descubrir qué objeto y método necesitas, pero el código que escribe — Select, Selection, ActiveSheet.Paste, sin limpiar CutCopyMode — es la forma más lenta y frágil. Depende de lo que esté seleccionado, hace parpadear la pantalla, y lo hace pasar todo por un portapapeles que cualquier otra app puede pisotear.

Quita los .Select, decide qué mueves de verdad, y la respuesta casi siempre cabe en una línea. Si son solo valores, .Value = .Value. Si es todo, .Copy Destination:=. Reserva PasteSpecial para el caso real de «un solo aspecto», mantenlo pegado entre Copy y el pegado, y borra CutCopyMode después. Una macro escrita así corre en una fracción del tiempo y no la puede romper un diálogo perdido — que es todo el sentido de automatizarla.

Errores comunes de VBA Copy-Paste (y la solución)

Síntoma Causa Solución
PasteSpecial falla / no pega nada Un diálogo o recálculo borró el portapapeles a mitad Nada entre Copy y PasteSpecial
Macro lenta con rangos grandes Copiar-pegar celda a celda o basado en Select Mover rangos enteros con .Value = .Value
El origen sigue con el marco en marcha Olvidaste Application.CutCopyMode = False Bórralo justo tras pegar
Vinieron los formatos cuando querías valores Usaste Copy/Paste en vez de solo valores .Value = .Value o PasteSpecial xlPasteValues
«El método Paste de la clase Worksheet falló» Pegar en un rango de forma distinta, o nada copiado Igualar dimensiones; asegurar que Copy corrió
La pantalla parpadea al copiar .Select/.Activate en el bucle Referenciar rangos directamente; ScreenUpdating = False

Cuando copiar se acumula — describe el movimiento en su lugar

No te propusiste aprender los modos de fallo del portapapeles. Querías «pasa las filas pagadas de esta hoja al resumen, solo valores, cada mañana». Para cuando has des-grabado los .Select, decidido entre .Value y PasteSpecial, y recordado borrar CutCopyMode, la fontanería de copia es la macro. ExcelMaster Agent te deja describir el movimiento en español sencillo — «copia las filas con estado pagado a la hoja Resumen como valores, conservando el encabezado» — y escribe Python que mueve los datos directamente, sin portapapeles, haciendo antes una copia de seguridad de tu libro. Pruébalo gratis →

Guías relacionadas

FAQ

¿Cómo copio y pego en VBA sin el portapapeles? Para valores, asigna directamente: Range("C1:C100").Value = Range("A1:A100").Value. Para llevar valores y formato en un paso sin dejar el portapapeles cargado, usa Range("A1:A100").Copy Destination:=Range("C1"). Ambos evitan el ida y vuelta lento e interrumpible CopyPasteSpecial.

¿Cómo pego solo valores en VBA? Lo más limpio es rangoDestino.Value = rangoOrigen.Value, que copia valores sin portapapeles alguno. Si ya estás en pleno Copy, usa Range("C1").PasteSpecial Paste:=xlPasteValues y luego Application.CutCopyMode = False. No pongas un MsgBox ni un cálculo entre copiar y pegar, o el portapapeles puede borrarse antes.

¿Qué hace Application.CutCopyMode = False? Borra el «marco en marcha» del portapapeles y la copia pendiente después de pegar. Eso evita un estado de portapapeles obsoleto y un rango origen visiblemente enmarcado. Ejecútalo justo tras una secuencia Copy + PasteSpecial.

¿Por qué mi copiar-pegar VBA es tan lento? Normalmente porque .Selecta los rangos y hace pasar los datos por el portapapeles bloque a bloque, a menudo en un bucle. Mueve rangos enteros de una vez con .Value = .Value, quita los .Select/.Activate, y pon Application.ScreenUpdating = False mientras corre.

¿Cuál es la diferencia entre Copy Destination y PasteSpecial? rng.Copy Destination:=target copia todo (valores, formatos, fórmulas) en una instrucción, sin dejar el portapapeles cargado. PasteSpecial existe para copiar un solo aspecto — valores, formatos o fórmulas — y exige un Copy previo más una limpieza CutCopyMode = False. Usa Destination para una copia completa, PasteSpecial cuando solo quieras una parte.