Descargar el fichero: LimpiaFilas.xls

Es frecuente que un informe generado por otro programa se exporte a Excel, por ejemplo en SAP. Muchos programas contemplan la exportación directa a Excel, y en otras ocasiones lo que se hace es generar un fichero plano, de texto. Sea por un método o por otro, habitualmente los informes contienen filas vacías, y columnas vacías. Presentamos una macro que elimina las filas y las columnas en blanco, dejando el informe compactado.
Hoja 1
Hoja 2
La macro que elimina las filas vacías es la siguiente.
En la macro recorremos todas las filas del rango usado (UsedRange). Se basa en detectar el número de celdas vacías con la función CountA, que en español se denomina CONTARA. Esta función es similar a la función CONTAR. La diferencia es que CONTAR cuenta únicamente valores numéricos, y CONTARA cuenta todo tipo de celdas, sean estas numéricas o de texto.
Creamos la variable Cadena que por concatenación va acumulando todas las filas vacías que se eliminarán. Al concatenar las diferentes filas las separamos por una coma (,) lo que hace que al final tengamos que eliminar la última coma, cosa que se hace con la expresión:
Left(Cadena, Len(Cadena) - 1).
Esta macro aplicada a hojas en las que sea necesario eliminar muchas filas puede llegar a dar un error derivado de que la variable Cadena necesita una lóngitud mayor de la que es capaz de soportar. Para evitar ese inconveniente hemos creado la macro de la hoja 3 que también elimina las filas vacías, pero lo hace cada vez que las localiza.
Código:
Sub EliminarFilasVacias()
Dim Cadena As String, Fila As Long
With Worksheets("Hoja2") 'Nombre de la hoja
For Fila = 1 To .UsedRange.Rows.Count
If WorksheetFunction.CountA(.Rows(Fila)) = 0 Then
Cadena = Cadena & Fila & ":" & Fila & ","
End If
Next Fila
If Cadena <> "" Then
Application.ScreenUpdating = False
.Range(Left(Cadena, Len(Cadena) - 1)).Delete
Application.ScreenUpdating = True
End If
End With
End Sub
Hoja 3
En la Hoja3 disponemos de una macro que elimina las filas vacías y otra que elimina la columnas vacías.
La macro que elimina las filas vacías es la siguiente. Es similar a la que hemos utilizado en la Hoja 2.
Código:
Sub EliminarFilasEnBlanco()
Dim n As Long 'nº filas
Dim i As Long
Dim Fila As String
Dim cuenta As Long
n = ActiveSheet.UsedRange.Rows.Count
For i = n To 1 Step -1
Fila = i & ":" & i
cuenta = WorksheetFunction.CountA(Fila)
If WorksheetFunction.CountA(Range(Fila)) = 0 Then
Range("A" & i).EntireRow.Delete
End If
Next i
End Sub
Para eliminar las columnas vacías existe una macro similar. Es la siguiente.
Código:
Sub EliminarColumnasVacias()
Dim n As Integer 'nº columnas
Dim i As Integer
Dim col As String
n = ActiveSheet.UsedRange.Columns.Count
For i = n To 1 Step -1
If WorksheetFunction.CountA(Cells(1, i).EntireColumn) = 0 Then
Cells(1, i).EntireColumn.Delete
End If
Next i
End Sub
Otra variante para eliminar filas en blanco es la siguiente.
Código:
Sub EliminarFilasEnBlanco_bis()
Dim Fila As Long
For Fila = ActiveSheet.UsedRange.Rows.Count To 1 Step -1
If WorksheetFunction.CountA(ActiveSheet.Rows(Fila)) = 0 Then
Cells(Fila, 1).EntireRow.Delete
End If
Next Fila
End Sub
Si no deseamos que se vea el movimiento en pantalla que origina la eliminación de filas podemos añadir al inicio de la macro (después de los Dim) la línea:
- Application.ScreenUpdating = False
Y al final de la macro pondríamos la línea:
- Application.ScreenUpdating = True
Pulsando sobre el desplegable de la hoja 3 podemos generar un informe con filas y columnas en blanco que podemos hacer desaparecer eligiendo las opciones adecuadas en el desplegable (ComboBox).
Otra variante que Elimina Filas Vacías
Sub Elimina_Filas_Vacias()
Dim n As Long 'nº filas
Dim i As Long
Dim Fila As String
Dim cuenta As Long
n = ActiveSheet.UsedRange.Rows.Count
For i = n To 1 Step -1
Fila = i & ":" & i
cuenta = WorksheetFunction.CountA(Fila)
If WorksheetFunction.CountA(Range(Fila)) = 0 Then
Range("A" & i).EntireRow.Delete
End If
Next i
End Sub









5 comentarios:
Hola!
Quisiera hacerle una consulta!
Tengo un excel con un formato como este:
A B
1 DIRECCIÓN | CIUDAD
2 TEXTO INÚTIL
3 TEXTO INÚTIL
4 TEXTO INÚTIL
5 TEXTO INÚTIL
6 TEXTO INÚTIL
7 TEXTO INÚTIL
8 DIRECCIÓN | CIUDAD
9 TEXTO INÚTIL
10 TEXTO INÚTIL
11 TEXTO INÚTIL
12 TEXTO INÚTIL
13 TEXTO INÚTIL
14 TEXTO INÚTIL
15 DIRECCIÓN | CIUDAD
(...)
Para clarificar he enumerado cada fila y cada columna.
Yo deseo eliminar todas las filas inútiles (donde hay texto inútil) y juntar todas las filas útiles (o sea, las de las direcciones).
Si se fija, se repite que hay 6 filas inútiles y una fila útil.
Como podría hacerlo Con excel?
También tengo el documento txt con este mismo formato, se podría hacer algo parecido con el word usando buscar y reemplazar?
Muchas gracias y un saludo!
He hecho un intento:
Sub EliminaFilas()
'Elimina 6 filas y salta una comenzando en la fila 2
For i = 2 To 1000
Cells(i, "A").EntireRow.Delete
Cells(i + 1, "A").EntireRow.Delete
Cells(i + 1, "A").EntireRow.Delete
Cells(i + 1, "A").EntireRow.Delete
Cells(i + 1, "A").EntireRow.Delete
Cells(i + 1, "A").EntireRow.Delete
Next i
End Sub
Pero parece que no funciona!
Me puede echar una mano? :)
Muchas gracias!
Hola vvcepheus7.
Te he creado un post que creo puede resolver tus necesidades.
Eliminar filas con cierta periodicidad en #Excel
Un cordial saludo.
Muchísimas gracias por la macro Adolfo! funciona genial!
Me parece muy bueno.
Solo una pregunta: ademas de eliminar filas vacias me gustaria eliminar filas que contengan formulas de las cuales dan resultado cero. Y obviamente las que esten mayor que cero dejarlas.
Muchas gracias...
Publicar un comentario en la entrada