Lego le MIBO 014 - Riferimenti di celle
Martedì 11 maggio 2021
Quando qualche tempo fa, una immonda bestiaccia troneggiava in testa alla lezione 10 (Il mostro sacro di Excel), in quella occasione avevamo scomodato un esempio preso dalla vita di tutti i giorni per raccontare come il mondo Excel sia fatto di ‘strati sottostanti’ cioè di piani multilevel, un po' come quando si sfoglia una cipolla.
Parallelamente a quella spiegazione ancora molto generica di Excel, nella lezione scorsa abbiamo usato l’equazione di secondo grado per capire cosa sia un flow chart, a cosa serva e come lo si possa ‘tradurre’ in linguaggio di programmazione VBA. E, infatti, da lì abbiamo creato la codifica e lanciato il programma definitivo che, a colpi di Input Box e Message Box, ci ha restituito i risultati della fatidica equazione.
Sì, ok, tutto giusto … però … qui c’è un però !
Infatti a pensarci bene, lo script che abbiamo congegnato per il momento NON HA NULLA A CHE FARE CON EXCEL. Non vi pare?
Cosa voglio dire? Ma certo!
In quelle righe di Visual Basic, di celle Excel non se n’è vista neanche l’ombra!
E allora, che razza di Excel sarebbe un ‘Excel senza celle’? E’ forse un orfano? un disadattato? un menomato?
Già! A questo punto dobbiamo andare per ordine e spiegare che il vero vantaggio di ‘Visual Basic Excel’ sta proprio nella ‘integrazione’ tra il linguaggio di programmazione (il VBA) e l’ingranaggeria delle celle.
E’ proprio così: i progettisti hanno avuto la vista lunga quando hanno deciso di mettere insieme linguaggio e celle proprio perché questa sinergia si è dimostrata veramente azzeccata.
Tornando a noi, il fatto di aver creato l’equazione di secondo grado, per così dire ‘senza celle’, non è stato un errore né una mancanza; diciamo solo che si è trattato esclusivamente di un passaggio poichè nella pratica VBA e CELLE sono praticamente sempre un tutt'uno.
Ecco allora che ci balena un’idea al volo! Sapete che facciamo? Ma certo!
Ritorniamo sull’esercitazione dell’equazione ma questa volta la facciamo usando le celle del Foglio Excel.
Vedrete: avremo un’ottima occasione per scoprire nuove formule e tante novità.
Prima di ripartire con la programmazione, ancora una volta, va ricordato che:
- L’Excel ‘tradizionale’ (senza bottoni) vede tutte le celle tra loro ‘solidali e interconnesse’
- L’Excel VBA (con bottoni) si muove sempre per ‘eventi’ in modalità ‘batch’, cioè per ‘infornate di dati input' e relativa restituzione di dati output.
A questo punto partiamo dalla fine, cioè dal risultato che vogliamo ottenere, facendo il percorso inverso.
Battezziamo subito il nuovo progetto col nome: “Equazione di secondo grado bis” (in fondo all’articolo trovate il file scaricabile).
Vediamo:
Avrete certamente capito la differenza tra questa versione e la precedente: il dialogo uomo/macchina non avviene più tramite Input_Box e Msg_Box ma tramite celle.
Infatti i valori a), b) e c) vengono inseriti nelle celle corrispondenti: nel nostro esempio 1, -5, 6.
A questo punto sarà sufficiente schiacciare il “Big Botton” rosso: nella parte bassa leggeremo i risultati dell’equazione: 2 e 3.
Nota:
Input Box e Msg Box sono stati sostituiti da celle
RIFERIMENTI DELLE CELLE
Prima di proseguire dobbiamo fermarci un attimo sui cosiddetti ’riferimenti delle celle’ sfruttando l’arcinoto esempio della Battaglia Navale in cui, anche lì, le navi vengono localizzate per righe e per colonne.
In questo esempio ho scritto ‘Pippo’ nella cella con questi riferimenti:
- Colonna B
- Riga 3
cioè in cella ‘B3’.
Questo modo tradizionale di localizzare le celle, prima per colonne, poi per righe si definisce ‘Stile A_1’.
Lo Stile A_1 è lo stile di default (cioè standard) con cui viene aperto e inizializzato qualsiasi foglio Excel.
In gergo, pertanto, diremo: “Cos’hai in B3?” Risposta: "In B3 ho Pippo”.
Un secondo modo specularmente opposto per localizzare le celle è lo ‘Stile_R1_C1’ di cui vediamo lo stesso esempio precedente:
In questo caso, prima abbiamo la riga, poi la colonna, ovvero ci troviamo in R3C2.
Morale: ‘B3’ equivale a ‘R3C2’.
Perché questo ragionamento? A che serve?
Serve eccome perché:
- Mentre quando si gioca a Battaglia Navale e nell’Excel tradizionale (per iniziati) “si pensa in modo B3”
- In Visual Basic “si deve pensare in modo R3C2”
Nota:
In camera caritatis, penso che i progettisti Excel che nel tempo si sono avvicendati, a un certo punto si siano ubriacati.
Infatti: ma perché mai fare due stili diversi all’interno dello stesso programma?
Però qui mi viene un dubbio, cioè che Excel (che bene o male proviene da Lotus Software del 1983) abbia ereditato lo stile A_1 mentre Visual Basic (che viene da tutt’altra scuola) sia partito da R1_C1.
Ecco dove è nato il bisticcio.
Ricapitoliamo.
I riferimenti delle celle saranno:
- stile A_1 quando lavorerò in Excel tradizionale (per celle)
- stile R1_C1 quando lavorerò in VBA
Ottimo! … però, come si fa a passare da uno stile all’altro?
Ma certo!!! Per cambiare stile si deve andare nelle Opzioni di Excel (percorso: File > Opzioni > Formule > Utilizzo delle Formule) e spuntare ‘Stile di Riferimento R1C1’ dato che lo stile di default è A_1.
Vediamo come:
Nota.
Poiché in fase di programmazione è abbastanza usuale passare più volte da uno stile all’altro, per ridurre i tempi di esecuzione è bene ricorrere a una scorciatoia da inserire nella ‘Barra’ di Excel cosiddetta di ‘Accesso Rapido’. Vedremo come fare a personalizzare questa Barra.
Tornando alla nostra famosa equazione di secondo grado, dopo l’inciso degli Stili di Riferimento delle celle, siamo in grado di rivederne l’immagine per poi definirne le coordinate dei dati di ingresso e di uscita:
Ecco le coordinate:
- 26/03/2019 16:21 corrispondente a ‘Oggi è’ risiede in C8 (R8C3)
- 1 corrispondente al valore ‘a’ risiede in D17 (R17C4)
- -5 corrispondente al valore ‘b’ risiede in D18 (R18C4)
- 6 corrispondente al valore ‘c’ risiede in D19 (R19C4)
La soluzione del programma:
- L’equazione ha due radici distinte: 2 e 3 risiede in B28 (R28C2)
---------------------------------------------------------------------------------------------------------------------------------
TRASFORMAZIONE DELLO SCRIPT DA SISTEMA “INPUT/MSG-BOX” A SISTEMA “CELLE”
A questo punto siamo in grado di effettuare la trasformazione dello script.
Per chiarezza ho evidenziato in rosso le varianti:
Sub Equazione()
'-----------------------------------------------------------------------------
' Dichiarazione delle variabili 'a,b,c'
'-----------------------------------------------------------------------------
Dim a As Integer
Dim b As Integer
Dim c As Integer
'-----------------------------------------------------------------------------
' Alimentazione delle variabili (nel nostro esempio: 1, -5, 6)
''-----------------------------------------------------------------------------
'
' C I C L O D I V A L I D A Z I O N E D E L L E A C C E P T
'
'-----------------------------------------------------------------------------
' 1^ variabile
'
enter_a:
a = Cells(17, 4)
If a = 0 Then
MsgBox "'a' non può essere zero !"
GoTo enter_a
End If
'-----------------------------------------------------------------------------
' 2^ variabile
'
enter_b:
b = Cells(18, 4)
If b = 0 Then
MsgBox "'b' non può essere zero !"
GoTo enter_b
End If
'-----------------------------------------------------------------------------
' 3^ variabile
'
enter_c:
c = Cells(19, 4)
If c = 0 Then
MsgBox "'c' = zero è un caso particolare che qui non trattiamo - Riprova !"
GoTo enter_c
End If
'-----------------------------------------------------------------------------
' Visualizzo le 3 variabili inserite tramite una MSGBOX combinata
MsgBox " a=" & a & " b=" & b & " c=" & c
'-----------------------------------------------------------------------------
' Calcolo del discriminante Delta
Delta = b * b - 4 * a * c
'-----------------------------------------------------------------------------
'-----------------------------------------------------------------------------
'-----------------------------------------------------------------------------
' E S A M E D E I C A S I P O S S I B I L I
'-----------------------------------------------------------------------------
'-----------------------------------------------------------------------------
'-----------------------------------------------------------------------------
' 1° caso
' per Delta < zero l'equazione è impossibile (esempio: a = 2, b = -5, c = 6)
If Delta < 0 Then
Cells(28, 2) = "L'equazione è impossibile"
' MsgBox "L'equazione è impossibile !"
GoTo fine
End If
' 2° caso
' per Delta = zero l'equazione ha due radici coincidenti (esempio: a = 1, b = -4 , c = 4 --> risultato +2 e +2)
If Delta = 0 Then
x = -b / 2 * a
' MsgBox "L'equazione ha due radici coincidenti uguali a: +" & x
Cells(28, 2) = "L'equazione ha due radici coincidenti uguali a: +" & x
GoTo fine
End If
' 3° caso
' per Delta > zero l'equazione ha due radici distinte (esempio: a = 1, b = -5, c = 6 --> risultato +2 e +3)
x1 = (-b - Sqr(Delta)) / 2 * a
x2 = (-b + Sqr(Delta)) / 2 * a
' MsgBox "L'equazione ha due radici distinte: " & x1 & " e " & x2
Cells(28, 2) = "L'equazione ha due radici distinte: " & x1 & " e " & x2
fine:
Cells(9, 4).Select
End Sub
--------------------------------------------------------------------------------------------------------------------------------
Nota.
Lo spostamento di un dato da una cella all’altro (in inglese: ‘move’) avviene tramite il simbolo ‘=’.
Esempio: a = Cells(17, 4) significa che il contenuto di cella di coordinate 17 e 4 finirà nella variabile 'a'.
Ancora: Cells(17,4) = Cells(18,4) significa che il contenuto della 18,4 finirà in 17,4.
Attenzione all’ordine di spostamento della ‘move’: la ‘move’ di VBA avviene sempre da Destra verso Sinistra (in altri linguaggi si fa al contrario !!!).
La ‘move’ è sempre una operazione ‘sostitutiva’ nel senso che eventuali precedenti valori residenti in ‘a’ (es: -52) vengono ricoperti e sostituiti dai nuovi valori.
Nota sui simboli di concatenamento.
Esempio dal vivo: Cells(28, 2) = "L'equazione ha due radici distinte: " & x1 & " e " & x2.
Quando si vogliono riunire in un solo dato più valori differenti, si ricorre al cosiddetto ‘concatenamento’ mediante l’utilizzo del carattere ‘&’ (‘e commerciale’).
Per comprendere: il programma muoverà sulla cella di coordinate 28,2 una stringa costituita da:
- Frase “L’equazione ha due radici distinte: “
- Il dato ‘x1’ che proviene dal calcolo x1 = (-b - Sqr(Delta)) / 2 * a
- Frase “ e “
- Il dato ‘x2’ che proviene dal calcolo x1 = (-b + Sqr(Delta)) / 2 * a
Tale congiunzione genererà la frase definitiva: “L’equazione ha due radici distinte: 2 e 3”
-------------------------------------------------------------------------------------------------------
Bene!
Ci rivediamo Venerdì 14 maggio con il settaggio di Excel.
A presto.
Francesco Caranti