Hace unos días me pidió un compañero de trabajo que le ayudara a automatizar una tarea que hacía todos los días. La tarea es muy sencilla, copiar y pegar celdas en Excel de una hoja a otra. La solución fue con una macro muy sencilla como verás a continuación.
La información de partida
La información que os presentamos es falsa… absolutamente falsa, pero nos servirá para nuestro ejemplo. La tabla que puedes ver en la imagen consta de 100 filas con datos aleatorios… y el campo clave es la edad.
Lo que queremos hacer es: copiar todas las filas que cumplan con la condición de que en la columna Edad (B) ponga más de 30. En la siguiente imagen podéis ver las filas que queremos copiar sombreadas en verde claro:
Y aunque esto se puede hacer con un filtro avanzado sin necesidad de usar macros vamos a hacerlo mediante código VBA.
Paso a paso: macro para copiar y pegar celdas en Excel con VBA
Paso 1
Para poder hacer esta macro vamos a necesitar un bucle FOR que recorra todas las filas de la hoja “Datos” donde se encuentra nuestra tabla de la que queremos copiar las celdas. El bucle recorrerá todas las filas de una en una empezando por la fila 2 (en la uno están los títulos de las columnas) y terminando en la 101. Si no sabes cual es la última fila puedes verlo mediante este tutorial.
For i=2 to 101 'pon aquí tu código Next
Paso 2
Para saber qué filas debemos copiar tenemos que usar una condición tipo IF para determinar qué celdas debemos copiar y cuales no debemos copiar
If Cells(i, "B").Value > 30 Then 'pon aquí tú código End If
Paso 3
Copiar las celdas si se cumple la condición del paso anterior. Para ello usaremos la función COPY.
Range(Cells(i, "A"), Cells(i, "D")).Copy
Paso 4
Para pegar los valores deberemos situarnos en la celda donde queramos copiar dichos valores. Para ello primero tendremos que seleccionar la hoja donde vamos a copiar y después la celda a la que queremos ir.
Como no sabemos a qué celda queremos ir pues no sabemos cuántas filas se han copiado necesitamos usar una variable. Nosotros hemos empezado con la variable j=2 (porque hay títulos en la hoja “Filtros”) y ahí es donde empieza a copiar.
Una vez que haya copiado los datos, para indicar que copie en la siguiente fila debes sumarle a j una unidad: j=j+1 para que vaya avanzando fila a fila cuando lo necesite.
Sheets("Filtro").Activate Cells(j, "A").Select 'pego la fila que hemos copiado ActiveSheet.Paste
Paso 5
Cierra el condicional IF y el bucle… y habrás terminado. El código completo lo puedes ver a continuación
Sub Copiar_Filas() 'inicializo la variable j j = 2 'comienzo el bucle For i = 2 To 101 'activo la hoja donde están mis datos Sheets("Datos").Activate 'compruebo que el valor de la fecha es mayor que 30 If Cells(i, "B").Value > 30 Then 'copio la fila entera Range(Cells(i, "A"), Cells(i, "D")).Copy 'selecciono la hoja donde quiero pegar y después la celda Sheets("Filtro").Activate Cells(j, "A").Select 'pego la fila que hemos copiado ActiveSheet.Paste 'aumento la variable j para que vaya a la siguiente fila de la hoja filtros 'cuando encuentre una nueva fila que cumple con la condición de edad j = j + 1 End If Next End Sub
Descargate este archivo para practicar
Si quieres descargarte este archivo puedes hacerlo muy sencillamente. Haznos un Like en Facebook en nuestra página para desbloquear este contenido que ves más abajo… luego si quieres, nos dejas de seguir 🙂
[sociallocker]
Soluciones de ejercicio de Excel con funciones
[/sociallocker]
¿Hay un método más rápido?
Pues claro que lo hay… y no es nada difícil. En vez de cambiar de hoja, seleccionar la celda y pegar como veíamos en el Paso 4 usaremos la propiedad Destination.
Esta propiedad nos permite directamente indicar en qué celda queremos pegar la información que hayamos copiado sin necesidad de movernos de hoja y de seleccionar la celda que queremos… es mucho mucho más rápida… y sino, compruébalo tú mismo, aquí tienes el código.
Sub Copiar_Filas_2() 'activo la hoja donde están mis datos Sheets("Datos").Activate 'inicializo la variable j j = 2 'comienzo el bucle For i = 2 To 101 'compruebo que el valor de la fecha es mayor que 30 If Cells(i, "B").Value > 30 Then 'copio la fila entera y la pego Range(Cells(i, "A"), Cells(i, "D")).Copy Destination:=Sheets("Filtro").Cells(j, "A") 'aumento la variable j para que vaya a la siguiente fila de la hoja filtros 'cuando encuentre una nueva fila que cumple con la condición de edad j = j + 1 End If Next End Sub
Un curso de VBA para convertirte en un profesional
Si eres como yo, de los que le encanta automatizar tareas y tienes curiosidad por aprender a programar te recomiendo que le eches un vistazo al Curso de VBA que hemos preparado para que aprendas desde 0. De verdad, estoy seguro de que te va a venir fenomenal… además, puedes elegir las partes que quieres leer.