Programma
Se hai scritto più di qualche macro VBA, probabilmente ti sei già imbattuto in quel momento in cui devi verificare se un testo esiste dentro una cella. In VBA, InStr è una di quelle funzioni che finisci per usare ovunque. Ti dice dove un pezzo di testo compare dentro un altro. Puoi usarla per controllare se un testo esiste in una cella, analizzare valori in un testo o pilotare logiche condizionali in macro che dipendono da pattern testuali.
In questa guida ti accompagno attraverso la sintassi di InStr, alcuni esempi, come funzionano le modalità di confronto (questa parte mette in difficoltà più del dovuto) e alcuni schemi che riuserai davvero.
Ti consiglio di iniziare con il nostro skill track Fondamenti di Excel per costruire basi solide prima di passare a VBA oppure, se hai già un po' di esperienza, segui il nostro corso Funzioni avanzate di Excel per capire meglio come le funzioni migliorano l'efficienza nell'analisi dei dati.
Che cos'è la funzione VBA InStr?
InStr è una funzione VBA che restituisce la posizione della prima occorrenza di una stringa dentro un'altra.
I risultati si comportano così:
- Se trova qualcosa, restituisce un numero (la posizione in cui inizia la corrispondenza)
- Se non trova nulla, restituisce 0
Per esempio, se "cat" compare alla posizione 5 in una stringa, ottieni 5. Se non c'è, ottieni 0.
Sintassi di VBA InStr
Ecco la sintassi completa di InStr:
InStr([start], string1, string2, [compare])
Dove:
-
start(opzionale): indica a VBA da dove iniziare la ricerca. Se lo ometti, VBA parte dalla posizione 1. -
string1(obbligatorio): il testo completo in cui stai cercando. -
string2(obbligatorio): il testo che stai provando a trovare. -
compare(opzionale): definisce come viene effettuato il confronto (distinzione tra maiuscole/minuscole o meno). Se lo ometti, VBA usa la modalità di confronto predefinita, di solito sensibile alle maiuscole/minuscole.
Nota che puoi ignorare gli argomenti start e compare (InStr(string1, string2)) per una versione più semplice. Ma se decidi di usare l'argomento compare, devi fornire anche l'argomento start.
Come funziona VBA InStr
Pensa a InStr come a leggere una frase da sinistra a destra, un carattere alla volta.
La funzione parte da string1, la scansiona e cerca il primo punto in cui string2 corrisponde. Nel momento in cui trova la corrispondenza, si ferma e restituisce la posizione da cui è iniziata.
La posizione della "corrispondenza" è importante perché VBA conta da 1, non da 0. Quindi il primo carattere di una stringa è in posizione 1, il secondo è 2 e così via.
Valori restituiti da VBA InStr spiegati
Interpretare il risultato di InStr è semplice. Puoi ottenere una delle seguenti opzioni:
-
Numero positivo: se trova una corrispondenza, il numero indica dove inizia.
-
0: se non c'è alcuna corrispondenza nella stringa
Tuttavia, se le stringhe in input sono Null, la funzione restituisce Null. Anche se puoi ignorarlo per macro basilari, vale la pena ricordare che la differenza può rompere una condizione in silenzio.
Esempi base di VBA InStr
Ora ti mostro alcuni esempi di utilizzo della funzione VBA InStr.
Trovare una parola in una frase
Per verificare se la parola "before" è dentro la nota "Deliver before noon".
Sub Before()
Dim result As Integer
result = InStr("Deliver before noon", "before")
MsgBox result
End Sub
Il risultato del VBA sopra è 9 perché "before" inizia al nono carattere.
Controllare se un carattere esiste
Per verificare se il carattere "0" esiste in una data stringa, usa il seguente VBA:
Sub ChExist()
Dim result As Integer
result = InStr(“A1023”, “0”)
MsgBox result
End Sub
In questo caso, qualsiasi risultato maggiore di 0 significa che il carattere è stato trovato.
Cercare dall'inizio di una stringa
Per cercare dall'inizio di una stringa, non devi specificare la posizione di partenza, quindi inizia da 1. È il default ogni volta, a meno che tu non dica diversamente.
Sub ChExist()
Dim result As Integer
result = InStr("Report_2026_Final", "2026")
MsgBox result
End Sub
Come usare VBA InStr negli If
Quando lavori con un foglio reale, non stai solo cercando un numero: stai cercando di prendere una decisione. Il modo più comune di usare InStr è dentro un'istruzione If per filtrare i dati.
In tutto il tutorial useremo un dataset di esempio, Orders, con le colonne: ID, CustomerName, Email, City e OrderNotes.
If InStr(...) > 0 Then
Dato che InStr restituisce 0 quando non trova nulla, verifichiamo se il risultato esiste quando restituisce un numero maggiore di 0.
Nell'esempio qui sotto, guarda la colonna OrderNotes (colonna 5). Se trova la parola "Fragile", scrive "Handle Carefully" nella colonna 6.
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
' Check if the order notes mention "Fragile"
If InStr(Cells(i, 5).Value, "Fragile") > 0 Then
Cells(i, 6).Value = "Handle Carefully"
End If
Next i
End Sub
Controlli condizionali per keyword e filtraggio del testo
Puoi usare la funzione InStr anche per verificare keyword nelle stringhe, soprattutto se la frase cambia leggermente. Per esempio, il codice qui sotto controlla se la nota contiene "Call" (come in "Call on arrival" o "Call before delivery"). Poi segnala e aggiunge il tag "Cal Customer" nella colonna 6.
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
' Check if the order notes mention “Call”
If InStr(Cells(i, 5).Value, “Call”) > 0 Then
Cells(i, 6).Value = “Call Customer”
End If
Next i
End Sub
Distinzione maiuscole/minuscole e modalità di confronto in VBA InStr
Per impostazione predefinita, InStr è case-sensitive (chiamato vbBinaryCompare). Mettiamo che cerchi "chicago" ma nei dati c'è "Chicago": InStr restituirà 0.
Per risolvere, usa l'argomento compare dove:
-
vbBinaryCompare(Default): distingue tra maiuscole/minuscole ("A" non è uguale a "a"). -
vbTextCompare: non distingue tra maiuscole/minuscole: "A" è uguale a "a".
Nell'esempio seguente, InStr restituisce 0 perché cerca "fragile" (minuscolo) dentro "Fragile items".
Sub CheckFragile()
Dim result As Integer
result = InStr(1, "Fragile items", "fragile", vbBinaryCompare)
MsgBox result
End Sub
Usando invece vbTextCompare ottieni 1 con la stessa ricerca, ignorando le maiuscole/minuscole.
Sub CheckFragile()
Dim result As Integer
result = InStr(1, "Fragile items", "fragile", vbTextCompare)
MsgBox result
End Sub
VBA InStr con posizione di partenza
A volte non vuoi iniziare la ricerca dall'inizio della stringa. L'argomento start indica a VBA da dove cominciare a cercare.
Nell'esempio seguente, l'argomento start è impostato a 10, quindi VBA inizia a cercare dal decimo carattere invece che dal primo. Trova poi "delivery" più avanti nella stringa.
Sub CheckUrgent()
Dim result As Integer
result = InStr(10, “Deliver before noon - urgent delivery”, “delivery”)
MsgBox result
End Sub
Il risultato dell'esempio sopra è 31, cioè la posizione in cui inizia "delivery".
Questo metodo è utile quando vuoi la seconda occorrenza di qualcosa o ignorare un prefisso noto quando lavori con pattern ripetuti.
VBA InStr vs. InStrRev
Come hai già visto, InStr cerca da sinistra a destra. InStrRev, invece, cerca da destra a sinistra.
Per esempio, abbiamo usato InStrRev per trovare l'ultimo punto nell'email. Il risultato è 18, ossia la posizione del punto prima di "com".
Sub CheckChr()
Dim result As Integer
result = InStrRev("john.jacobs@email.com", ".")
MsgBox result
End Sub
Troverai InStrRev più utile quando ti serve l'ultima occorrenza di qualcosa o quando lavori con nomi di file, email o percorsi.
Casi d'uso comuni di VBA InStr
Ora che abbiamo visto esempi di come funziona la funzione VBA InStr, vediamo i casi d'uso più comuni.
Controllare se una cella contiene una keyword
Supponiamo che tu abbia un dataset di ordini dei clienti e che debba contrassegnare ordini per una gestione specifica. Il codice guarda la colonna OrderNotes e segnala tutto ciò che contiene "noon".
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
If InStr(1, "Deliver before noon", "noon", vbTextCompare) > 0 Then
' Logic to mark as "Morning Delivery"
End If
Next i
End Sub
Convalidare testo in stile email
Puoi anche usare la funzione InStr per controllare rapidamente formati email validi. Per esempio, il codice qui sotto verifica se l'email contiene @ e scrive "Valid Email Format" nella colonna 6.
Sub ValidateEmail()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
If InStr(Cells(i, 3).Value, "@") > 0 Then
Cells(i, 6).Value = "Valid Email Format"
End If
Next i
End Sub
Rilevare separatori come virgole o trattini
Puoi usare la funzione InStr per verificare se esiste un trattino, una virgola o una barra nel testo. Nell'esempio sotto, il codice scorre OrderNotes (colonna E), controlla se c'è una virgola nel testo, quindi scrive un risultato in colonna F.
Sub ValidateEmail()
Dim i As Integer
Dim commaPos As Integer
Dim OrderNotes As String
For i = 2 To 51
OrderNotes = Cells(i, 5).Value
commaPos = InStr(1, OrderNotes, ",")
' If a comma exists, mark it
If commaPos > 0 Then
Cells(i, 6).Value = "Has comma"
Else
Cells(i, 6).Value = "No comma"
End If
Next i
End Sub
Errori comuni con VBA InStr
Anche da sviluppatore esperto potresti imbatterti in problemi con la funzione InStr che fanno comportare il codice in modo inatteso. Ecco i problemi più comuni che ho incontrato e come risolverli:
-
Dimenticare che InStr parte da 1: ricorda sempre che le posizioni partono da 1, non da 0. Se arrivi da Python o JavaScript, all'inizio può sembrare strano.
-
Trattare InStr come True/False: ricorda che
InStrnon restituisceTrueoFalse. Se vuoi trovare qualcosa, devi verificare se il risultato è> 0. -
Ignorare le maiuscole/minuscole: come ora sai,
InStrè sensibile alle maiuscole/minuscole per default. Se non ti interessa la differenza, dillo usandovbTextComparenell'argomentocompare. -
Confondere string1 e string2: ricorda sempre che il primo argomento è dove cerchi. Il secondo è ciò che stai cercando. Se cerchi così
InStr(SearchTerm, FullText), otterrai sempre0.
VBA InStr vs. altre funzioni stringa VBA
Dato che InStr di solito indica dove si trova una stringa in un testo, confrontiamola con altre funzioni sulle stringhe.
InStr vs. Like
L'operatore Like si usa per il pattern matching. Per esempio, il codice sotto controlla "Fragile", ma usa un pattern *, che significa "qualsiasi cosa prima o dopo".
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
If Cells(i, 5).Value Like "*Fragile*" Then
Cells(i, 6).Value = "Handle Carefully"
End If
Next i
End Sub
Usa InStr se ti serve solo sapere se un testo esiste, e Like quando devi controllare testi con pattern complessi.
InStr vs. Replace
Sebbene tu possa usare InStr per cambiare l'intero valore in una cella, la funzione Replace cambia un testo specifico nella cella.
Nell'esempio seguente, la funzione Replace sostituisce direttamente "Fragile" con "Handle Carefully" dentro il testo.
Sub ReplaceOrder()
Dim i As Integer
For i = 2 To 51
Cells(i, 5).Value = Replace(Cells(i, 5).Value, "Fragile", "Handle Carefully")
Next i
End Sub
InStr vs. Mid
La funzione Mid si usa per estrarre testo da una stringa. Perciò userai spesso Mid con InStr per estrarre il testo dopo averne ottenuto la posizione.
Il codice qui sotto estrae il dominio dalle email nel dataset. La funzione InStr trova dove appare "@" nell'email, poi Mid inizia l'estrazione subito dopo. Il codice termina scrivendo il dominio nella colonna H.
Sub ExtractDomain()
Dim i As Integer
Dim pos As Integer
Dim domain As String
For i = 2 To 51
pos = InStr(1, Cells(i, 3).Value, "@")
If pos > 0 Then
domain = Mid(Cells(i, 3).Value, pos + 1)
Cells(i, 8).Value = domain
End If
Next i
End Sub
InStr vs.Split
La funzione Split si usa per dividere il testo in parti specificando un separatore.
Nell'esempio seguente, il codice legge ogni riga dalla colonna A, controlla se c'è una virgola e poi divide il testo in due parti. Scrive Name → colonna B e City → colonna C.
Sub SplitTextColumn()
Dim i As Integer
Dim lastRow As Integer
Dim parts As Variant
Dim text As String
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
text = Cells(i, 1).Value
' Only split if a comma exists
If InStr(1, text, ",") > 0 Then
parts = Split(text, ",")
Cells(i, 2).Value = parts(0) ' Name
Cells(i, 3).Value = parts(1) ' City
End If
Next i
End Sub
Best practice per usare VBA InStr
Per evitare errori nel tuo VBA, ti consiglio le seguenti best practice, che mi hanno fatto risparmiare tempo:
-
Usa vbTextCompare quando le maiuscole/minuscole non contano: dato che la maggior parte dei dati reali non è coerente nel casing, potresti perdere corrispondenze se ti affidi all'
argomentodi confronto predefinito. -
Combinala con "If" per una logica chiara: cerca sempre di includere una logica che restituisca un valore, perché
InStrda sola ti dà solo un numero. -
Controlla > 0, non posizioni esatte, a meno che tu non abbia davvero bisogno della posizione.
-
Tieni il parsing leggibile. Non impilare troppe funzioni in una riga.
Conclusione
InStr è semplice, ma finirai per usarla ovunque. Ti dà la posizione di una stringa dentro un'altra, e quel singolo numero guida molte decisioni in VBA: se qualcosa esiste, da dove estrarre e cosa deve fare la macro dopo. Da sola è solo una ricerca. Combinata con funzioni come Mid, Replace o anche Split, diventa parte di un flusso di lavoro che fa davvero le cose.
Segui il nostro corso Data Analysis in Excel per padroneggiare l'analisi avanzata. Inoltre, segui il nostro corso Intermediate Power Query in Excel per imparare la trasformazione dei dati e l'uso del linguaggio M.
FAQ
Cosa restituisce esattamente InStr?
Restituisce la posizione in cui inizia la corrispondenza. Se non trova nulla, restituisce 0.
InStr distingue tra maiuscole e minuscole?
Sì, InStr è sensibile alle maiuscole/minuscole per impostazione predefinita. ”Fragile” e ”fragile” sono trattati come diversi. Usa vbTextCompare se non vuoi una comparazione case-sensitive.
Cosa significa che InStr parte da 1?
Il primo carattere di una stringa è in posizione 1, non 0. Questo conta quando usi il risultato in altre funzioni.
Cosa succede se uno dei valori è Null?
Anche il risultato sarà Null, non 0.
Qual è la differenza tra InStr e InStrRev?
InStr cerca da sinistra a destra, mentre InStrRev parte da destra verso sinistra. Usa la seconda quando conta l'ultima occorrenza.
