Capita a volte che, conoscendo una locazione più o meno nota di un determinato intervallo, volendo effettuare selezioni o operazioni su intervalli che ad essa si riferiscono, non sappiamo come fare.
Per ottenere più o meno facilmente la selezione di questi intervalli è conveniente affidarci ad alcune proprietà disponibili in VBA: Offset e Resize.
A volte potremmo aver bisogno anche di qualche altra proprietà dell'oggetto Range: "CurrentRegion" e "Count" che può applicarsi sia a Range che a Cells.
Ora cercherò , se ci riesco, di illustrare come usare le proprietà "Offset" e "Resize" combinate tra loro.
fa riferimento ad un intervallo spostato nelle quattro direzioni (alto, basso, destra e sinistra) rispetto ad un intervallo preso come punto di partenza. Gli argomenti che accompagnano questa proprietà determinano lo spostamento da effettuare e possono essere positivi, negativi e/o 0 (zero). Se omessi assumono il valore predefinito uguale a 0 (zero). Unico limite è che tale spostamento non ci porti al di fuori degli intervalli predefiniti che sono:
1 - 256 per le colonne
1 - 65536 per le righe
La sintassi è la seguente: CellaDiPartenza.Offset(Riga, Colonna).Select
Range("C5:F12").Offset(2, 3).Select
sposta la selezione da C5:F12 a F7:I14
determina il numero di righe e di colonne che deve contenere il nuovo intervallo partendo da un intervallo o una cella di origine. Gli argomenti che accompagnano la proprietà determinano la nuova dimensione che deve assumere il nuovo intervallo e possono essere solo numeri positivi. Se omessi mantengono gli stessi valori dell'intervallo di partenza.
Tuttavia non ha senso l'omissione di entrambi i parametri in quanto l'istruzione restituisce lo stesso intervallo rappresentato da "CellaDiPartenza".
Per questa proprietà è ininfluente che l'intervallo di partenza sia rappresentato da una o più celle:
E' ovvio che anche qui, nel determinare il nuovo intervallo, dobbiamo rimanere entro i limiti degli intervalli predefiniti.
La sintassi usata é la seguente: CellaDiPartenza.resize(Riga, Colonna).Select
Range("C5").Resize(2, 3).Select
Range("C5:G8").Resize(2, 3).Select
sortiscono lo stesso effetto restituendo un nuovo intervallo "C5:E6", cioè un intervallo che a partire dalla "C5" occupi 2 righe e 3 colonne.
| Per la proprietà Offset | Per la proprietà Resize | ||||||||||||||||||||||||
| Range("C5:F12").Offset(2, 3).Select | Range("C5:G8").Resize(2, 3).Select | ||||||||||||||||||||||||
| A | B | C | D | E | F | G | H | I | J | K | A | B | C | D | E | F | G | H | I | J | K | ||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | ||||||||||||||||||||||||
| 2 | 2 | ||||||||||||||||||||||||
| 3 | 3 | ||||||||||||||||||||||||
| 4 | 4 | ||||||||||||||||||||||||
| 5 | 5 | ||||||||||||||||||||||||
| 6 | 6 | ||||||||||||||||||||||||
| 7 | 7 | ||||||||||||||||||||||||
| 8 | 8 | ||||||||||||||||||||||||
| 9 | 9 | ||||||||||||||||||||||||
| 10 | 10 | ||||||||||||||||||||||||
| 11 | 11 | ||||||||||||||||||||||||
| 12 | 12 | ||||||||||||||||||||||||
| 13 | 13 | ||||||||||||||||||||||||
| 14 | 14 | ||||||||||||||||||||||||
| 15 | 15 | ||||||||||||||||||||||||
Con l'uso combinato delle due proprietà ed aiutati si possono effettuare selezioni interessanti.
Nelle istruzioni che andremo a vedere troveremo le azioni compiute dalle proprietà non potremo non notare il susseguirsi delle seguenti azioni:
Iniziamo subito partendo dalla seguente tabella:
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Dettaglio | Ingrosso | Margine | Tot orizz | ||
| 2 | Alto | 5,50 | 2,75 | 2,75 | ||
| 3 | Medio | 4,50 | 2,25 | 2,25 | ||
| 4 | Basso | 3,50 | 1,75 | 1,75 | ||
| 5 | Normale | 4,35 | 2,38 | 1,97 | ||
| 6 | Tot vert | |||||
| 7 |
Vediamo ora tre modi di effettuare delle particolari selezioni su questa tabella:
Per selezionare tutta la tabella:
Range("A1").CurrentRegion.Select
otteniamo questo:
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Dettaglio | Ingrosso | Margine | Tot orizz | ||
| 2 | Alto | 5,50 | 2,75 | 2,75 | ||
| 3 | Medio | 4,50 | 2,25 | 2,25 | ||
| 4 | Basso | 3,50 | 1,75 | 1,75 | ||
| 5 | Normale | 4,35 | 2,38 | 1,97 | ||
| 6 | Tot vert | |||||
| 7 |
Per selezionare la tabella al netto delle intestazioni di colonna:
con questo codice:
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Dettaglio | Ingrosso | Margine | Tot orizz | ||
| 2 | Alto | 5,50 | 2,75 | 2,75 | ||
| 3 | Medio | 4,50 | 2,25 | 2,25 | ||
| 4 | Basso | 3,50 | 1,75 | 1,75 | ||
| 5 | Normale | 4,35 | 2,38 | 1,97 | ||
| 6 | Tot vert | |||||
| 7 |
Per selezionare la tabella al netto delle intestazioni di riga:
con questo codice:
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Dettaglio | Ingrosso | Margine | Tot orizz | ||
| 2 | Alto | 5,50 | 2,75 | 2,75 | ||
| 3 | Medio | 4,50 | 2,25 | 2,25 | ||
| 4 | Basso | 3,50 | 1,75 | 1,75 | ||
| 5 | Normale | 4,35 | 2,38 | 1,97 | ||
| 6 | Tot vert | |||||
| 7 |
Per selezionare la tabella al netto delle intestazioni di riga e di colonna:
con questo codice:
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Dettaglio | Ingrosso | Margine | Tot orizz | ||
| 2 | Alto | 5,50 | 2,75 | 2,75 | ||
| 3 | Medio | 4,50 | 2,25 | 2,25 | ||
| 4 | Basso | 3,50 | 1,75 | 1,75 | ||
| 5 | Normale | 4,35 | 2,38 | 1,97 | ||
| 6 | Tot vert | |||||
| 7 |
La tabella è sempre quella sopra esposta.
Questa potrebbe essere una routine di esempio:
Come si nota dai commenti posti nel codice, l'intera routine è suddivisa in tre settori:
Questo è il risultato finale:
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Dettaglio | Ingrosso | Margine | Tot orizz | ||
| 2 | Alto | 5,50 | 2,75 | 2,75 | 11,00 | |
| 3 | Medio | 4,50 | 2,25 | 2,25 | 9,00 | |
| 4 | Basso | 3,50 | 1,75 | 1,75 | 7,00 | |
| 5 | Normale | 4,35 | 2,38 | 1,97 | 8,70 | |
| 6 | Tot vert | 17,85 | 9,13 | 8,72 | ||
| 7 |