Nel post di oggi, voglio mostrare come contare con VBA le righe che risultano dalla applicazione di un filtro automatico in Excel, sia che questo sia stato applicato via codice che in modo interattivo tramite l’interfaccia di Excel.
Dopo aver applicato il filtro, per contare le righe che risultano dal filtro occorre usare questa riga di codice
ActiveSheet.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Count – 1
La proprietà Autofilter di un oggetto Worksheet restituisce un oggetto Autofilter se, nel foglio di lavoro è presente un filtro automatico.
La proprietà Range dell’oggetto AutoFilter restituisce un oggetto Range che rappresenta l'intervallo a cui si applica il filtro automatico.
La proprietà Columns dell’oggetto Range, restituisce a sua volta un oggetto Range che rappresenta le colonne nell'intervallo specificato. In particolare, la colonna che corrisponde al numero specificato fra parentesi. In questo caso, la prima colonna dell’intervallo.
Per finire, il metodo SpecialCells dell’oggetto Range, restituisce un oggetto Range che rappresenta tutte le celle che corrispondono al tipo e al valore specificati tramite l’argomento del metodo steso.
SpecialCells ha questa sintassi
espressione.SpecialCells(Type, Value)
Type è un parametro obbligatorio e indica il tipo di celle da considerare. Come argomento type SpecialCells accetta uno dei seguenti valori costanti
|
Costanti XlCellType |
Valore |
|
|
xlCellTypeAllFormatConditions |
Celle in qualsiasi formato. |
-4172 |
|
xlCellTypeAllValidation |
Celle con criteri di convalida. |
-4174 |
|
xlCellTypeBlanks |
Celle vuote. |
4 |
|
xlCellTypeComments |
Celle che contengono note. |
-4144 |
|
xlCellTypeConstants |
Celle che contengono costanti. |
2 |
|
xlCellTypeFormulas |
Celle che contengono formule. |
-4123 |
|
xlCellTypeLastCell |
L'ultima cella dell'intervallo utilizzato. |
11 |
|
xlCellTypeSameFormatConditions |
Celle con lo stesso formato. |
-4173 |
|
xlCellTypeSameValidation |
Celle con gli stessi criteri di convalida. |
-4175 |
|
xlCellTypeVisible |
Tutte le celle visibili. |
12 |
L’argomento value ha effetto solo se type è xlCellTypeConstants o xlCellTypeFormulas e viene usato per determinare quali celle inserire nell’intervallo. Può assumere i seguenti valori costanti
|
Costanti XlSpecialCellsValue |
Valore |
|
xlErrors |
16 |
|
xlLogical |
4 |
|
xlNumbers |
1 |
|
xlTextValues |
2 |
Nel nostro caso, dunque, l’argomento value non occorre. Noi includiamo nell’oggetto Range restituita da SpecialCells tutte le celle visibili della prima colonna dell’intervallo a cui è applicato il filtro automatico.
A questo punto non ci resta che contare le celle di questo intervallo e sottrarre 1 per eliminare dal conteggio la riga di intestazione. Il risultato di questo conto rappresenta appunto il numero delle righe che risultano dal filtro.
Se il filtro non viene applicato via codice, non si può essere certi che sia stato effettivamente applicato e che quindi l’oggetto AutoFilter esista. Per cui, per ottenere un errore, prima di usare questo oggetto può essere utile verificare che esista.
Per faro si può ricorrere alla proprietà AutoFilterMode che ha valore True se le frecce di selezione del Filtro automatico sono visualizzate sul foglio. La verifica può avvenire così
If ActiveSheet.AutoFilterMode = True Then
MsgBox ActiveSheet.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Count - 1
Else
MsgBox "no filtro"
End If
Naturalmente al posto delle righe MsgBox si dovrà sostituire il codice da eseguire nel caso in cui il filtro è attivo e nel caso in cui non lo è.