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 :
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"
o ancora, usando anche Trim() per l'eliminazione di spazi iniziali e finali:
X = Trim(Range("A1"))
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):
istruzioni da inserire nell'evento Exit del TextBox1 (caso uno) Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
X = Right(TextBox1, 3)
Exit 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)
Exit 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:
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:
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") 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:
Buon Lavoro.
|