Folosirea funcțiilor Left, Right și Mid pentru a returna o parte a unui șir (String)

Uneori se utilizează în macrocomenzi doar o parte dintr-un șir. De exemplu, se pot prelua doar primele trei caractere ale numelui unui oraș pentru a crea un cod de locație.

VBA furnizează câteva funcții pentru preluarea caracterelor dorite din șir:

  • Funcția Left returnează un număr specificat de caractere numărate de la stânga șirului.
  • Funcția Right returnează un număr specificat de caractere numărate de la dreapta șirului.
  • Funcția Mid returnează un număr specificat de caractere care încep de la locația specificată din șir.

Unele funcții pentru șiruri au câte două versiuni.

VBA oferă două versiuni de funcții pentru numărul din șir, inclusiv pentru funcțiile Left, Right și Mid: versiunile afișate aici, care returnează valori Variant de tip String și versiunea a cărei nume se termină cu $ (Left $, Right $, Mid $ , și așa mai departe), care returnează valori de tip String.

Funcțiile care returnează valori de tip String rulează mai repede (deși este probabil să nu se observe nicio diferență în utilizarea normală), dar returnează o eroare dacă sunt folosite cu o valoare de tip Null. Funcțiile care returnează valori Variant de tip String pot face față valorilor Null fără probleme. Abordarea folosită depinde, de exemplu, de tipul de date manipulate. Unele baze de date folosesc Null, altele nu.

Folosirea funcției Left

Funcția Left returnează numărul specificat de caractere numărate de capătul din stânga al șirului. Sintaxa pentru funcția Left este:

Left(string, length)

Aici, argumentul string poate fi orice expresie de tip string - adică orice expresie care returnează o succesiune de caractere contigue. Funcția Left returnează Null dacă șirul nu conține date. Argumentul lenght este o expresie numerică și specifică numărul de caractere care trebuie returnate. lenght poate fi un număr simplu (cum ar fi 4, sau 7, sau 11) sau poate fi o expresie al cărei rezultat este un număr. De exemplu, dacă lungimea unui cuvânt a fost stocată în variabila numită LenWord și trebuie returnate cu două caractere mai puțin decât LenWord, ca argument pentru lenght se poate specifica expresia LenWord - 2; pentru a returna trei caractere mai mult decât LenWord, ca argument pentru lenght se poate specifica LenWord + 3.

Funcția Left poate fi folosită pentru a separa cod de zonă dintr-un număr de telefon care a fost furnizat ca un număr de 10 cifre neseparat dintr-o bază de date. În următoarele comenzi, numărul de telefon este stocat în variabila strPhone de tip String, creată anterior în cod:

Dim strArea As String 
strArea = Left(strPhone, 3)

Aceste comenzi creează variabila Area și stochează în ea primele 3 caractere de la stânga din variabila strPhone.

Folosirea funcției Right

Funcția Right este imaginea în oglindă a funcției Left. Right returnează numărul specificat de caractere numărat de la dreapta șirului. Sintaxa pentru funcția Right este:

Right(string, length)

Din nou, argumentul string este orice expresie de șir și length este o expresie numerică specificând numărul de caractere care trebuie returnate. Și, din nou, Right returnează Null dacă șirul nu conține date și lungimea poate fi un număr sau o expresie care are ca rezultat un număr.

Pentru a continua exemplul anterior, funcția Right se poate folosi pentru a separa ultimele coduri din numărul de telefon stocat în strPhone:

Dim strLocalNumber As String 
strLocalNumber = Right(strPhone, 7)

Aceste comenzi creează variabila strLocalNumber și stochează în ea șapte caractere din variabila strPhone, numărate dinspre dreapta.

Folosirea funcției Mid

Funcțiile Left și Right extrag un subșir de caractere, de la stânga spre dreapta, dintr-un șir. Funcția Mid preia subșirul aflat la mijlocul șirului.

Funcția Mid returnează un număr specificat de caractere din șirul dat. Se specifică primul caractere de unde începe preluarea și numărul de caractere (numărate spre dreapta) care vor fi preluate.

Sintaxa funcției Mid este:

Mid(string, start[, length])

Iată elementele sintaxei:

  • Ca și la funcțiile Left și Right, argumentul string poate fi orice expresie pentru șiruri. Mid returnează Null dacă string nu conține date.
  • start este un număr care specifică de la al câtelea caracter string se începe preluarea și length specifică câte caractere se vor prelua. Dacă start este mai mare decât numărul total de caractere din string, VBA returnează șirul de lungime zero. În cod, un șir gol este scris ca două ghilimele duble, fără nimic între ele: strState = "".
  • length este o expresie numerică opțională care specifică numărul de caractere ce vor fi returnate.

