Sostituire con Replace

Qualche volta si ha la necessità di sostituire una porzione di una stringa con un'altra: per esempio vorremmo cambiare "Televisione" in "Telefono"

Per fare questo abbiamo la funzione Replace la cui sintassi è la seguente:

Replace(espressione, cerca, sostituisci[, inizio[, conteggio[, confronto]]])

argomenti obbligatori

  1. espressione è la stringa originaria
  2. cerca è la sottostringa compresa nella stringa originaria da sostituire
  3. sostituisci è la sottostringa che deve sostituire la sottostringa cerca

argomenti facoltativi:

  1. inizio che indica la posizione all'interno di espressione da cui iniziare la ricerca.
    Se omesso, viene automaticamente impostata la posizione 1
  2. conteggio che indica il numero di sostituzioni di sottostringa da eseguire. Deve essere utilizzato insieme a inizio
    Se omesso, viene automaticamente impostato -1, che esegue tutte le sostituzioni possibili.
  3. confronto che è il valore numerico che specifica il tipo di confronto da utilizzare nella valutazione delle sottostringhe. I possibili valori sono
    1. 0 Esegue un confronto binario
    2. 1 Esegue un confronto testuale
  4. Se omesso, il valore predefinito è 0

 

Usando questa funzione otteniamo il risultato con una unica istruzione. Senza questa funzione invece occorrerebbero molte righe di codice per ottenere lo stesso risultato.

Mi spiego: vorremmo che la stringa colora il tetto possa diventare coloro il tetto

Usando una normale sintassi, quella che logicamente mi verrebbe in mente, mi verrebbe da scrivere una cosa del genere:

A = "colora il tetto"
L = Len(A)
For T = 1 To L
If Mid(A, T, 1) = "a" Then
Mid(A, T, 1) = "o"
Exit For
End If
Next
MsgBox A

Faccio seguire alcuni esempi esplicativi:

usando delle costanti:

sostituisco la a di colora con la o

A = Replace("colora il tetto", "a", "o")

risultato: coloro il tetto

A = Replace("colora il tetto", "tetto", "cancello")
A = Replace("Televisione", "visione", "fono")

risultato: colora il cancello
oppure: Telefono

oppure usando delle variabili:

sostituisco il tetto con il cancello

espressione="colora il tetto"
cerca="tetto"
sostituisci="cancello"
A = Replace(espressione, cerca, sostituisci)

risultato: colora il cancello

 

Questo potrebbe essere un altro esempio di utilizzo:

Vogliamo scrivere un messaggio abbastanza lungo in una MsgBox. Il messaggio potrebbe essere questo:

"questo è un messaggio" & vbCrLf & "che è scritto su più righe" & "Beh questo è solo un esempio"

Il messaggio è spezzato in tante sottostringhe intercalate dal vbCrLf che è una costante che il VB interpreta come ritorno a capo/avanzamento riga

Usando la funzione Replace potremmo scrivere una istruzione del tipo:

MsgBox Replace("questo è un messaggio#che è scritto su più righe#Beh questo è solo un esempio", "#", vbCrLf)

In questo modo otterremo il messaggio:

questo è un messaggio
che è scritto su più righe
Beh questo è solo un esempio

 

Un esempio più complesso

E se volessimo cambiare una serie di caratteri?

Guardate la prossima (lo so, si potrebbe fare in un altro modo, ma ora stiamo parlando di Replace, quindi...) e la routine è costruita ad hoc per la stringa in esame.

La stringa è "giovanni di lorenzo nato in svizzera" e vogliamo trasformarla in "Giovanni Di Lorenzo nato in Svizzera" trasformando il primo carattere dei nomi propri da minuscoli a maiuscoli.

Sub SostituisciCarattere3()
Dim CarValidi, A, I, B, A1
A = "giovanni di lorenzo nato in svizzera"
A1 = A
CarValidi = Array("G", "D", "L", "S")
For I = LBound(CarValidi) To UBound(CarValidi)
B = LCase(CarValidi(I))
A = Replace(A, B, CarValidi(I))
Next
MsgBox A & vbCrLf & A1
End Sub

Spiegazioni del codice

Vogliamo trasformare le iniziali dei nomi propri contenuti in "giovanni di lorenzo nato in svizzera" in caratteri maiuscoli.

Usiamo una matrice (CarValidi) in cui poniamo i caratteri maiuscoli che debbono sostituire quelli minuscoli (G, D, L, S)

istruiamo un ciclo che va dal primo elemento della matrice (LBound) che è 0 - zero, all'ultimo (UBound) che è 3

Normalmente la matrice inizia da 0 - zero - ed il limite massimo è rappresentrato da un valore che indica una unità in meno degli effettivi membri della Matrice).

Se la matrice contiene o deve contenere 10 elementi, ed ha il limite inferiore impostato o 0 (zero), il suo limite superiore sarà uguale a 9.

man mano che il ciclo avanza mettiamo in B il carattere prelevato dalla matrice ed opportunamente trasformato in minuscolo da LCase

a questo punto siamo pronti per usare la funzione Replace.

 

Tuttavia, in alcuni casi occorre essere oculati in quanto questa funzione trasforma tutte le occorrenze che incontra delle sottostringhe da sostituire se non espressamente dichiarato nella sintassi.

Mettiamo di avere la stringa "sassari" da convertire in "Sassari"

usando l'istruzione più ovvia facendo uso delle sottostringhe "s" come stringa da cercare e "S" come stringa da sostituire

B = Replace("sassari", "s", "S")

otterremmo come risultato: SaSSari assolutamente sbagliato

non possiamo nemmeno usare le sottostringhe "sa" e "Sa"

B = Replace("sassari", "sa", "Sa")

perché otterremmo SasSari

Lavorando un po' con fantasia dobbiamo arrivare alla seguente

B = Replace("sassari", "sas", "Sas")

o, meglio, possiamo controllare quanti scambi effettuare usando, con le dovute virgole, il secondo parametro [opzionale] della Funzione

B = Replace(A, "s", "S", , 1)

che ci restituisce Sassari.

In quest'ultimo caso, omettendo il primo argomento facoltativo (avendo tuttavia cura di mettere la sola virgola come segnaposto), usiamo anche il secondo argomento facoltativo conteggio che indica il numero di sostituzioni di sottostringa da eseguire.

 

Attenzione

Una particolare attenzione va posta sul primo parametro opzionale Inizio. Se usiamo questo parametro che indica la posizione all'interno di Espressione da cui iniziare la ricerca, tronca la stringa e ci restituisce un'altra stringa a partire dal punto indicato dal parametro Inizio.

Vediamo questo esempio:

A = "giovanni di lorenzo nato in svizzera"
I = InStr(1, A, " ")
A = Replace(A, "o", "x", I)

con la seconda istruzione che appare nel codice determiniamo, tramite la funzione InStr la posizione della prima occorrenza del carattere spazio nella stringa in esame e poniamo questo valore nella variabile I

con la funzione Replace intendiamo sostituire tutti i caratteri "o" con il carattere "x" a partire dalla posizione data da I.

Tuttavia con nostra sorpresa il risultato che ci ritorna dopo l'esecuzione di queste istruzioni non è: giovanni di lxrenzx natx in svizzera come ci aspetteremmo, ma di lxrenzx natx in svizzera troncato alla I.esima posizione.

A volte questa particolarità potrebbe tornarci utile, ma altre volte no. Perciò inviterei di nuovo a porre la massima attenzione al parametro opzionale Inizio.

Per ora penso che questo possa bastare, perciò vado subito ad augurarvi buon lavoro.