Funzioni Stringa.   (20/02/03)

Il VBA dispone di una vasta raccolta di Funzioni che consentono la gestione di una gran parte delle esigenze del programmatore: in questa pagina ci occuperemo delle funzioni necessarie alla manipolazione di valori in formato testo ("Espressione testuale") o più semplicemente "Stringhe". Alcune funzioni le abbiamo già viste (in questa sezione, paragrafo "Mid, Left e Right"), ora vediamo le altre. Sotto una tabella completa di queste funzioni, peraltro rintracciabili nella guida in linea dall'editor di visual basic :

Funzione Valore restituito Tipo di dato

LCase($)

tutte le lettere di $ rese in minuscolo

String

Len($)

misura la lunghezza della stringa $ (quanti caratteri)

Long

LTrim(&)

elimina gli spazi iniziali dalla stringa $

String

RTrim($)

elimina gli spazi finali dalla stringa $

String

Space(n)

stringa composta da n spazi

String

String(n, c)

stringa composta da n volte del carattere c

String

StrReverse($)

rende a rovescio la stringa $

String

Trim($)

rende la stringa $ privata degli spazi iniziali e finali

String

Ucase($)

tutte le lettere di $ rese in MAIUSCOLO

String

Precisazione: lo "spazio" inserito tra due nomi (es.: Rossi Due  ) viene contato come se fosse un carattere; attenzione quindi agli "spazi" quanto si usano le funzioni Mid, Left, Right, Len. Eventualmente usare prima una delle Funzioni Trim per rendere il valore stringa SENZA spazi iniziali o finali (con le Funzioni Trim non vengono eliminati gli spazi "intermedi" che andranno quindi considerati nel numero totale delle lettere).

In genere queste funzioni (tranne LCase e UCase) vengono usate quando si debbano eseguire dei controlli sul contenuto di una cella o di una textbox ( sia testo che numeri o date ), e si voglia impedire l'immissione di valori non conformi. Misurare la lunghezza (con Len()) di un valore stringa , per esempio, può servire a controllare che una data immessa sia nel formato "breve" : 01/01/03 oppure 01-01-03 ; entrambe saranno formate da 8 caratteri, se scriveremo 01/01/2003 i caratteri salgono a 10, o ancora per controllare che un valore stringa sia composta da un preciso numero di caratteri, per esempio un codice articolo che deve essere di 11 caratteri e non vogliamo accettare codici con lunghezza diversa, oppure....e qui gli esempi si sprecano, talmente tante possono essere le condizioni da verificare che è impensabile elencarne tutti gli esempi. L'importante è vedere come impostare le istruzioni ( i riferimenti seguenti alla cella A1 o alla textbox1 servono solo da campione, e riferiti alla stringa " Rossi Due" (con uno "spazio" prima di Rossi)  inserita in una cella o textbox):

MsgBox "il testo è lungo" & Len(Range("A1")) & " caratteri"

ed avremo :

 

o ancora, usando anche Trim() per l'eliminazione di spazi iniziali e finali:

X = Trim(Range("A1"))
MsgBox "il testo è lungo " & Len(X) & " caratteri"

ed avremo :

 

Il discorso degli "spazi" diventa importante se consideriamo che molte persone hanno l'abitudine di premere la "barra spaziatrice" prima di iniziare a scrivere in una cella o in una textbox, o dopo aver scritto, e lo fanno senza rendersene conto: visivamente (a schermo) spesso è difficile poi intercettare la presenza di uno spazio iniziale o finale. Provate a pensare a quanti di voi, dopo aver scritto "Rossi Due" in una textbox, premono la "barra spaziatrice" PRIMA di premere "Invio" per passare al comando successivo: in questo caso la lunghezza della stringa sarebbe formata ANCHE dallo spazio aggiunto dopo "Due ". Il fatto può essere ininfluente in molto casi, ma se, per fare un esempio, volessimo controllare che un numero fosse composto da due soli decimali, e controllare che sia usata la virgola e non il punto, avremmo bisogno di un controllo che, leggendo da destra il numero di caratteri presenti, intercetti la terzultima posizione per verificare la presenza della virgola ed in questo caso bloccasse la routine e avvisasse di correggere. A questo punto, se avessimo inserito uno spazio alla fine, la ricerca avverrebbe sul penultimo numero in quanto lo spazio verrebbe contato e falserebbe il controllo (infatti il penultimo numero + uno spazio diventa il terzultimo). Vediamo un esempio diversificato: caso uno senza il controllo RTrim - caso due con RTrim  (toglie gli spazi a destra):

  • Usiamo la TextBox1

  • Numero da rendere con due decimali :   12345,88

  • Controllo per la presenza della virgola sfruttando la funzione Right() e Mid()

  • Numero scritto invece con uno spazio alla fine e con "l'errore" del punto 12345.88 

istruzioni da inserire nell'evento Exit del TextBox1 (caso uno)

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

X = Right(TextBox1, 3)
If Mid(X, 1, 1) <> "," Then
MsgBox "Cucù"

Exit Sub
End If
End Sub
.

L'istruzione, prima estrae gli ultimi 3 caratteri a destra e li assegna ad X (istruz. Right),  poi controlla con Mid il primo carattere (di X ) (1) per la lunghezza di 1 carattere (secondo 1) : se è diverso da "virgola" allora blocca la routine, noi controlliamo ciò che abbiamo scritto e cambiamo il punto con la virgola: tutto a posto? Neanche per idea, la routine continua a rifiutarsi di proseguire perchè il codice conta anche lo spazio (che noi continuiamo a non vedere) e al primo posto degli ultimi tre caratteri (di X) legge 8, che non è certamente una virgola. Ora vediamo il caso due, con l'utilizzo di RTrim

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
X = Right(RTrim(TextBox1), 3)
If Mid(X, 1, 1) <> "," Then
MsgBox "Cucù"

