Lego le Mibo (12) – Riferimenti di celle

rubrica: 

Quando un paio di settimane 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 virtuosa ed 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 tratta di una soluzione raramente praticabile proprio perché il vero vantaggio del mix sta nell’unione di due strumenti  contemporaneamente in uno soltanto.    

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à.

Nota.

Colgo l’occasione per tranquillizzare quelli di voi che hanno manifestato ‘un po' di fretta’ per arrivare al sodo di ‘Lego le MIBO’.

Consapevole del fatto che con gli attuali ritmi didattici potremo arrivare al risultato sì e no alla fine del prossimo anno crying e che nessuno di voi (io per primo) avrebbe la costanza di faticare così tanto, vi do la buona notizia che stavate aspettando, cioè che ACCELEREREMO già dalla volta prossima. D’altra parte, come già avevo anticipato, io debbo avanzare col passo del montanaro perché debbo rispettare chi di questa materia è a quota zero e ha infilato solo la prima o la seconda, cioè un po' più sotto di chi è partito in quarta. Come già sapete, vi confermo che il mio obiettivo è la vostra consapevolezza e la vostra autonomia che, anche se non sarà totale da parte vostra, sarà una buona compagna di viaggio e darà più spinta alle vostre capacità.

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 con restituzione di dati output’ 

A questo punto partiamo dalla fine, cioè dal risultato che vogliamo ottenere, facendo il percorso al contrario.

Battezziamo subito il nuovo progetto col nome: “Equazione di secondo grado bis” (in fondo all’articolo trovate il file scaricabile). 

Vediamo:

Avete certamente capito la differenza tra questa versione e la precedente: il dialogo uomo/macchina non avviene più tramite Input e Msg Box ma tramite celle.

Infatti i valori a), b) e c) vengono inseriti nelle celle corrispondenti: nel nostro esempio  1-56.

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?” … e …  “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 “si pensa in modo B3”
  • In Visual Basic “si deve pensare in modo R3C2”

Nota:

In camera caritatis, penso che i progettisti che nel tempo hanno deciso gli ‘stili’ si siano un po' ubriacati. Infatti: perché 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 universitaria) sia partito da R1_C1. Ecco che, unificare i due progetti non dove esser stato certamente un lavoro di poco conto.

Oh, attenzione: la mia non è una polemica gratuita! E’ solo per dire che ogni volta che personalmente mi trovo a passare da Excel a VBA debbo mettermi a testa in giù e ragionare al contrario … un po' seccante ma … figuriamoci … le mie sono solo quisquilie e pinzillacchere

Ricapitoliamo.  

I riferimenti delle celle saranno:

  • Di stile A_1  quando farò Excel tradizionale (per celle)
  • Di stile R1_C1  quando lavorerò in VBA

 

Ottimo! … però, come si fa a passare da uno stile all’altro?

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.

Attenzione perché quei birichini di Excel hanno messo la scelta ‘Opzioni’ del percorso in un punto talmente basso del menù ‘File’ che le prime volte si fa veramente fatica a trovarla.

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
'-----------------------------------------------------------------------------
' Accept delle variabili (nel nostro esempio: 1, -5, 6)
' L'accept viene spezzata in 3 parti, una per ciascuna variabile, con 3 Input Box
'-----------------------------------------------------------------------------
'
'  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^ accept
'
enter_a:
    a = Cells(17, 4)
    If a = 0 Then
    MsgBox "'a' non può essere zero !"
    GoTo enter_a
    End If
'-----------------------------------------------------------------------------
'  2^ accept
'
enter_b:
    b = Cells(18, 4)
    If b = 0 Then
    MsgBox "'b' non può essere zero !"
    GoTo enter_b
    End If
'-----------------------------------------------------------------------------
'  3^ accept
'
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

-------------------------------------------------------------------------------------------------------

Lunghetto ma non particolarmente complicato il lavoro di oggi, che ne dite? smiley

Ci rivediamo la prossima volta con il settaggio di Excel.

A presto.

Francesco Caranti