track
Dacă ai scris mai mult de câteva macrocomenzi VBA, probabil ai avut momentul acela în care trebuie să verifici dacă un anumit text există într-o celulă. În VBA, InStr este una dintre acele funcții pe care ajungi să le folosești peste tot. Îți spune unde apare un text în interiorul altuia. O poți folosi ca să verifici dacă un text există într-o celulă, să parcurgi valori într-un text sau să construiești logică condițională în macrocomenzi care depind de tipare de text.
În acest ghid, te voi trece prin sintaxa InStr, câteva exemple, cum funcționează modurile de comparare (partea asta încurcă lumea mai mult decât ar trebui) și câteva tipare pe care chiar le vei reutiliza.
Îți recomand să începi cu Excel Fundamentals pentru a-ți construi o bază solidă înainte să treci la VBA sau să urmezi cursul Advanced Excel Functions dacă ai ceva experiență, ca să înveți mai multe despre cum funcțiile cresc eficiența în analiza datelor.
Ce este funcția VBA InStr?
InStr este o funcție VBA care returnează poziția primei apariții a unui șir în interiorul altuia.
Rezultatele se comportă astfel:
- Dacă găsește, returnează un număr (poziția de la care începe potrivirea)
- Dacă nu găsește nimic, returnează 0
De exemplu, dacă „cat” apare la poziția 5 într-un șir, obții 5. Dacă nu e acolo, obții 0.
Sintaxa VBA InStr
Iată sintaxa completă pentru InStr:
InStr([start], string1, string2, [compare])
Unde:
-
start(opțional): Îi spune lui VBA de unde să înceapă căutarea. Dacă îl omiți, VBA începe de la poziția 1. -
string1(obligatoriu): Textul complet în care cauți. -
string2(obligatoriu): Textul pe care încerci să-l găsești. -
compare(opțional): Definește cum se face compararea (sensibilă sau nu la majuscule/minuscule). Dacă îl omiți, VBA folosește modul de comparare implicit, de obicei sensibil la majuscule/minuscule.
Observă că poți ignora argumentele start și compare (InStr(string1, string2)) pentru o versiune mai simplă. Dar dacă decizi să folosești argumentul compare, trebuie să furnizezi și argumentul start.
Cum funcționează VBA InStr
Gândește-te la InStr ca la citirea unei propoziții de la stânga la dreapta, caracter cu caracter.
Funcția pornește cu string1, îl scanează și caută primul loc unde string2 se potrivește. În momentul în care găsește potrivirea, se oprește și returnează poziția de la care a început.
Poziția „potrivirii” e importantă, deoarece VBA numără de la 1, nu de la 0. Așadar, primul caracter dintr-un șir este poziția 1, al doilea este 2 și așa mai departe.
Valorile returnate de VBA InStr explicate
Interpretarea rezultatului unei funcții InStr este simplă. Poți obține oricare dintre următoarele:
-
Număr pozitiv: dacă găsește o potrivire, iar numărul îți spune de unde începe.
-
0: dacă nu există nicio potrivire nicăieri în șir
Totuși, dacă șirurile de intrare sunt Null, funcția returnează Null. Deși poți ignora asta pentru macrocomenzi de bază, merită reținut că diferența poate strica o condiție în liniște.
Exemple VBA InStr de bază
Acum îți voi arăta câteva exemple de utilizare a funcției VBA InStr.
Găsește un cuvânt într-o propoziție
Pentru a verifica dacă cuvântul „before” se află în nota „Deliver before noon”.
Sub Before()
Dim result As Integer
result = InStr("Deliver before noon", "before")
MsgBox result
End Sub
Rezultatul pentru VBA-ul de mai sus este 9 deoarece „before” începe la al nouălea caracter.
Verifică dacă există un caracter
Pentru a verifica dacă „0” există într-un anumit șir, folosește VBA:
Sub ChExist()
Dim result As Integer
result = InStr(“A1023”, “0”)
MsgBox result
End Sub
În acest caz, orice rezultat mai mare decât 0 înseamnă că s-a găsit caracterul.
Caută de la începutul unui șir
Ca să cauți de la începutul unui șir, nu trebuie să specifici poziția de start, deci începe de la 1. Asta este setarea implicită de fiecare dată, dacă nu spui altfel.
Sub ChExist()
Dim result As Integer
result = InStr("Report_2026_Final", "2026")
MsgBox result
End Sub
Cum folosești VBA InStr în instrucțiuni If
Când lucrezi cu un fișier real, nu cauți doar un număr; vrei să iei o decizie. Cel mai comun mod de a folosi InStr este în interiorul unei instrucțiuni If pentru a filtra date.
Pe parcursul acestui tutorial, vom folosi un set de date de probă, Orders, cu coloanele: ID, CustomerName, Email, City și OrderNotes.
If InStr(...) > 0 Then
Deoarece InStr returnează 0 când nu găsește nimic, verificăm dacă rezultatul există atunci când întoarce un număr mai mare decât 0.
În exemplul de mai jos, se uită la coloana OrderNotes (coloana 5). Dacă găsește cuvântul „Fragile”, scrie „Handle Carefully” în coloana 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
Verificări condiționale pentru cuvinte cheie și filtrarea textului
Poți folosi funcția InStr și pentru a verifica cuvinte cheie în șiruri, mai ales dacă expresia se schimbă ușor. De exemplu, codul de mai jos verifică dacă nota conține „Call” (cum ar fi „Call on arrival” sau „Call before delivery”). Apoi marchează și adaugă eticheta „Cal Customer” în coloana 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
Sensibilitatea la majuscule/minuscule și modurile de comparare în VBA InStr
Implicit, InStr este sensibil la majuscule/minuscule (numit vbBinaryCompare). Să zicem că cauți „chicago”, dar în date apare „Chicago” — InStr va returna 0.
Pentru a rezolva, folosești argumentul compare, unde:
-
vbBinaryCompare(Implicit): sensibil la majuscule/minuscule („A” nu este același cu „a”.) -
vbTextCompare: nesensibil la majuscule/minuscule — „A” este același cu „a”.
În exemplul de mai jos, InStr returnează 0 deoarece caută „fragile” (litere mici) în „Fragile items”.
Sub CheckFragile()
Dim result As Integer
result = InStr(1, "Fragile items", "fragile", vbBinaryCompare)
MsgBox result
End Sub
Totuși, folosind vbTextCompare returnează 1 prin aceeași căutare, dar ignoră scrierea cu majuscule/minuscule.
Sub CheckFragile()
Dim result As Integer
result = InStr(1, "Fragile items", "fragile", vbTextCompare)
MsgBox result
End Sub
VBA InStr cu o poziție de start
Uneori nu vrei să începi căutarea la începutul șirului. Argumentul start îi spune lui VBA de unde să înceapă căutarea.
În exemplul de mai jos, argumentul start este setat la 10, astfel încât VBA începe să caute de la al zecelea caracter în loc de primul. Apoi găsește "delivery" mai târziu în șir.
Sub CheckUrgent()
Dim result As Integer
result = InStr(10, “Deliver before noon - urgent delivery”, “delivery”)
MsgBox result
End Sub
Rezultatul exemplului de mai sus este 31, adică poziția la care începe "delivery".
Această metodă e utilă când vrei a doua apariție a ceva sau să ignori un prefix cunoscut când lucrezi cu tipare repetitive.
VBA InStr vs. InStrRev
După cum ai învățat deja, InStr caută de la stânga la dreapta. Însă InStrRev caută de la dreapta la stânga.
De exemplu, am folosit InStrRev pentru a găsi ultimul punct din email. Rezultatul este 18, care este poziția punctului dinainte de „com”.
Sub CheckChr()
Dim result As Integer
result = InStrRev("john.jacobs@email.com", ".")
MsgBox result
End Sub
Vei găsi InStrRev mai utilă când ai nevoie de ultima apariție a ceva sau când lucrezi cu nume de fișiere, emailuri sau căi.
Cazuri de utilizare comune pentru VBA InStr
Acum că am văzut exemple despre cum funcționează funcția VBA InStr, să privim cazurile de utilizare comune.
Verifică dacă o celulă conține un cuvânt cheie
Presupune că ai un set de date cu comenzi ale clienților și trebuie să marchezi comenzile pentru manipulare specifică. Codul se uită la coloana OrderNotes și marchează orice conține „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
Validează text în stil email
Poți folosi funcția InStr și pentru a verifica rapid formate de email valide. De exemplu, codul de mai jos verifică dacă emailul conține @ și returnează „Valid Email Format” în coloana 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
Detectarea separatorilor precum virgule sau liniuțe
Poți folosi funcția InStr pentru a verifica dacă există o liniuță, virgulă sau bară oblică într-un text. În exemplul de mai jos, codul parcurge OrderNotes (coloana E), verifică dacă există o virgulă în text, apoi scrie un rezultat în coloana 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
Greșeli frecvente cu VBA InStr
Chiar și ca dezvoltator cu experiență, poți da peste probleme cu funcția InStr, care fac codul să se comporte neașteptat. Următoarele sunt problemele comune pe care le-am întâlnit și cum le poți rezolva:
-
Să uiți că InStr numără de la 1: Amintește-ți mereu că pozițiile încep de la 1, nu de la 0. Dacă vii din Python sau JavaScript, la început pare ciudat.
-
Să tratezi InStr ca True/False: Reține că
InStrnu returneazăTruesauFalse. Dacă vrei să găsești ceva, trebuie să verifici dacă rezultatul este> 0. -
Ignorarea sensibilității la majuscule/minuscule: După cum știi acum,
InStreste implicit sensibilă la majuscule/minuscule. Dacă nu contează, spune asta cuvbTextCompareîn argumentulcompare. -
Să încurci string1 și string2: Amintește-ți mereu că primul argument este unde cauți. Al doilea este ce cauți. Dacă cauți așa
InStr(SearchTerm, FullText), vei primi mereu0.
VBA InStr vs. alte funcții de șiruri în VBA
Deoarece InStr arată de obicei unde se află un șir într-un text, hai să-l comparăm cu alte funcții pentru șiruri.
InStr vs. Like
Operatorul Like este folosit pentru potriviri după model. De exemplu, codul de mai jos verifică „Fragile”, dar folosește un model *, care înseamnă „orice înainte sau după”.
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
Folosește InStr dacă doar vrei să știi dacă un text există, și Like când trebuie să verifici text după tipare complexe.
InStr vs. Replace
Deși poți folosi InStr pentru a schimba întreaga valoare dintr-o celulă, funcția Replace schimbă textul specific din celulă.
În exemplul de mai jos, funcția Replace înlocuiește direct „Fragile” cu „Handle Carefully” în interiorul textului.
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
Funcția Mid este folosită pentru a extrage text dintr-un șir. Prin urmare, vei folosi des Mid împreună cu InStr pentru a extrage textul după ce îi afli poziția.
Codul de mai jos extrage domeniul din emailurile din setul de date. Funcția InStr găsește unde apare „@” în email, apoi Mid începe extragerea după acesta. Codul se încheie scriind domeniul în coloana 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
Funcția Split este folosită pentru a împărți textul în părți specificând un separator.
În exemplul de mai jos, codul citește fiecare rând din coloana A, verifică dacă există o virgulă, apoi împarte textul în două părți. Scrie Name → coloana B și City → coloana 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
Bune practici pentru utilizarea VBA InStr
Pentru a evita erorile în VBA, îți recomand următoarele bune practici, care m-au ajutat să economisesc timp:
-
Folosește vbTextCompare când nu contează majusculele/minusculele: Deoarece majoritatea datelor reale nu sunt consecvente ca scriere, poți rata potriviri dacă te bazezi pe argumentul de comparare implicit.
-
Combină cu „If” pentru logică clară: Încearcă mereu să incluzi o logică ce returnează o valoare, deoarece
InStrde una singură îți dă doar un număr. -
Verifică pentru > 0, nu poziții exacte, decât dacă ai nevoie de poziție.
-
Păstrează parsarea lizibilă. Nu îngrămădi prea multe funcții pe o singură linie.
Concluzie
InStr este simplă, dar ajungi să o folosești peste tot. Îți oferă poziția unui șir în interiorul altuia, iar acel singur număr alimentează multe decizii în VBA: dacă ceva există, de unde să extragi și ce ar trebui să facă o macrocomandă în continuare. De una singură, este doar o căutare. Combinată cu funcții precum Mid, Replace sau chiar Split, devine parte dintr-un flux de lucru care chiar rezolvă lucruri.
Urmează cursul nostru Data Analysis in Excel pentru a stăpâni analize avansate. De asemenea, urmează cursul Intermediate Power Query in Excel pentru a învăța despre transformarea datelor și folosirea limbajului M.
Întrebări frecvente
Ce returnează de fapt InStr?
Returnează poziția de la care începe potrivirea. Dacă nu se găsește nimic, returnează 0.
InStr este sensibilă la majuscule/minuscule?
Da, InStr este implicit sensibilă la majuscule/minuscule. ”Fragile” și ”fragile” sunt tratate diferit. Folosește vbTextCompare dacă nu vrei o comparare sensibilă la majuscule/minuscule.
Ce înseamnă că InStr numără de la 1?
Primul caracter dintr-un șir este poziția 1, nu 0. Asta contează când folosești rezultatul în alte funcții.
Ce se întâmplă dacă una dintre valori este Null?
Rezultatul va fi tot Null, nu 0.
Care este diferența dintre InStr și InStrRev?
InStr caută de la stânga la dreapta, în timp ce InStrRev începe de la dreapta la stânga. Folosește-o pe cea din urmă când contează ultima apariție.