Dacă se omite length sau se folosește un argument length mai mare decât numărul de caractere rămase din string, VBA returnează toate caracterele începând de la poziția start până la sfârșitul șirului string, iar length poate fi un număr sau o expresie al cărei rezultat este un număr.

Folosind exemplul cu numărul de telefon, funcția se poate folosi Mid pentru a prelua zona din mijloc a numărului (de exemplu, pentru a extrage 555 din șirul 5105551212), astfel:

Dim strPhone As String
strPhone = "5105551212"
MsgBox Mid(strPhone, 4, 3)

Această comandă va afișa trei caractere preluate din variabila strPhone, începând cu al patrulea caracter.

Scenariu din lumea reală

Pentru a nu forța utilizatorii să folosească un anumit format, se poate accepta o varietate de formate.

De multe ori, programatorii, fără motiv, îngreunează lucrul utilizatorilor. Sunt saituri web în care numărul de telefon trebuie introdus într-un anumit format – de exemplu xxx-xxx-xxxx sau (xxx) xxx-xxxx sau doar numere, fără spații.

De ce? Deoarece programatorul a fost prea leneș să-și petreacă câteva minute în plus scriind un cod prietenos care să permită o varietate de intrări.

Oamenii își notează numărul de telefon în moduri diferite. Unii îl scriu în felul următor: (xxx) xxx-xxxx; alții preferă variații precum xxx xxx-xxxx. Instrucțiunile care spun "nu folosiți liniuțe" sau "trebuie să utilizați cratime"? se datorează programatorului care nu dorește să scrie cod suplimentar care să facă față diverselor moduri de introducere. În schimb, viața utilizatorilor poate fi făcută mai ușoară prin scrierea unui mic cod suplimentar pentru a modifica diferite formate tipice în ceea ce așteaptă programul. Astfel se evită forțarea utilizatorilor să furnizeze date "la fel".

Se poate scrie un cod care testează ce a introdus utilizatorul dar, de asemenea, se poate modifica acea intrare în orice format de care este nevoie. Iată câteva soluții ușoare:

Funcția InStr se folosește pentru a verifica dacă există paranteze sau cratime. De asemenea, funcția Mid se poate folosi pentru a extrage doar valorile numerice din șir, ignorând spațiile goale sau caractere non-numerice introduse de utilizator. Obiectivul programului este de a obține 5105551212. După extragerea cifrelor, se poate afișa un mesaj de eroare util dacă utilizatorul a introdus mai puțin de 10 cifre. În acest caz trebuie să se ceară utilizatorului mai multe informații.

Cu ajutorul funcției Len se poate vedea dacă sunt 10 cifre. Dacă nu, utilizatorului i se transmite un mesaj care îl anunță că nu a introdus numărul corect de cifre și este rugat să reintroducă numărul de telefon deoarece nu sunt suficiente (sau sunt prea multe) cifre.

Mesajul de eroare ar trebui să afișeze și cifrele introduse de utilizatorul, astfel încât să poată vedea problema.

De reținut: Codul trebuie să accepte mai multe variații previzibile ale intrărilor de la utilizatori. Nu trebuie respinsă intrarea utilizatorilor doar pentru că acea intrare este scrisă într-un mod diferit de cel al bazei de date sau al codului.

La urma urmei, se pierde timpul a mii de utilizatori în loc să se facă o modificare suplimentară în cod.

Mai sus am prezentat cum se extrage un substring folosind funcția Mid, dar această funcție are și o altă utilizare. De asemenea, funcția Mid se poate folosi pentru a găsi locația unui caracter dintr-un șir.

În codul următor, Do Until... Loop merge înapoi prin șirul strFilename (care conține proprietatea FullName a șablonului atașat la documentul activ din Word) până când ajunge la prima întoarcere (\), stocând poziția de caractere rezultată în variabila întreg intLen. Caseta de mesaj afișează atunci acea parte a strFilename din dreapta (determinată prin scăderea intLen din lungimea strFilename) - numele șablonului atașat fără calea sa:

Dim strFilename As String, intLen As Integer 
strFilename = ActiveDocument.AttachedTemplate.FullName 
MsgBox strFilename
intLen = Len(strFilename)
Do Until Mid(strFilename, intLen, 1) = "\" 
intLen = intLen - 1
Loop
MsgBox Right(strFilename, Len(strFilename) - intLen)

Acest exemplu este mai mult ilustrativ decât realist din două motive: în primul rând, numele șablonului folosit se poate obține mai ușor cu proprietatea Nume în locul proprietății FullName. În al doilea rând, există o funcție numită InStrRev care returnează poziția unui șir din alt șir, mergând înapoi prin el.