Excel: Una macro para dividir listados

Si tenés una base de datos en Excel con cientos de registros y necesitás dividirla en listas más chicas, de cincuenta registros cada una, podés hacerlo de manera automática con una macro.
VIE, 7 / AGO / 2015

Supongamos que la base de datos original, la que hay que dividir, está en la única hoja de un libro Excel. La macro deberá recorrer esta hoja copiando sus datos a nuevas hojas, en tandas de un número especificado de filas.

La macro debería ser algo así:

Sub Cortar()
largo = 50
filas = WorksheetFunction.CountA(Range(“A:A”))
hojas = Round(filas / largo + 0.5)
For i = 1 To hojas
Sheets.Add after:=Sheets(i)
Sheets(1).Range(“1:” & largo).Copy Sheets(i + 1).Cells(1, “A”)
Sheets(1).Range(“1:” & largo).EntireRow.Delete
Next i
End Sub

Lo primero que tiene que hacer la macro es calcular cuántas hojas se generarán para las sublistas que se desea obtener. Para eso establecemos un valor para el largo de cada sublista (en este caso, 50 filas). Luego contamos cuántas filas hay en el listado con la función CountA (equivalente a CONTARA) aplicada a la columna [A]. Finalmente, dividimos la cantidad de filas de la lista por la cantidad de filas en las sublistas y redondeamos el valor “hacia arriba”. Para eso se suma media unidad al valor del cociente, antes de aplicar la función Round.

Ahora que sabemos cuántas sublistas (y hojas) se generarán, abrimos un ciclo For… Next que hace tres cosas:

-Agrega una nueva hoja.

– Copia en ella tantas filas de la lista original como filas deba tener cada sublista.

-Elimina las filas copiadas de la lista original.

Cada una de estas instrucciones tiene un punto de interés.

-La instrucción Sheets.Add after:=Sheets(i) agrega cada nueva hoja a continuación de la anterior. En la primera vuelta del ciclo (i = 1), la agrega después (en inglés, after) de la primera hoja. En la segunda vuelta, después de la segunda hoja, y así sucesivamente.

-La instrucción Sheets(1).Range(“1:” & largo).Copy Sheets(i + 1).Cells(1, “A”) copia y pega las filas de la lista original que están en la primera hoja a partir de la celda [A1] de la última hoja agregada.

-La instrucción Sheets(1).Range(“1:” & largo).EntireRow.Delete elimina las filas copiadas de la lista original.

El hecho de eliminar las filas copiadas hace que las filas por copiar sean siempre las primeras de la lista original, o lo que queda de ellas.

Esta macro se puede mejorar agregando instrucciones para copiar la fila de títulos (si la hubiera) en cada sublista generada. Dejamos este problema como tarea para la lectora.

¡Comparte esta noticia!

Últimos lanzamientos Ver más