Excel VBA-Userform (14 Rad sa stringovima)
📝 Pored numeričkih podataka, Excel vrlo često radi sa stringovima i poseduje veliki broj funkcija za njihovu obradu. VBA takođe poseduje veliki broj korisnih funkcija za obradu stringova. Već smo videli da VBA može da radi stringovima fiksne i promenljive dužine. Ukoliko se u deklaraciji stringa navede i njegova dužina, dobijamo string fiksne dužine. U suprotnom, ako se ne navede dužina, dobijamo string promenljive dužine. Navodimo primer deklaracije stringa fiksne dužine S1, koji ima 40 karaktera, i stringa S2 promenljive dužine.
Dim S1 as String * 40
Dim S2 as String
U tabeli ispod je dat spisak korisnih funkcija za manipulaciju stringovima u VBA.
Funkcija | Opis |
---|---|
Asc(string) | Vraća ANSI kod prvog karaktera u stringu string. Primer: Asc(“A12”) vraća broj 65. |
AscW(string) | Vraća Unicode kod prvog karaktera u stringustring. Primer: AscW(“Žarko”) vraća broj 381. |
Chr(kodkar) | Vraća karakter koji odgovara ANSI kodu kodkar. Primer: Chr(65) vraća karakter “A”. |
ChrW(kodkar) | Vraća karakter koji odgovara Unicode kodu kodkar. Primer: ChrW(382) vraća karakter “ž”. |
Len(string) | Vraća broj karaktera u stringu string. Primer: Len(“žabac&komarac”) vraća broj 13. |
Str(broj) | Konvertuje broj broj u string. Primer: Str(412.41) vraća string “412.41”. |
Val(string) | Vraća broj sadržan u stringu string. Čitanje broja započinje s leva i završava se kad se naiđe na prvi nenumerički karakter. Funkcija Val prepoznaje tačku kao decimalni separator, ali ne i zarez, ignoriše tabove i blanko znake. Primer: Val(“301*44”) vraća broj 301. Val(“301.1*44”) vraća broj 301.1 Val(“301..1*44”) vraća broj 301 |
InStr(string1,string2) | Vraća poziciju prve pojave stringa string1 ustringu string2. Primer: InStr(“Blagdan”,”dan”) vraća broj 5. |
LCase(string) | Vraća string kod koga su sva velika slova konvertovana u mala, a ostali karakteri su neizmenjeni. Primer: LCase(“#A1G2”) vraća “#a1g2” |
UCase(string) | Vraća string kod koga su sva mala slova konvertovana u velika, a ostali karakteri su neizmenjeni. Primer: UCase(“*b1c2”) vraća “*B1C2” |
Left(string,duzina) | Vraća string koji se sastoji od duzina karaktera stringa string gledano sa leva. Primer: Left(“Dobar dan”,4) vraća “Doba” |
Right(string,duzina) | Vraća string koji se sastoji od duzina karaktera stringa string gledano sa desna. Primer: Right(“Dobar dan”,4) vraća ” dan” |
Mid(string,start,duzina) | Vraća string koji se sastoji od duzina karaktera stringa string počev od karaktera čija je pozicija start. duzina je opcion argument i ako se ne navede ide se do kraja stringa. Primer: Mid(“Program”,2,4) vraća “rogr” Mid(“Program”,2) vraća “rogram” |
LTrim(string) | Eliminiše spejsove kojima počinje string string. Primer: LTrim(” Makro”) vraća “Makro” |
RTrim(string) | Eliminiše spejsove kojima se završava stringstring. Primer: LTrim(“Makro “) vraća “Makro” |
Trim(string) | Eliminiše spejsove kojima počinje i završava se string string. Primer: Trim(” Makro “) vraća “Makro” |
StrComp(string1,string2,nacin) | Poredi stringove string1 i string2 i vraća 0 ako su jednaki, -1 ako je string1 manji od string2 i 1 ako je string2 manji od string1 . nacin predstavlja način poređenja stringova i može biti binaran (nacin=0 fl pravi se razlika između velikih i malih slova) i tekstualan (nacin=1 fl ne pravi se razlika između velikih i malih slova). Ako se nacin ne navede, podrazumevano je binarno poređenje. Primer: StrComp(“VBA”,”vba”,0) vraća -1 StrComp(“VBA”,”vba”,1) vraća 0 |
Za sve gore pomenute funkcije koje vraćaju string, vraćeni string je tipa Variant. Ukoliko želimo da string bude tipa String, potrebno je na ime funkcije nadovezati karakter $. Tako će, na primer, ekvivalent funkcije Lcase koji vraća String tip biti Lcase$.
Za očekivati je da se, pošto string u suštini predstavlja niz karaktera, pojedinim karakterima stringa može pristupiti navođenjem pozicije karaktera u malim zagradama, kao što se radi kod numeričkih nizova. Međutim, kod VBA to nije slučaj. Pristupanje karakterima stringa, kao i njihova izmena, se vrši funkcijom Mid, kao što je prikazano u prethodnoj tabeli. Na primer, instrukcijom
Mid(S,1,3) = "123"
bi se zamenila prva tri karaktera stringa S sa stringom “123”.
Osim sa funkcijom StrComp, stringovi se mogu porediti i operatorom ispitivanja jednakosti =. Ovaj operator vrši binarno poređenje. To je podrazumevani način poređenja stringova sa ovim operatorom, kao što je kod funkcije StrComp. Podrazumevani način poređenja stringova se može promeniti ako se na vrhu modula navede
Option Compare Text
čime podrazumevani način postaje tekstualni. Brisanjem ovog iskaza ili pomoću
Option Compare Binary
podrazumevani način opet postaje binarni.
VBA dozvoljava vrlo jednostavno nadovezivanje (konkatenaciju) stringova korišćenjem operatora + ili &. Tako će izraz
S = "Black" + "White"
rezultovati u stringu “BlackWhite”. Treba biti oprezan kada se radi sa Variant promenljivim jer Variant podaci menjaju tip u zavisnosti od toga šta radimo sa njima. Uzmimo, na primer, string S u koji je upisan string “105” i posmatrajmo sledeće dve VBA instrukcije:
S = 2 * S
S = S + S
Nakon prve instrukcije bi S imalo numeričku vrednost 210, a nakon druge instrukcije S bi bio string “105105”. Pri radu sa stringovima, operator + uvek vrši nadovezivanje. Međutim, ako radite sa Variant promenljivom u koju je prvobitno upisan string, a nakon toga se promeni tip podatka, operator + više neće vršiti nadovezivanje.
Rad sa slovima š, đ, č, ć i ž
VBE ne dozvoljava unos naših slova š, đ, č, ć i ž, malih i velikih. Postavlja se pitanje na koji način raditi sa tim slovima. Odgovor je – pomoću funkcije ChrW. Jedino što treba da znamo jesu Unicode kodovi naših slova i oni su dati u tabeli ispod.
Na primer, string “Šećer” bi se definisao na sledeći način:
S = ChrW(352) + "e" + ChrW(263) + "er"
Ipak, na ovaj način ne možemo prikazati ova slova u korisničkim formama. Da bi to uradili, sistemski moramo podesiti opciju Language for non-Unicode programs na Serbian (Latin). Ova opcija se nalazi na tabu Administrative prozora Regional and Language Options kod Windows 7. Sa ovom opcijom mi čak omogućavamo unos naših slova u prozor VBE-a, što znači da prva rečenica ovog poglavlja nije ispravna 🙂 .
Userform1
' ======== ANSI Karakteri ========
Private Sub btn_Page1_kar_Click()
MsgBox Chr(Val(tb_Page1_kar.Text))
End Sub
Private Sub btn_Page1_str_Click()
MsgBox Asc(tb_Page1_str.Text)
End Sub
' ======== Unicode Karakteri ========
Private Sub btn_Page2_kar_Click()
MsgBox ChrW(Val(tb_Page2_kar.Text))
End Sub
Private Sub btn_Page2_str_Click()
MsgBox AscW(tb_Page2_str.Text)
End Sub
' ======== Broj slova u stringu ========
Private Sub btn_Page3_str_Click()
MsgBox Len(tb_Page3_str.Text)
End Sub
' ======== Broj u String / String u Broj ========
Private Sub btn_Page4_br_Click()
MsgBox Str(tb_Page4_br.Text)
End Sub
Private Sub btn_Page4_str_Click()
MsgBox Val(tb_Page4_str.Text)
End Sub
' ======== String u stringu -> Broj ========
Private Sub btn_Page5_str_Click()
MsgBox InStr(tb_Page5_str1.Text, tb_Page5_str2.Text)
End Sub
' ======== Velika / Mala SLOVA ========
Private Sub btn_Page6_str_L_Click()
MsgBox LCase(tb_Page6_str.Text)
End Sub
Private Sub btn_Page6_str_U_Click()
MsgBox UCase(tb_Page6_str.Text)
End Sub
' ======== Levo - Sredina - Desno ========
Private Sub btn_Page7_strL_Click()
MsgBox Left(tb_Page7_strL.Text, Val(tb_Page7_str_Duzina.Text))
End Sub
Private Sub btn_Page7_strR_Click()
MsgBox Right(tb_Page7_strR.Text, Val(tb_Page7_str_Duzina.Text))
End Sub
Private Sub btn_Page7_strM_Click()
MsgBox Mid(tb_Page7_strM.Text, Val(tb_Page7_str_Start.Text), Val(tb_Page7_str_Duzina.Text))
End Sub
' ======== TRIM ========
Private Sub btn_Page8_strL_Click()
MsgBox "-" & LTrim(tb_Page8_str.Text) & "-"
End Sub
Private Sub btn_Page8_strR_Click()
MsgBox "-" & RTrim(tb_Page8_str.Text) & "-"
End Sub
Private Sub btn_Page8_strT_Click()
MsgBox "-" & Trim(tb_Page8_str.Text) & "-"
End Sub
' ======== Poredjenje Stringova ========
Private Sub btn_Page9_str_Click()
MsgBox StrComp(tb_Page9_str1.Text, tb_Page9_str2.Text, Val(tb_Page9_str_Nacin.Text))
End Sub
Userform2 (Slova)
Private Sub UserForm_Initialize()
lbl_heder.Caption = "Moja Re" & ChrW(mojaSlova("ch"))
lbl_TipText.Caption = _
"Sh - " & ChrW(352) & vbNewLine & _
"Dj - " & ChrW(272) & vbNewLine & _
"Ch - " & ChrW(268) & vbNewLine & _
"C - " & ChrW(262) & vbNewLine & _
"Z - " & ChrW(381) & vbNewLine & _
vbNewLine & _
"sh - " & ChrW(353) & vbNewLine & _
"dj - " & ChrW(273) & vbNewLine & _
"ch - " & ChrW(269) & vbNewLine & _
"c - " & ChrW(263) & vbNewLine & _
"z - " & ChrW(382) & vbNewLine
End Sub
Private Sub btn_Click()
On Error GoTo ErrorHandler
lbl_Display01.Caption = ChrW(mojaSlova(tb_Slovo.Text))
lbl_Display02.Caption = AscW(lbl_Display01.Caption)
Exit Sub
ErrorHandler:
MsgBox "Nepravilno slovo!"
lbl_Display01.Caption = "?"
lbl_Display02.Caption = "000"
End Sub
'Slovo Š Ð C C Ž š d c c ž
'Kod 352 272 268 262 381 353 273 269 263 382
Public Function mojaSlova(slovo As String) As Integer
If slovo = "Sh" Then
mojaSlova = 352
ElseIf slovo = "Dj" Then
mojaSlova = 272
ElseIf slovo = "Ch" Then
mojaSlova = 268
ElseIf slovo = "C" Then
mojaSlova = 262
ElseIf slovo = "Z" Then
mojaSlova = 381
ElseIf slovo = "sh" Then
mojaSlova = 353
ElseIf slovo = "dj" Then
mojaSlova = 273
ElseIf slovo = "ch" Then
mojaSlova = 269
ElseIf slovo = "c" Then
mojaSlova = 263
ElseIf slovo = "z" Then
mojaSlova = 382
End If
End Function
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
lbl_TipText.Visible = False
End Sub
Private Sub tb_Slovo_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
lbl_TipText.Visible = True
End Sub
Excel dokument iz ovog videa možete preuzeti na linku ispod.