Exit Sub
End If
End Sub

In pratica ora X è uguale agli ultimi tre caratteri MA abbiamo tolto gli eventuali spazi, annidando l'istruzione RTrim all'interno di Right, e verrà quindi letto effettivamente .88 .Trovato che esiste il punto al posto della virgola, verremo bloccati, ma basterà inserire la virgola e tutto andrà bene. Una parentesi: le funzioni Stringa, anche se nate per lavorare su testo, funzionano egregiamente su ogni tipo di dato (nell'esempio: numeri).

Ricapitoliamo: abbiamo visto fino ad ora le funzioni Len($), Trim($), le Mid($), Left($) e Right($) sono nella pagina a loro dedicata, vediamo ora le altre funzioni, i cui concetti sono facilmente assimilabili:

  • Space(n) la funzione inserisce tanti spazi quanti indicati da (n). Può essere usata quando si voglia per esempio, allineare a destra un testo rispetto ad altri, o ancora per avere del testo posizionato, sulle righe successive, allineato alla fine del testo della riga precedente. Esempio: supponiamo di avere allargato la dimensione della colonna A che dovrà contenere dei nominativi e, non volendo usare "allineamento delle celle a destra", vogliamo però che tutti i nominativi siano allineati alla fine del nominativo più lungo: in A1 abbiamo "Ermenegildo Brachelotti" (23 caratteri compreso lo spazio) in A2 invece avremo "Corrado Bianchi", più corto (15 c.c.s.); bene per A2 useremo la funzione Space(n) con il primo esempio: allineare la fine di un testo con la fine dell'altro:

Sub allinea()
Dim x, y, z As Long
x = Len(Trim(Range("A1")))
y = Len(Trim(Range("A2")))
z = x - y
Range("A2") = Space(z) & Range("A2")
End Sub

Misuriamo prima le lunghezze dei due testi e le "fissiamo" con le variabili x e y, indi ne facciamo la differenza (z) che usiamo come numero di spazi (n di Space) e infine concateniamo al testo in A2, e questo il risultato:

Da notare che per avere l'esatto effetto di allineamento dei caratteri, si è dovuto impiegare il carattere "Courier", l'UNICO tra tutti i font, che mantiene gli stessi spazi per ogni tipo di lettera. Se si fosse lasciato il font standard di Excel, l'Arial, si avrebbe avuto questo risultato, anche se gli spazi (n) sono gli stessi:

  • String(n, c) la funzione fornisce una stringa composta da tanti (n) di un carattere rappresentato dal parametro (c). In pratica assomiglia alla funzione Space, ma anzichè inserire "spazi" , inserisce n volte la lettera indicata (c). Esempio: inserire 8 asterischi nella cella A1:


  • Range("A1") = String(8, "*") - e in A1 avremo: ******** (da notare nell'istruzione l'uso dei doppi apici necessari per definire  il valore ( * ) da ripetere. Anche se avessimo voluto inserire un numero anzichè l'asterisco, l'avremmo dovuto inserire tra doppi apici, come sotto, per ripetere 8 volte il numero 6 :   Range("A3") = String(8, "6")
  • StrReverse($) la funzione restituisce una stringa al contrario di come è scritta. Esempio se in A4 scriviamo "come" ed applichiamo la funzione, otterremo "emoc". Vedi istruzione: Range("A4")=StrReverse(Range("A4"))

  • LCase  la funzione restituisce tutte le lettere di una stringa, (siano esse maiuscole e minuscole), solo minuscole. Esempio se in A5 scriviamo "BaraBBa" ed applichiamo la funzione, otterremo "barabba". Vedi istruzione:  Range("A5") = LCase(Range("A5"))

  • UCase  la funzione restituisce tutte le lettere di una stringa, (siano esse maiuscole e minuscole), solo maiuscole. Esempio se in A5 scriviamo "BaraBBa" ed applichiamo la funzione, otterremo "BARABBA". Vedi istruzione:  Range("A5") = UCase(Range("A5"))

  • Queste due ultime funzioni non hanno bisogno di tante spiegazioni: servono entrambe per avere uniformità di caratteri nella composizione di stringhe testo, per esempio digitare nominativi senza preoccuparsi delle maiuscole/minuscole, usando poi UCase, oppure per evitare test doppi nel caso di controllo inserimento di lettere in cicli di ricerca.

Esistono anche altre funzioni per lavorare con le stringhe, ma ne parleremo un'altra volta, per ora riporto una tabella di riscontro tra le Funzioni ora viste in vba, e le stesse disponibili sul foglio di lavoro:

Funzione VBA Funzione Foglio

LCase($)

=MINUSC(testo)

Len($)

=LUNGHEZZA(testo)

LTrim(&)

n.d.

RTrim($)

n.d.

Space(n)

n.d.

String(n, c)

=RIPETI(testo;volte)

StrReverse($)

n.t.

Trim($)

=ANNULLA.SPAZI(testo)

Ucase($)

=MAIUSC(testo)

Mid($, n1, n2)

=STRINGA.ESTRAI(testo;inizio;num_byte)

Left($, n)

 =SINISTRA(testo;num_caratt)

Right($, n)

=DESTRA(testo;num_caratt)

   Buon Lavoro.


prelevato sul sito http://ennius.interfree.it