Descargar el fichero: LimpiaFilas.xlsm
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 n = ActiveSheet.UsedRange.Rows.Count For i = n To 1 Step -1 Fila = i & ":" & i 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
n = ActiveSheet.UsedRange.Rows.Count
For i = n To 1 Step -1
Fila = i & ":" & i
If WorksheetFunction.CountA(Range(Fila)) = 0 Then
Range("A" & i).EntireRow.Delete
End If
Next i
End Sub