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.