Modificare il carattere (font) di una lettera in una stringa di testo. - dal 04/09/04 pagina vista: volte

Una recente richiesta è all'origine di questo articolo. Può capitare infatti che si abbia bisogno di scrivere nelle celle, non delle formule, ma "descrizioni" (espressioni) di formule usate in matematica o in geometria, come dimostrazioni di passaggi di calcolo. In questi casi si è usi adoperare lettere dell'alfabeto greco come simboli matematici, tipo Alfa, Beta, Omega, ecc. Un Font adatto a restituirci queste lettere è il Symbol (Symbol.ttf), che quasi tutti abbiamo sui nostri computer. Vediamo un piccolo esempio, supponiamo di voler scrivere, quindi come testo (stringa), in una cella la seguente rappresentazione di una formula:

b= sen(a)

ora se vogliamo che la "a" sia scritta come lettera "alfa", dovremo selezionare solo la "a", spostarci sul menù "Carattere", individuare il Font Symbol, selezionarlo e confermare, per ottenere questo risultato:

Ora è evidente che se su un foglio saranno presenti molte di queste espressioni, fare la modifica del carattere può diventare lungo e noioso, e qui ci viene in aiuto il vba, che ci consente di automatizzare i passaggi. Ovviamente l'esercizio potrà essere interessante comunque come informazione generica, al di là delle motivazioni su descritte.

Sfrutteremo l'oggetto Characters, la cui sintassi è Characters(start, length), dove start è il numero del carattere iniziale e length è il numero di caratteri. Per carattere iniziale si deve intendere la posizione all'interno del testo, occupata dal carattere (o dal primo dei caratteri) che vorremo modificare; con Lenght (lunghezza) indicheremo il numero dei caratteri a cui vorremo applicare il tipo di carattere (Font) voluto. Quindi, supponendo che l'esempio visto sopra sia nella cella A1, e che la lettera a cui applicare il Font Symbol (la "a") è in ottava posizione (bisogna contare anche gli spazi), la nostra istruzione sarà:

  • With [A1].Characters(Start:=8, Length:=1).Font
    .Name = "Symbol"
    .FontStyle = "Grassetto"
    .Size = 10
    End With

Abbiamo usato l'istruzione With ..End With per assegnare, definendo la cella A1 una volta sola, all'oggetto Font più proprietà contemporaneamente: con Name identifichiamo il tipo di carattere (di font) che vogliamo, con FontStyle impostiamo il grassetto, e con Size impostiamo la dimensione del carattere.

Questa istruzione potremo attivarla inserendola nell'evento del Worksheet_SelectionChange. Solo che questa istruzione ha qualche limitazione: si applica solo alla cella A1, e per effetto dell'argomento Start, la possiamo applicare solo alla ottava posizione.

Come possiamo fare per:

  1. modificare più celle contenenti espressioni ?

  2. selezionare la lettera a cui modificare il carattere (non sempre sarà la "a") ?

  3. come trovare la posizione della lettera scelta all'interno di una espressione stringa ?

  4. come evitare che per effetto del punto 1 il cambio di carattere si applichi anche a formule di Excel residenti nella stessa area su cui agiremo ?

Ci rispondiamo con queste soluzioni: intanto per definire una zona con più celle potremo definire un'intervallo di celle usando i classici riferimenti alle celle tipo With Range("A1:H100"), oppure lasciando a Excel il compito di "sentire" tutte le celle occupate (anche se non adiacenti) con With Activesheet.UsedRange, o altre modalità che utilizzino la funzione End (purchè tutte le celle interessate portino valori in celle adiacenti le une alle altre), oppure usare un Ciclo For Each Next che cerchi tutte le celle con valori (quindi diverse da vuoto) in una determinata area. Poi per evitare di modificare anche i caratteri delle formule o funzioni residenti, creeremo una condizione: se la cella contiene una formula (HasFormula) passeremo alla successiva; poi useremo una InputBox con la quale reperiremo la lettera che di volta in volta vorremo modificare nella stringa, infine useremo la funzione InStr che ci restituisce per una lettera cercata, la sua posizione (come valore numerico) all'interno della stringa. E vediamo le istruzioni, in verde i soliti commenti:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'sfruttiamo questo evento, ma 'potremo scrivere le sottostanti istruzioni in un modulo standard creando una macro da chiamare 'quando vorremo, associandola ad un pulsante
Dim CL As Object 
'dichiarazione di CL come variabile oggetto (CL saranno le celle)
dimmi = InputBox("Scrivi la lettera da convertire")
'con una inputbox chiediamo la lettera a cui 'modificare il font e la memoriziamo nella variabile "dimmi"
If dimmi = "" Then Exit Sub
 'se non scriviamo niente o si annulla, usciamo dall'istruzione
For Each CL In ActiveSheet.UsedRange
'iniziamo la ricerca in ogni CL (cella) del foglio attivo 'che contenga un valore o una formula
If CL.HasFormula = True Then GoTo 10
'se la cella contiene una formula, passiamo alla 'successiva saltando le sottostanti istruzioni, e andando all'indice riga 10:
X = InStr(CL, dimmi)
'con la variabile X prendiamo tramite InStr, la posizione della lettera 'reperita con "dimmi", all'interno della cella (CL) in quel momento letta
With CL.Characters(Start:=X, Length:=1).Font
'ed assegnamo il numero della posizione reperita 'con X all'rgomento Start che ora sa quale lettera individuare per impostare le istruzioni sottostanti
.Name = "Symbol"
.FontStyle = "Grassetto"
.Size = 10
End With
10:
Next
'si passa alla cella CL successiva fino alla fine di UsedRange
End Sub

In genere il tipo di stringhe in questione usa caratteri minuscoli, e quindi nella inputbox scriveremo la lettera in minuscolo, InStr cerca la lettera così come l'avremo scritta, ma se esistesse la necessità di usare le maiuscole e i carattteri usati nell'espressione stringa sono minuscoli (o viceversa), per evitare che InStr trovando diversità tra maiuscole e minuscole non riconosca la lettera cercata, potremo usare questa semplice istruzione posta nella sezione Dichiarazioni - Generale del modulo (standard o foglio) : Option Compare Text.

Sarà possibile usando Intersect (vedi articolo in questa sezione "Il metodo Intersect") limitare l'azione delle istruzioni su aree ben precise, evitando in questo modo di modificare anche lettere appartenenti a stringhe che non c'entrano niente con espressioni algebriche, matematiche, ecc.

 

Buon lavoro.

prelevato sul sito www.ennius.altervista.org