In genere in un foglio Excel le celle contengono dati (testo o valori numerici) o formule. Possono esserci anche gruppi di celle unite.
Per fogli di grandi dimensioni capita di dover scrivere una macro per elaborare i dati presenti nel foglio e ai fini del calcolo finale può essere necessario conoscere il tipo di contenuto di un insieme di celle.
Ad esempio per determinare se un range di celle Excel è unito con Visual Basic, puoi utilizzare la proprietà Range.MergeCells. Se la proprietà è impostata su True, allora le celle sono unite
Dim rng As Range Set rng = Range(“A1:B2”) If rng.MergeCells = True Then MsgBox “Le celle sono unite!” Else MsgBox “Le celle non sono unite!” End If |
Si può invece determinare se un range di celle contiene una formula in Visual Basic utilizzando la funzione IsFormula. La funzione restituisce “True” se la cella specificata contiene una formula e “false” altrimenti.
Dim risultato As Booleanrisultato = Range(“A1:A10”).IsFormula |
In questo caso, se una delle celle nel range A1:A10 contiene una formula, risultato sarà True.
Vediamo come combinarle insieme per pulire i dati in fogli di grandi dimensioni.
Consideriamo un foglio con migliaia di righe e per ogni riga un insieme di celle adiacenti o meno che contengono dati e altre che contengono formule, somme o funzioni più complesse. Magari le righe sono raggruppate per segmenti, come nel foglio che segue
In questo esempio il foglio Excel tiene traccia delle spese del primo trimestre di ogni centro di costo per il magazzino A ed il magazzino B. Per ogni mese le spese vengono ripartite in spese inbound e spese outbound (colonne di input con dati) con il totale trimestrale (colonna calcolata con formula) ed un totale mensile (righe calcolate)
Immaginiamo che i centri di costo siano centinaia ed i magazzini decine, risulterebbe lungo e noioso cancellare manualmente gli input
selezionando i range di celle adiacenti contenenti solo dati evitando le celle con formule e le celle unite.
Si può automatizzare l’operazione con il codice che segue
For i = 4 To LastRow If CurrentSheet.Range(“B” & i & “:G” & i).HasFormula Or CurrentSheet.Range(“B” & i & “:G” & i).MergeCells ThenDebug.Print “B” & i & “:G” & i Else CurrentSheet.Range(“B” & i & “:G” & i).ClearContents End If Next i |
La ultima riga LastRow può essere calcolata facilmente (vedi come in quest’altro articolo).
La prima riga analizzata dal ciclo è la 4 che contiene i primi dati
Il range di dati input che ci interessa cancellare va dalla colonna B corrispondente all’ inbound di gennaio alla colonna G corrispondente all’ outbound di marzo. Poichè il codice scorre tutte le righe anche quelle dove ci sono formule e celle unite cancella solo se nel range della riga sono presenti solo celle con dati.