Probado en: Excel 365 v2509 · Excel 2021 · Excel 2019 · última verificación 12/06/2026
En resumen — La grabadora de macros escribe Select → Copy → Paste: 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 tú 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
.Valuede un rango a otro — sinCopy, sinPaste, sin portapapeles. Solo necesitasCopy+PasteSpecialcuando 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 sí 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
CopyyPasteSpecial— niMsgBox, 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
PasteSpecialen absoluto — usa.Value = .Valuey 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 |
Sí |
| Solo formatos | .PasteSpecial xlPasteFormats |
Sí |
| Solo fórmulas | .PasteSpecial xlPasteFormulas |
Sí |
| Transponer filas ↔ columnas | .PasteSpecial Transpose:=True |
Sí |
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
- VBA Range — referenciar celdas sin seleccionarlas
- VBA Array — leer y escribir un rango de una vez
- VBA VLookup — el fallo de «no encontrado» y cuándo gana un Dictionary
- VBA Outlook — enviar correo desde una macro correctamente
- VBA bucle For en Excel — 8 ejemplos reales
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 Copy → PasteSpecial.
¿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.
