Cómo copiar y pegar celdas con VBA

Copiar y pegar valores en Excel es una tarea muy común por lo que será casi inevitable que en algún momento necesites hacer un copiado y pegado de celdas dentro de una macro. Para copiar y pegar celdas con VBA haremos uso de los métodos Copy y PasteSpecial del objeto Range.

Copiar y pegar celdas en la misma hoja

Si los valores serán pegados dentro de la misma hoja, entonces puedes utilizar un código como el siguiente:

Cómo copiar y pegar celdas con VBA

Este código copiara el contenido de la celda A1 y lo pegará en la celda B1. El argumento xlPasteAll ocasiona que se pegue todo el contenido en la celda B1incluyendo el formato de la celda y las fórmulas.  Finalmente la instrucción Application.CutCopyMode = False hace que Excel de por finalizada la acción de copiado y pegado.

Copiar y pegar los valores de una celda con VBA

Si en lugar de copiar todo el contenido de una celda deseas copiar solamente los valores, entonces debes hacer una pequeña modificación en el argumento del método PasteSpecial de la siguiente manera:

Copiar los valores de una celda usando VBA

Observa que ahora el argumento utilizado es xlPasteValues el cual ocasionará que se peguen solamente los valores de las celdas copiadas.

Copiar y pegar una fila o columna con VBA

Es posible copiar y pegar columnas con VBA si modificamos el rango indicado en el método Range. Por ejemplo, para copiar la columna A en la columna B utiliza el siguiente código:

Cómo copiar una columna de Excel con VBA

Si en lugar de copiar la columna A, necesitas copiar la fila 1 y pegarla en la fila 2, entonces puedes usar el siguiente código:

Cómo copiar y pegar una fila usando VBA

Copiar y pegar a otra hoja

Para pegar los valores a una hoja diferente, solamente debemos especificar la hoja destino haciendo uso del objeto Worksheets de la siguiente manera:

Copiar y pegar celdas a otra hoja de Excel con VBA

Ahora bien, si tanto la hoja origen como la hoja destino son diferentes a la hoja activa, entonces será necesario indicar el nombre de la hoja tanto al momento de copiar como al momento de pegar. En el siguiente código estoy suponiendo que el botón que ejecuta la macro se encuentra en la Hoja1 y copiaré todo el contenido de la celda A1 de la Hoja2 hacia la celda B1 de la Hoja3:

Copiar rangos o celdas con VBA

Método abreviado para copiar celdas con VBA

En todos los ejemplos anteriores he utilizado el método PasteSpecial para pegar los valores en las celdas destino. Una ventaja de ese método es que puedo elegir si deseo copiar el contenido completo de la celda (xlPasteAll) o solo sus valores (xlPasteValues) sin embargo existe otro método alterno en caso de querer copiar siempre todo el contenido de una celda. Observa el siguiente código:

Método abreviado para copiar celdas con VBA

Este código copia todo el contenido de la celda A1 (incluyendo fórmulas y formato) a la celda B1 de la misma hoja. El argumento Destination es el que nos permite especificar el rango en el cual se pegarán los valores. A continuación puedes observar, en el mismo bloque de código, diferentes ejemplos utilizando este mismo método abreviado para copiar celdas con VBA:

Ejemplos de código VBA para copiar celdas en Excel

Como has visto en los ejemplos de este artículo, el primer método que utilizamos nos ofrece una gran flexibilidad a través del método PasteSpecial  el cual nos permite elegir si deseamos pegar todo el contenido de una celda o solo sus valores. Pero si estás seguro de querer copiar siempre todo el contenido de las celdas, entonces el método abreviado, utilizando el argumento Destination del método Copy, será suficiente para lograr nuestro objetivo.

Ahora ya sabes cómo copiar y pegar celdas con VBA y solo es cuestión de que elijas el método adecuado a tus necesidades.

