Categorie
Automazione Excel

Determinare il tipo di dato contenuto in una cella Excel

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.