TL;DR —
src.Copy Destination:=dstcopia un rango directamente a su destino en una sola instrucción. El portapapeles nunca se toca, así que nada puede corromperlo a mitad de la ejecución, no hay «hormigas en marcha» que limpiar, y no hay ningún.Selectque ralentice las cosas. Lleva la celda entera — valor, fórmula y formato. Si quieres solo valores,dst.Value = src.Valuees todavía más directo. Reserva el portapapeles (PasteSpecial) para cuando necesites una sola capa o una operación.
' Una instruccion, sin portapapeles, sin Select:
Range("A1:C100").Copy Destination:=Sheet2.Range("A1")
' Solo valores, aun mas directo (sin formatos, sin formulas):
Sheet2.Range("A1:C100").Value = Range("A1:C100").Value
Abre cualquier macro grabada y encontrarás las mismas tres líneas: Range(...).Select,
Selection.Copy, y luego ActiveSheet.Paste. Eso es la grabadora de macros anotando
fielmente lo que hace una persona — hacer clic, copiar, hacer clic, pegar — todo
pasando por el portapapeles de Windows. Tu código no necesita nada de eso. Ya tiene
referencias a ambos rangos, así que puede mover los datos directamente de uno a otro.
Copy Destination es cómo, y es la limpieza más grande que puedes hacer al código
grabado de Copy Paste.
Lo que aprenderás
- El modelo mental — tu código ya tiene ambos rangos, así que no necesita un intermediario de portapapeles
- La regla que arregla las macros grabadas — quita el
.Selecty copia directo a unDestination - La regla de la esquina superior izquierda —
Destinationsolo necesita la primera celda del destino - Qué lleva un
Copy Destinationcompleto frente a lo que llevadst.Value = src.Value - Copiar entre hojas y libros con un
Destinationcualificado - Cuándo de verdad sigues necesitando el portapapeles
El modelo mental: un movimiento directo, sin intermediarios
Cuando tú copias y pegas, el portapapeles es una zona de tránsito — copias aquí, mueves las manos, pegas allí. La grabadora captura esos movimientos de manos, por eso el código grabado selecciona y activa todo el rato. Pero VBA no es un par de manos. Ya tiene una referencia directa al rango de origen y una referencia directa al destino, así que puede entregar los datos sin ninguna zona de tránsito de por medio.
Copy Destination es ese traspaso directo escrito en una línea:
origen.Copy Destination:=destino. No hay paso de portapapeles que pueda fallar,
ninguna selección de la que depender, ninguna pantalla parpadeando mientras el cursor
salta de un lado a otro. En cuanto ves copiar como mover datos entre dos referencias
que ya tienes, la versión con portapapeles se ve por lo que es — la traducción de un
hábito manual que tu código nunca tuvo.
La regla que más importa: sáltate Select y el portapapeles
Aquí está por qué el patrón grabado merece ser reemplazado, no solo pulido.
Range("A1:A10").Copy seguido de Range("C1").Select seguido de ActiveSheet.Paste es
lento, frágil y depende del foco:
' Grabado - lento, fragil, depende de lo que este seleccionado y activo:
Range("A1:A10").Copy
Range("C1").Select
ActiveSheet.Paste
' Directo - una linea, sin portapapeles, sin seleccion:
Range("A1:A10").Copy Destination:=Range("C1")
La versión grabada redibuja la pantalla en cada .Select, se rompe si la hoja activa no
es la correcta, y su portapapeles puede ser borrado por un Ctrl+C perdido, un
MsgBox, o que Excel pierda el foco entre la copia y el pegado. La versión directa no
tiene ninguno de esos modos de fallo porque no hay nada que pierda el foco hacia y
nada en el portapapeles que corromper. Borra cada .Select y .Activate que escribió
una grabadora, y copia directo a un Destination — es más rápido y no se puede
interrumpir.
La regla de la esquina superior izquierda: Destination se ajusta solo
Una preocupación habitual es que el destino tenga que ser exactamente del mismo tamaño
que el origen. Para Copy Destination, no es así: le das a Excel la celda superior
izquierda del destino y él rellena el resto para que coincida con la forma del origen:
Range("A1:C100").Copy Destination:=Sheet2.Range("A1") ' A1 sola - rellena A1:C100 por ti
Pasar una sola celda es lo normal y la opción más segura. Si sí pasas un Destination
multi-celda, tiene que ser un múltiplo entero del origen (Excel embaldosa la copia
dentro de él) o te da un error en tiempo de ejecución, así que a menos que quieras
específicamente ese embaldosado, nombra solo la primera celda. Esto es lo opuesto del
atajo de solo valores de abajo, donde los dos rangos deben coincidir en tamaño.
Qué lleva Copy Destination — y qué lleva Value = Value
Los dos métodos directos mueven cosas distintas, y elegir entre ellos es todo el juego:
src.Copy Destination:=dstes una copia completa — valores, fórmulas, formatos de número, bordes, rellenos, todo. Es el reemplazo directo de un pegado grabado normal.dst.Value = src.Valuemueve solo valores — sin fórmulas (los resultados se pegan como números), sin formatos. Es más rápido y no se puede interrumpir, y los dos rangos deben ser del mismo tamaño.
Así que la decisión es: ¿necesito que el formato y las fórmulas viajen también? Usa
Copy Destination. ¿Solo quiero los números, y preferiría que las fórmulas de origen
quedaran congeladas en resultados? Usa .Value = .Value (esa congelación es el tema de
Paste Values). Ambos se saltan el portapapeles; solo se
diferencian en qué cruza.
Copiar entre hojas y libros
Destination es solo un rango, así que puede vivir en cualquier hoja o en cualquier
libro abierto — cualifícalo del todo y la copia va a donde apuntes:
' Entre hojas - no hace falta activar ninguna de las dos:
ThisWorkbook.Worksheets("Data").Range("A1:D50").Copy _
Destination:=ThisWorkbook.Worksheets("Report").Range("A1")
' A otro libro abierto:
Range("A1:D50").Copy Destination:=Workbooks("Summary.xlsx").Worksheets("Sheet1").Range("A1")
Como no se selecciona ni se activa nada, las hojas de origen y destino pueden quedarse en segundo plano — la copia no molesta lo que el usuario está mirando. Cualificar ambos extremos por completo (libro, hoja, rango) es el hábito que hace que una copia funcione sin importar qué hoja esté activa cuando se ejecute la macro.
Cuándo todavía necesitas el portapapeles
Los métodos directos cubren los casos comunes — una copia completa o un movimiento de
solo valores. Sí sigues necesitando el portapapeles para un pegado filtrado: solo
valores con formatos pero sin fórmulas, solo formatos, solo anchos de columna, o una
operación como transponer o sumar. Para eso está exactamente
PasteSpecial, y ahí el .Copy y el .PasteSpecial deben
quedar adyacentes. El criterio: por defecto usa Copy Destination para una copia
completa y .Value = .Value para valores, y recurre al portapapeles solo cuando
necesites una sola capa o una operación que los métodos directos no puedan expresar.
Cómo ayuda ExcelMaster
La mayoría de las macros grabadas son más lentas y frágiles de lo necesario por una
razón: copian y pegan a través del portapapeles con un rastro de líneas .Select,
cuando los datos podrían moverse directamente. Funciona hasta que un Ctrl+C aterriza a
mitad de la ejecución, o la hoja equivocada está activa, y entonces pega lo que no es o
falla.
ExcelMaster
escribe la versión directa desde el principio — Copy Destination:= para una copia
completa, dst.Value = src.Value cuando solo necesitas valores, ambos extremos
totalmente cualificados para que ninguna hoja tenga que estar activa, y ningún
.Select en ningún sitio. Recurre a PasteSpecial solo cuando de verdad pides una sola
capa o una transposición. Tú conservas el libro y el código.
Preguntas frecuentes
¿Cómo copio un rango a otra hoja sin seleccionarlo?
Usa un Destination cualificado:
Worksheets("Data").Range("A1:C100").Copy Destination:=Worksheets("Report").Range("A1").
Ninguna de las dos hojas necesita estar activa ni seleccionada — nombrar ambos rangos es
suficiente. Esto es más rápido que el Select / Copy / Paste grabado y no molesta lo
que el usuario esté mirando en ese momento.
¿El rango destino tiene que ser del mismo tamaño que el origen?
No con Copy Destination — pasa solo la celda superior izquierda del destino y Excel
ajusta la copia para que coincida con el origen. Pasar un destino multi-celda solo
funciona si es un múltiplo entero del origen (Excel lo embaldosa), así que nombrar una
sola celda es la opción segura por defecto. La forma de solo valores
dst.Value = src.Value es la excepción: ahí los dos rangos deben ser del mismo tamaño.
¿Cuál es la diferencia entre Copy Destination y .Value = .Value?
Copy Destination es una copia completa — valores, fórmulas y formatos cruzan todos.
dst.Value = src.Value mueve solo valores (las fórmulas llegan como sus resultados, el
formato no viaja) pero es más rápido y nunca toca el portapapeles. Usa Copy Destination
cuando el formato importe; usa .Value = .Value cuando solo quieras los números.
¿Es Copy Destination más rápido que Copy y Paste?
Sí, y más fiable. Es una instrucción en vez de tres, evita los redibujados de pantalla
que dispara cada .Select, y nunca pasa por el portapapeles, así que nada externo puede
borrar o corromper los datos a mitad de la operación. Para solo valores,
dst.Value = src.Value es todavía más rápido.
¿Necesito Application.CutCopyMode = False después de Copy Destination?
No. Copy Destination no deja el portapapeles armado como sí lo hace un .Copy normal
seguido de un pegado, así que no hay «hormigas en marcha» que limpiar. Solo necesitas
Application.CutCopyMode = False después de un pegado con portapapeles como
PasteSpecial.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 09/09/2026.
Guías relacionadas: VBA PasteSpecial · VBA Pegar valores · VBA Copiar y pegar · VBA Range · VBA Cells
