Scrivendo macro che leggono o modificano celle sui fogli di calcolo si dovrebbero sempre condierare due cose:
- la leggibilità del codice: anche per chi lo ha scritto a distanza di tempo può non essere di facile lettura;
- la possibilità che l'utente di Excel, che spesso non è la stesso che ha scritto la macro, modifichi il file aggiungendo foglio o spostando le celle alterando il corretto funzionamento della macro.
Alcune semplici tecniche possono aiutare a limitare, se non evitare, questi problemi.
Gestione nomi
Un'altra possibilità per rendere indipendente la macro dalla posizione dei dati sul foglio su cui agirà è quella di utilizzare i nomi degli intervalli.
Ad esempio volendo scrivere un codice che legge i clienti dalle prima due colonne di un tabella come quella a destra per compilarne la terza potremmo utilizzare un codice come questo:
In questo caso il codice è legato alla posizione delle righe e delle colonne sul foglio. |
Impostando un nome all'intervallo di celle come nell'esempio a destra il codice potrebbe essere scritto in questo modo:
Set TabClienti = Range("TabClienti")
For R = 2 To TabClienti. Rows.Count
IdCliente = TabClienti. Cells(R, 1)
DsCliente = TabClienti. Cells(R, 2)
TabClienti. Cells(R, 3) = IdCliente & "-" & DsCliente
Next R Facendo in questo modo per l'utilizzatore del foglio sarà sia possibile spostare la tabella in un'altra posizione del foglio sia aggiungere righe e la macro continuerà a funzionare. |
Riferimenti ai fogli
Per accedere al foglio attivo useremo la proprietà ActiveSheet
Per fare riferimento ad un foglio esistono altri 3 metodi
Attraverso il nome
Utilizzando il nome che ha sul foglio di calcolo, sulla "linguetta":[/T]
Attraverso l'indice
L'indice rappresenta la posizione attuale del foglio nella sequenza dei fogli del file ed è modificabile dall'utente.
Un esempio di un codice che scorre tutti i fogli del file e li attiva:
Attraverso il CodeName
I due metodi precedenti hanno lo svantaggio di essere influenzabili da quello che fa l'utente: se cambia il nome del foglio o se cambia l'ordine dei fogli la macro non funzionerà o funzionerà in modo diverso.
Una soluzione per questo è utilizzare la proprietà CodeName, che è una delle proprietà del foglio modificabile solo dall'editor di VBA: è evidenziata come (name) nell'immagine a destra.
Nell'esempio a lato:
- il CodeName è "Foglio1";
- il nome visibile in Excel, indicato fra parentesi, é "Clienti".
Riassumendo: il nome visibile del foglio può essere modificato dall'utente, o da chi lavora con il file, mentre il CodeName del foglio rimarrà sempre uguale quanto impostato in VBA. |
Il CodeName del foglio può essere utilizzato nel codice come un oggetto Worksheet: le due righe di codice qui sotto sono equivalenti.
Sheets("Clienti").Activate
Foglio1.Activate
Volendo utilizzare una logica simile a quella di Sheet(NomeFoglio) possiamo comunque utilizzare una semplice funzione come quella qui sotto.