16 comentarios en “Cómo copiar y pegar celdas con VBA

  1. Julio

    Gracias por esta clase que es de gran utilidad, sobre todo lo de la parte abreviada que no me la sabia.

  2. jorge

    muchas gracias por tu explicacion te agradezco lo que haces por los que vamos aprendiendo.

  3. nithael

    Hola, estoy aprendiendo o intentando aprender vb y llevo todo el día buscando codigo para copiar celdas de una hoja a otra, los que encontré son eternos comparado con tu simple instrucción “destination”, aun no lo puedo creer que sea tan sencillo, gracias. Está explicado muy claro en los ejemplos, muchas veces la gente se pierde decorando sus instrucciones e incluyendo programación mas compleja para controlar “posibles errores” y otras derivadas. Para los que estamos aprendiendo, nos vale mas lo sencillo y si se complica seguir buscando. Gracias por partir del origen de verdad. Saludos

  4. René

    Gracias por compartir su conocimiento

  5. Victor Luis

    Holas, tengo una pregunta: Al copiar celdas de una hoja a otra, es necesario indicar que el área de Destino sea similar al area de Origen? como el ejemplo:
    [1] Worksheets(“Hoja2”).Range(“AB10:AY39″). Copy Destination:= Worksheets(“Hoja3”).Range(“B7″)
    [2] Worksheets(“Hoja2”).Range(“AB10:AY39″). Copy Destination:= Worksheets(“Hoja3”).Range(“B7:Y36″)
    Qué método es correcto?

    1. Moisés Ortíz Autor

      Hola Victor, Ambas instrucciones que has proporcionado funcionarán correctamente. Por otro lado, no es necesario indicar un área similar a la de origen, los datos siempre serán pegados a partir de la primera celda indicada (B7).

  6. Miguel Angel

    Mil gracias por tus aportes Moises. Me han ayudado mucho

  7. Juan Pineda

    Hola Moisés! No tengo, en este momento pregunta que hacer, pero, quiero felicitarte por tu Blog. Me ha llamado la atención lo fácil de tus explicaciones a las dudas planteadas y como te responden los conectados a tu Blog. Desde Santiago de Chile. Un abrazo! Juanpi.

  8. Tony

    muy bueno la introducción, bastante sencilla y clara. solo tengo una duda. si como cambia el range si deseas copiar de dos archivos excel distintos. ¿se debe especificar el nombre del archivo mas la pestaña cierto? Gracias de antemano por la respuesta.

    1. Moisés Ortíz Autor

      Hola Tony, en este caso no funcionará modificando el argumento del método Range.
      Es necesario utilizar Application.Workbooks.Open para abrir el segundo libro y después crear un objeto Workbook de manera que puedas hacer referencia a las hojas y celdas de dicho libro.

  9. Pili

    Genial! no sabes como me ayudo esta información. Gracias.

  10. Luz

    Muchas gracias por compartir tus conocimientos! Soy medio nueva en la programación con macros y estoy intentando programar una que me copie y pegue rangos pero variables, alguna idea que me puedas dar? Muchas gracias!

    1. Moisés Ortíz Autor

      Hola luz, si por “rangos variables” te refieres a que la macro pregunte el rango que debe ser copiado, entonces te recomiendo utilizar la instrucción InputBox que permite obtener una respuesta del usuario. Otra opción es utilizar el evento Worksheet_SelectionChange de manera que se inicie la copia después de hacer la selección de un rango.

  11. Luis Alvizures

    Hola, ¿como puedo hacer para que al copiar los datos de una hoja y pegarlos en otra, no se vea que se abre la hoja destino y pega los datos? es decir, me gustaria que se efectuara el procedimiento copiar en hoja 1 pegar en hoja 2 pero que no se viera el procedimiento, Muchas gracias de antemano y muchas felicitaciones por tan valiosos aportes.

    1. Moisés Ortíz Autor

      Hola Luis, antes de iniciar la operación incluye la siguiente instrucción:
      Application.ScreenUpdating = False

      Al finalizar vuelve a colocar la propiedad en True y listo, Excel no mostrará en pantalla los pasos ejecutados.

  12. Luis Alvizures

    Muchas Gracias Por Tu ayuda, eso era justo lo que necesitaba. Saludos!