Le Formule viste dal Codice.
Quando in Excel si usa il codice per compilare istruzioni che contemplino
formule, queste si possono scrivere usando due stili : lo stile notazione A1 o
lo stile R1C1 (a parte le Array). Vediamo due esempi:
stile notazione A1 : tutte le seguenti
formule compilate in maniera diversa, sono identiche nella sostanza : hanno
tutte in comune una cosa: portano i "riferimenti
diretti" alle celle da moltiplicare; il gruppo delle prime tre
definisce anche la cella di destinazione del
risultato, mentre le seconde tre porteranno il risultato
nella cella in quel momento attiva, cioè
selezionata. Tutte queste danno lo stesso risultato:
Range("J1") = Range("H1")
* Range("I1")
Range("J1").Formula = "=(H1 * I1)"
Cells(1, 10) = Cells(1, 8) * Cells(1, 9)
------------------
ActiveCell = Range("H1") * Range("I1")
ActiveCell.Formula = "=(H1 * I1)"
ActiveCell = Cells(1, 8) * Cells(1, 9) |
E' evidente che formule del genere non si prestano a conteggi da svolgere su
celle diverse da quelle indicate nei riferimenti (a parte le seconde tre che
danno il risultato dove vogliamo noi, basterà selezionare una qualsiasi
cella per renderla attiva). Comunque tutte e sei moltiplicheranno sempre e
solo H1 per I1.
Queste istruzioni andranno inserite, per provarle, una sola per volta, in
una macro che piazzeremo in un modulo e che assoceremo ad un pulsante per
l'attivazione della macro stessa. Attenzione!! il risultato lo avremo solo
quando premeremo il pulsante, se cambiamo i valori da moltiplicare, dovremo
di nuovo premere il pulsante per ottenere il nuovo risultato : questo perchè
la cella di destinazione riceve il risultato MA NON LA
FORMULA CHE L'HA GENERATO.
stile R1C1 : le formule realizzate in
questo stile (che è quello impiegato da Excel quando si fa uso del
"Registratore di Macro") utilizzano "riferimenti
indiretti" alle celle che dovranno essere moltiplicate ( o sommate,
divise, ecc.). Data una cella di partenza, le celle da moltiplicare saranno
individuate tramite la posizione che queste celle avranno rispetto alla
cella di partenza(che varrà 0), e cioè il numero di quante righe e colonne
le distanziano dall'origine (partenza) anteponendo a questo numero il segno più, riferito sia
alla riga, sia alla colonna, se saranno sotto o a destra rispetto allo
zero(0) o il segno meno se saranno a sinistra o sopra; usano cioè il
cosiddetto "scarto" (Offset). Il
vantaggio di questo stile è che
NON usando un "riferimento
diretto" potremo ottenere la moltiplicazione di volta in volta, delle
celle indicate nello "scarto" che varieranno se
varierà la cella di partenza. Vediamo un esempio:
Range("F5").FormulaR1C1
= "=RC[-2]*RC[-1]"
intanto notiamo che è stato definito lo stile:
FormulaR1C1 - l'istruzione si legge : Nel Range F5 voglio la formula
stile R1C1 che sarà uguale al valore presente nella cella che sta
(sulla stessa riga) meno 2 colonne rispetto alla F5 (
RC[-2] ) cioè la F3, moltiplicato il valore che sta meno 1
colonna rispetto alla F5 ( RC[-1] ) cioè
F4. (Cioè i valori che sono nelle due celle precedenti la F5)
Se al posto di un riferimento diretto per
indicare la cella di destinazione ( Range("F5")), avessimo usato
ActiveCell :
ActiveCell.FormulaR1C1
= "=RC[-2]*RC[-1]"
avremmo ottenuto che qualunque fosse la cella
selezionata, avrebbe dato il risultato della moltiplicazione delle due
celle precedenti quella selezionata. Questo comportamento l'avremmo
potuto ottenere lo stesso senza bisogno di ricorrere allo
stile R1C1, (che con tutti quei RC,
parentesi quadre, ecc.ecc. spesso genera incomprensione e difficoltà
di orientarsi ) infatti la seguente istruzione lavora sullo stesso
principio, ma risulta più comprensibile ed ottiene lo stesso
risultato:
ActiveCell =
ActiveCell.Offset(0, -2) * ActiveCell.Offset(0, -1)
Vorrei concludere, dopo aver "intorbidito" un
pò le acque, che lo stile R1C1 ha il
grosso vantaggio che nella cella di destinazione, oltre al risultato
dell'operazione, pone ANCHE
LA FORMULA, col beneficio che
SE si variano i valori del moltiplicando
e del moltiplicatore, la cella di destinazione aggiorna il risultato
senza bisogno di rilanciare la macro perchè la formula è
residente, anche se si cambia selezione. |
|