Passare da Stringhe a Formule

Quando le formule hanno bisogno di una rappresentazione visiva, ma si vuole anche che vengano tradotte in formule per eseguire il calcolo, cominciano i dilemmi, perchè se scegliamo da Strumenti/Opzioni/Visualizza e spuntiamo la casella di "Formule", vedremo, sul foglio di lavoro, le formule, ma non i risultati. Questo esempio lo presento a seguito di una domanda rivoltami , e può interessare tutti quei lavori dove si debba illustrare il calcolo che porta ad un risultato, come per esempio preventivi o fatture di/per  lavori nel campo edilizio, dove si è usi fornire le spiegazioni di come un risultato si è ottenuto, attraverso la scrittura della formula che l'ha generato. E qui casca l'asino quando si voglia automatizzare il calcolo. Infatti il problema di far accettare una formula come descrizione, non esiste, in quanto è sufficiente scegliere da "Formato Cella" il formato Testo, e tutto ciò che verrà scritto nella cella sarà da excel considerato sempre e soltanto testo (cioè una stringa di testo), ma esiste il problema di far capire ad excel che nella cella accanto (per esempio) a quella che contiene la stringa testo, vogliamo che avvenga il calcolo rappresentato dalla stessa stringa testo. Ipotizziamo di avere in A1 la visualizzazione della formula come stringa, ed in B1 di volere il conteggio generato dalla formula. Sarà inutile tentare con formule (in B1) tipo =A1 oppure ="="&A1 perchè otterremo solo una copia della stringa. Si può ovviare alla bisogna con l'utilizzo di una riga di codice, inserita in una macro, oppure in un evento tipo Change del Foglio di lavoro, usando un'istruzione così:

Range("B1").Formula = "=" & Range("B1").Offset(0, -1)

oppure

Range("B1").Formula = "=" & Range("A1")


Il nocciolo dell'istruzione è "=" & che rende in B1 il contenuto di A1 preceduto dal segno uguale e quindi formula.

Due precisazioni importanti e necessarie:

  • La descrizione della formula in A1 (stringa) dovrà essere scritta SENZA il segno di uguale come in questo esempio: (4.00+3.15+2.22)*2.55   e   NON   =(4.00+3.15+2.22)*2.55 , pena un errore del debugger che non riconosce il dato per la presenza finale di due segni di uguale.

  • Nella descrizione della formula in A1 (stringa) per indicare i decimali, DOVRA' essere usato il PUNTO al posto della VIRGOLA, come si usa nella sintassi inglese. Ricordo che l'operazione di conversione da stringa a formula, avviene attraverso il codice Vba, che "ragiona" in inglese: se gli si fornisce una stringa da interpretare dove i decimali sono virgole, il Vba non la riconosce e si genera un errore. Excel poi convertirà il risultato fornito dal codice in sintassi italiana, con le virgole al posto dei punti: sarà infatti sufficiente controllare la formula in B1 per vederla così: =(4+3,15+2,22)*2,55

Sotto vediamo meglio un esempio  di un foglio di lavoro normalmente usato per il "COMPUTO METRICO",  dove si fà appunto uso di caselle (Colonna E9) che ospitano numeri che rappresentano misure da usare per ottenere le quantità (Colonna G). E' in questa colonna (G) dove l'istruzione contenuta nella macro, deve effettuare la conversione il formula della stringa numeri della cella E.

Poichè su fogli di questo tipo si preferisce preimpostare una certa lunghezza di righe, sarà necessario predisporre una formula per ogni riga, ma nel caso che si salti una riga per ottenere una impostazione grafica gradevole, le celle nella colonna G (che non trovano stringhe da convertire nelle celle relative alla colonna E) porterebbero dei segni di uguale che esteticamente non sono graditi. Si può predisporre una routine che controlli se esistono dati nelle celle colonna E, e solo in questo caso, svolgano la conversione. Queste istruzioni eseguono un ciclo di ricerca dal Range E7 fino alla E201, e se trovano stringhe numeri, le convertono in formula, altrimenti non eseguono la conversione.

Sub calcola2()
On Error Resume Next
Dim CL As Object
For Each CL In Range("E7:E201")
If CL = "" Then
GoTo 10
Else
CL.Offset(0, 2).Formula = "=" & CL
End If
10:
Next
Resume
End Sub

Buon lavoro.