Eliminazione righe e colonne vuote

 

Con questo studio voglio sperimentare come cancellare intere righe o intere colonne vuote.

Per entrambe seguirò due strade:

Per le righe

Primo metodo: la routine che decide quali righe eliminare

Come si può vedere dal codice qui sotto, il codice è breve, ma vengono usati metodi e proprietà che normalmente non si usano.

 

CountA Conta il numero di celle non vuote e i valori presenti nell'elenco degli argomenti

UsedRange Restituisce un oggetto Range che rappresenta l'intervallo utilizzato del foglio di lavoro specificato. Proprietà di sola lettura

EntireRow Restituisce un oggetto Range che rappresenta la riga o le righe intere contenenti l'intervallo specificato. Proprietà di sola lettura

EntireColumn Restituisce un oggetto Range che rappresenta la colonna o le colonne intere contenenti l'intervallo specificato. Proprietà di sola lettura

Calculation, proprietà di application, Restituisce o imposta un valore XlCalculation che rappresenta la modalità di calcolo

SpecialCells Restituisce un oggetto Range che rappresenta tutte le celle che corrispondono al tipo e al valore specificati

ScreenUpdating, altra proprietà di application, Ha valore True se l'aggiornamento dello schermo è attivo. Proprietà di tipo Boolean di lettura/scrittura

UsedRange, è una proprietà di Worksheet Restituisce un oggetto Range che rappresenta l'intervallo utilizzato del foglio di lavoro specificato. Proprietà di sola lettura

 

Le operazioni che vengono compiute sembra siano di facile apprendimento.

Sub elimina_righe_vuote_1()
Dim i As Long
' vengono selezionate
ActiveSheet.UsedRange.Select
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
For i = Selection.Rows.Count To 1 Step -1
If WorksheetFunction.CountA(Selection.Rows(i)) = 0 Then
Selection.Rows(i).EntireRow.Delete
End If
Next i
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
End Sub

Secondo metodo: la routine tenta di eliminare le righe agendo su un intervallo di nostra scelta.

A parte la gestione di errori, una sola riga di codice che chiama un metodo di Range: SpecialCells.

SpecialCells, un metodo di Range
Restituisce un oggetto Range che rappresenta tutte le celle che corrispondono al tipo e al valore specificati
I tipi da assegnare a questo metodo sono:

xlCellTypeAllFormatConditions. Celle in qualsiasi formato
xlCellTypeAllValidation. Celle con criteri di convalida
xlCellTypeBlanks. Celle vuote
xlCellTypeComments. Celle che contengono note
xlCellTypeConstants. Celle che contengono costanti
xlCellTypeFormulas. Celle che contengono formule
xlCellTypeLastCell. L'ultima cella dell'intervallo utilizzato
xlCellTypeSameFormatConditions. Celle con lo stesso formato
xlCellTypeSameValidation. Celle con gli stessi criteri di convalida
xlCellTypeVisible. Tutte le celle visibili.
xlErrors
xlLogical
xlNumbers
xlTextValues

Con qauesto metodo cancelliamo tutte le righe dell'intervallo scelto se tutte sono vuote.

Se qualcuna contiene dei valori, e se non si usa il gestore di errori, reatituisce questo errore:

Errore di run-time 1004
Impossibile usare il comando con sezioni sovrapposte

Se le righe coinvolte dalla selezione sono vuote, l'operazione viene eseguita correttamente.

Sub Elimina_righe_vuote_2()
On Error Resume Next
Selection.EntireRow.SpecialCells(xlBlanks).EntireRow.Delete
On Error GoTo 0
End Sub

Per le colonne

Primo metodo: la routine decide da sè quali colonne eliminare

Questa differisce leggermente rispetto alla prima routine presentata in questa pagina.

Dopo aver creato un intervallo che contiene dei valori (Set Intervallo = ActiveSheet.UsedRange), inizia un ciclo su tutte le colonne trovate, selezionando di volta in volta una cella di quella colonna.

Trovata la colonna vuota, la elimina.

Sub cancella_colonne_vuote()
Dim i As Long, Intervallo As Range
Set Intervallo = ActiveSheet.UsedRange
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
For i = Intervallo.Columns.Count To 1 Step -1
Intervallo.Cells(1, i).Select
If WorksheetFunction.CountA(Intervallo.Cells(1, i).EntireColumn) = 0 Then
Selection.Rows(i).EntireColumn.Delete
End If
Next i
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
End Sub

Secondo metodo: la routine tenta di eliminare le colonne valutando una nostra precisa selezione

Questa routine è identica alla prima presentata, agisce in maniera speculare.

Data una selezione stabilisce se le colonne interessate alla selezione sono vuote, quindi da eliminare.

Sub DeleteBlankColumnss2()
On Error Resume Next
Selection.EntireColumn.SpecialCells(xlBlanks).EntireColumn.Delete
On Error GoTo 0
End Sub