Folosirea InStr și InStrRev pentru a găsi un String în alt String

Puteți utiliza funcția Mid pentru a găsi un caracter individual într-un șir, dar ce se întâmplă dacă trebuie să găsiți un set de caractere într-un șir?

Funcția InStr este creată pentru a găsi un șir în alt șir. De exemplu, puteți verifica, să zicem, paragraful curent pentru a vedea dacă conține un anumit cuvânt. În caz contrar, puteți lua măsuri în consecință - de exemplu, înlocuirea cuvântului cu alt cuvânt sau selectarea paragrafului pentru includerea în alt document. Poate firma și-a schimbat numele și trebuie să faceți o căutare și să o înlocuiți într-un număr mare de șabloane de documente.

Funcția InStrRev este contrapartida funcției InStr, funcționând într-un mod similar, dar în sens invers.

Sintaxa pentru InStr este următoarea:

InStr([start, ]string1, string2[, compare])

Iată argumentele:

  • start este un argument opțional care specifică poziția de pornire din primul șir, string1. Dacă se omite start, VBA începe de la primul caracter din string1 (de obicei e locul din care se pornește). Oricum, trebuie folosit start când se folosește argumentul compare pentru a specifica tipul de comparare al șirului care va fi realizat.
  • string1 este un argument obligatoriu care specifică expresia string în care se va căuta string2.
  • string2 este un argument obligatoriu care specifică expresia string cu care se face căutarea în string1.
  • compare este un argument opțional care specifică tipul de comparare a șirurilor care va fi realizat. Textul poate fi comparat în două moduri: compararea binară, care este case sensitive, sau compararea textuală, care nu este case sensitive. Compararea implicită este cea binară, care se specifică folosind constanta vbBinaryCompare sau valoarea 0 pentru comparare. Deși specificarea acestei valori nu este necesară (pentru că este implicită), ea poate fi inclusă, pentru a face codul mai clar. Pentru a specifica compararea textuală, case-insensitive, se folosește constanta vbTextCompare sau valoarea 1 pentru comparare.

Folosirea Comparării Textuale cu șiruri de date imprevizibile

O comparație textuală este utilă atunci când datele pot ajunge într-o varietate de moduri, cum ar fi punctuația numărului de telefon descris în Scenariul Real de pe pagina Folosirea funcțiilor Left, Right și Mid pentru a returna o parte a unui șir. Iată un alt exemplu: pentru a căuta o selecție de instanțe ale unui nume, trebuie găsite toate instanțele literelor cu nume mari, litere mici sau titluri (prima literă majusculă). În caz contrar, va fi găsit doar numele cu exact aceleași majuscule care a fost specificat în argumentul String2.

O altă modalitate de a utiliza InStr este de a găsi locația unui anumit șir într-un alt șir, astfel încât să se poată schimba apoi acel substring. De exemplu, pentru a muta un fișier din poziția sa actuală într-un anumit dosar sau subfolder dintr-un alt folder care a avut o structură subdirectoare similară. De exemplu, lucrul cu documente stocate într-o varietate de subdosare, toate fiind într-un dosar numit In (cum ar fi z:\Documents\In\) și la final, salvarea în subfoldere corespunzătoare dintr-un folder numit Out (z:\Documents\Out\). Procedura prezentată mai jos salvează automat documentele din subfolderul Out.

Modificarea căii unui fișier

1. Sub Save_in_Out_Folder()
2. Dim strOName As String, strNName As String, intToChange As Integer
3. strOName = ActiveDocument.FullName
4. intToChange = InStr(strOName, "\In\")
5. strNName = Left(strOName, intToChange - 1) & "\Out\" & Right(strOName, Len(strOName) - intToChange - 3)
6. ActiveDocument.SaveAs strNName
7. End Sub

Codul de mai sus funcționează astfel:

  • Linia 1 începe procedura, iar linia 7 o încheie.
  • Linia 2 declară variabila strOName (adică original name) de tip String, variabila strNName (adică new name) de tip String și variabila intToChange de tip Integer. Linia 3 atribuie variabilei strOName proprietatea FullName a obiectului ActiveDocument: numele întreg al documentului activ, inclusiv calea la document (de exemplu, z:\Documents\In\Letters\My Letter.docm).
  • Linia 4 atribuie variabilei intToChange valoarea din funcția InStr care găsește stringul \In\ în variabila strOName. Folosind exemplul din paragraful anterior, variabilei intToChange i se va atribui valoarea 13 pentru că primul caracter din șirul \In\ este al 13-lea caracter din șirul strOName.
  • Linia 5 atribuie variabilei strNName noul nume de fișier creat în partea principală a instrucțiunii. Ea este formată astfel:
  • Left(strOName, intToChange - 1) preia partea din stânga a șirului strOName, returnând numărul de caractere specificate de intToChange - 1 = numărul stocat în intToChange minus unu.
  • &"\Out\" se adaugă la șirul specificat (la calea z:\Documents) unde caracterele \Out\ vor înlocui caracterele \In\, astfel numele căii va deveni (z:\Documents\Out\).
  • & Right(strOName, Len(strOName) - intToChange - 3) completează șirul adăugând secțiunea din dreapta a șirului strOName, începând de la șirul \In\ (Letters\My Letter.docm), rezultând z:\Documents\Out\Letters\My Letter.docm. Numărul de caractere care se preiau din dreapta este determinat prin scăderea din strOName a 3 caractere. Aici, valoarea 3 reprezintă caracterele \In\; pentru că valoarea intToChange stochează numărul de caractere de la primul caracter backslash, trebuie numărate doar caracterele I, n și al doilea caracter backslash pentru a ajunge la capăt.
  • Linia 6 salvează documentul folosind numele din variabila strNName.

Sintaxa pentru InStrRev este similară cu cea a comenzii InStr:

InStrRev(stringcheck, stringmatch[, start[, compare]])

Iată și argumentele:

  • stringcheck este un argument obligatoriu de tip String care specifică șirul în care se face căutarea stringmatch.
  • stringmatch este un argument obligatoriu de tip String care specifică șirul care se caută.
  • start este un argument opțional de tip numeric care specifică poziția de pornire pentru căutare. Dacă este omis argumentul start, VBA începe de la ultimul caracter din stringcheck.
  • compare (ca și la InStr) este un argument opțional care specifică modul de căutare: vbTextCompare pentru comparare text, vbBinaryCompare pentru comparare binară.