lunes, 20 de junio de 2011

Eliminar Filas y Columnas vacias

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
Esta macro se aplica a la Hoja2 que es la siguiente. Se lanza con un botón que hay en la parte superior izquierda de la hoja.


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
Hemos necesitado hacer el bucle desde n hasta 1 ya que si lo hacemos de 1 a n en caso de existir dos o más filas vacías contiguas quedaría una de ellas sin eliminar.

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
Esto hace que mejore el tiempo de ejecución, apreciándose en hojas de muchísimas filas.

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:

vvcepheus7 dijo...

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!

vvcepheus7 dijo...

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!

Adolfo Aparicio dijo...

Hola vvcepheus7.

Te he creado un post que creo puede resolver tus necesidades.

Eliminar filas con cierta periodicidad en #Excel

Un cordial saludo.

vvcepheus7 dijo...

Muchísimas gracias por la macro Adolfo! funciona genial!

udebruyn dijo...

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...