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

VBA Copy Destination en Excel — mueve un rango sin tocar el portapapeles

|

VBA Copy Destination en Excel — mueve un rango sin tocar el portapapeles

TL;DRsrc.Copy Destination:=dst copia 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 .Select que ralentice las cosas. Lleva la celda entera — valor, fórmula y formato. Si quieres solo valores, dst.Value = src.Value es 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 .Select y copia directo a un Destination
  • La regla de la esquina superior izquierda — Destination solo necesita la primera celda del destino
  • Qué lleva un Copy Destination completo frente a lo que lleva dst.Value = src.Value
  • Copiar entre hojas y libros con un Destination cualificado
  • Cuándo de verdad sigues necesitando el portapapeles

El modelo mental: un movimiento directo, sin intermediarios

Cuando 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 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:=dst es 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.Value mueve 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. 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