3. Utilizarea Message box și Input box În Excel VBA există multe funcţii predefinite (built-in) disponibile pe care le putem folosi pentru a eficientiza programele VBA. Printre aceste funcții, există două funcții foarte importante și anume caseta de mesaj (Message box) și caseta de intrare (Input box ). Aceste două funcții sunt utile, deoarece ele fac programul VBA mult mai interactiv. Caseta de intrare permite utilizatorului să introducă datele în timp ce caseta de mesaj afișează date ieșire sau informații pentru utilizator.
Funcția MsgBox () Obiectivul funcției MsgBox este de a produce o casetă mesaj de tip pop-up și de a cere utilizatorului să facă clic pe un buton de comandă înainte de a continua. Formatul general al casetei de mesaj este următorul: yourMsg=MsgBox(Prompt, Style Value, Title) Primul argument, Prompt, afișează un mesaj în caseta de mesaj. Style Value determină ce tip de buton de comandă va apărea în caseta de mesaj. Tabelul 3.1 prezintă butoanele de comandă care pot fi afișate. Argumentul Title
Tabelul 3.1: Style S tyle Values (V (Valori alori pentru stil) și butoanele de comandă
Style
Nume Constanta
Buton Afisat
0
vbOkOnly
Ok button
1
vbOkCancel
Ok and Cancel buttons
2
vbAbortRetryIgnore
Abort, Retry and Ignore buttons.
3
vbYesNoCan vbYesNoCancel cel
Yes, No and Cancel buttons
4
vbYesNo vbYesNo
Yes and No buttons
5
vbRetryCancel
Retry and Cancel buttons
Putem folosi Named Constant (denumirea constantelor) în locul valorilor numerice pentru al doilea argument pentru a face programele mai ușor de citit. De fapt, VBA va afișa automat o listă de “Named Constant” în cazul în care puteți selecta una dintre ele. De exemplu, yourMsg=MsgBox("Click OK to Proceed", 1, "Startup Menu")
și yourMsg=Msg("Click OK to Proceed ”, vbOkCancel, "Startup Menu") sunt identice. yourMsg este o variabilă care reține valorile care sunt returnate de funcția MsgBox(). Valorile sunt determinate de butonul apăsat de utilizator. Trebuie să fie declarat ca tip de date Integer în procedură sau în secțiunea declarații generale.
Tabelul 3.2 prezintă valorile, denumirea constantelor (Named Constant ) și butoanele corespunzătoare.
Value
Named Constant
Button Clicked
1
vbOk
Ok button
2
vbCancel
Cancel button
3
vbAbort
Abort button
4
vbRetry
Retry button
5
vbIgnore
Ignore button
6
vbYes
Yes button
7
vbNo
No button
Tabel 3.2: Valorile Returnate și Butoanele de Comand ă
Exemplul 3.1
În acest exemplu, mesajul existent în celula (1,2) "Primul tău program VBA (Your first VBA program)" va fi afișat în caseta de mesaj. Deoarece nu se adaugă nici un nume de constanta se va afișa doar mesajul și butonul "OK", așa cum se arată în Figura 3.1 Private Sub CommandButton1_Click() Dim YourMsg As String Cells(1, 2) = "Your first VBA program" YourMsg = Cells(1, 2) MsgBox YourMsg End Sub
Figura 3.1: Caseta de mesaj ”Message box” cu buton OK
Exemplul 3.2
În acest exemplu, se adaugă constanta denumita vbYesNoCancel ca al doilea argument, astfel încât caseta de mesaj va afişa butoanele Yes, No și Cancel, aşa cum se arată în figura 3.2. Private Sub CommandButton1_Click() Dim YourMsg As String Cells(1, 2) = "Your first VBA program" YourMsg = Cells(1, 2) MsgBox YourMsg, vbYesNoCancel End Sub
Figura 3.2: Message box cu butoanele Yes, No și Cancel
Pentru a face caseta de mesaj să arate mai sofisticat, există posibilitatea de a adăuga o pictogramă de lângă mesajul. Există patru tipuri de pictograme disponibile în VBE, aşa cum se arată în Tabelul 3.3.
Value
Named Constant
16
vbCritical
32
vbQuestion
48
vbExclamation
64
vbInformation Tabel 3.3 Pictograme disponibile în Message box
Icon
Exemplul 3.3 Codul din acest exemplu este în esență același ca și în exemplul 3.2, dar este adăugată ca al treilea argument, constanta cu numele vbExclamation. Cele două constante de nume pot fi unite cu ajutorul semnul "+". Caseta de mesaj va afișa acum pictograma cu semnul de exclamare, așa cum se arată în Figura 3.3. Private Sub CommandButton1_Click() Dim YourMsg As String Cells(1, 2) = "Your first VBA program" YourMsg = Cells(1, 2) MsgBox YourMsg, vbYesNoCancel + vbExclamation End Sub
Figura 3.3: Message box cu butoanele Yes, No, Cancel și pictograma
Se poate chiar semnala care butonul este apăsat de utilizator pe baza valorilor returnate prezentate în tabelul 3.2.
În Exemplul 3.4 este folosită structura condiţională If .... Then ... Else. (se va explica mai târziu)
Exemplul 3.4 Private Sub CommandButton1_Click() Dim testMsg As Integer testMsg = MsgBox(" Apasa pentru un test", vbYesNoCancel + vbExclamation, " Mesaj Test") If testMsg = 6 Then Cells(1,1).Value = " S-a apasat butonul Yes" ElseIf testMsg = 7 Then Cells(1,1).Value = " S-a apasat butonul No " Else Cells(1,1).Value = " S-a apasat Cancel " End If End Sub
3.2 Funcţia InputBox () O casetă InputBox() este o funcție care afișează o casetă de intrare și în care utilizatorul poate introduce o valoare sau un mesaj în formă de text. Formatul este: myMessage=InputBox(Prompt, Title, default_text, x-position, y-position) Variabila myMessage apartine tipului de date variant, dar de obicei aceasta este declarată ca un șir de caractere, care primește mesajul introdus de către utilizatori. Argumentele au următoarele semnificații:
Prompt
Mesajul afişat în inputbox (caseta de intrare ).
Title
Titlul casetei de intrare Textul implicit care apare in câmpul de intrare pe care utilizatorii
default-text
îl utilizează ca o valoare de intrare probabilă sau pe care îl pot eventual schimba cu altă valoare
x-position and y-position
Poziţia sau coordonatele casetei de intrare
Exemplul 3.5
Ecranul afișat de programul din exemplu 3.5 este prezentat în Figura 3.4 Private Sub CommandButton1_Click() Dim userMsg As String userMsg = InputBox(" Care este mesajul dumneavoastră?", " Formular de introducere date ", "Introduceti mesajul aici", 500, 700) Cells(1,1).Value=userMsg End Sub Atunci când utilizatorul face clic pe butonul OK, va apărea o caseta de intrare aşa cum se arată în Figura 3.4. Se observă că titlul casetei de intrare este "Formular de introducere date" și mesajul afişat de prompter este "Care este mesajul dumneavoastră". După ce utilizatorul introduce mesajul și clic pe butonul OK, mesajul va fi afişat în celula A1
Figura 3.4: Caseta de intrare
4. Structura condiţională
If….Then….Else în
Excel VBA
Editorul Visual Basic (VBE) din MS Excel ca și compilatorul Visual Basic de sine stătător, permit utilizarea acelorași comenzi în programare. De exemplu, se poate utiliza structura If ….Then….Else pentru a controla fluxul unui program care execută o acțiune bazată pe anumite condiții. Pentru a controla fluxul programului, trebuie să se utilizeze operatorii condiționali, precum și operatorii logici. 4.1 Operatorii condiționali Pentru a controla fluxul de programul VBA, se pot folosi diverși operatori condiționali. Practic, ei seamănă cu operatorii matematici. Operatorii condiționali sunt instrumente foarte puternice, care permit programul VBA să compare valorile datelor și să decidă apoi ce măsuri să ia. De exemplu, se poate decide dacă să execute sau să anuleze execuția unui program. Aceşti operatori sunt prezentați în tabelul 4.1.
Tabel 4.1: Operatori Condiţionali
Operator
Semnificația
=
Egal cu
>
Mai mult decât
<
Mai puţin ca
>=
Mai mare si egal cu
<=
Mai mic si egal cu
<>
Diferit de
Cu operatorii de mai sus se pot compara, de asemenea, şiruri de caractere. Se respectă însă regulile: literele majuscule sunt mai mici decât literele minuscule, "A" <"B" <"C" <"D"< … <"Z", iar cifrele sunt mai mici decât literele.
4.3 Utilizarea structurii If...Then...Elseif …Else cu operatori Pentru a controla în mod eficient fluxul unui program VBA, se poate folosi structura If.....Then.....Elseif ….Else, împreună cu operatorii condiționali și operatorii logici. Formatul general pentru structura If...Then...Elseif …Else este: If conditii Then Expresii VB Elseif Expresii VB Else Expresii VB End If Toate structurile de tip If...Then...Else trebuie sa se termine cu End If . Uneori nu este necesar sa se utilizeze Else sau Elseif.
Exemplu 4.1 Private Sub CommandButton1_Click() Dim firstnum, secondnum As Single firstnum = Cells(1, 1).Value secondnum = Cells(1, 2).Value If firstnum > secondnum Then MsgBox " The first number is greater than the second number" Else If firstnum < secondnum Then MsgBox " The first number is less than the second number" Else MsgBox " The two numbers are equal " End If End If End Sub În acest exemplu, programul compară valorile din celulele 1, 1 (A1) și celule 1, 2 (B1) și afișează comentariul adecvat într-o casetă de mesaj. De exemplu, dacă primul număr este de mai mic decât al doilea număr, se va afișa mesajul " The first number is less than the second number ", așa cum se arată în Figura 4.1.
Figura 4.1
Exemplul 4.2 În acest exemplu, programul VBA convertește sistemul de notare cu10 puncte în sistemul de notare cu grade A – F, demonstrând utilizarea liniilor de program If …Then…Elseif.
Private Sub CommandButton1_Click() Dim mark As Integer Dim grade As String Randomize Timer mark = Int(Rnd * 10) Cells(1, 1).Value = mark If mark < 2 And mark >= 0 Then grade = "F" Cells(2, 1).Value = grade ElseIf mark < 3 And mark >= 2 Then grade = "E" Cells(2, 1).Value = grade ElseIf mark < 4 And mark >= 3 Then grade = "D" Cells(2, 1).Value = grade ElseIf mark < 5 And mark >= 4 Then grade = "C-"
Cells(2, 1).Value = grade ElseIf mark < 6 And mark >= 5 Then grade = "C" Cells(2, 1).Value = grade ElseIf mark < 7 And mark >= 6 Then grade = "C+" Cells(2, 1).Value = grade ElseIf mark < 8 And mark >= 7 Then grade = "B" Cells(2, 1).Value = grade ElseIf mark <= 10 And mark > -8 Then grade = "A" Cells(2, 1).Value = grade End If End Sub
Funcțiile Rnd și Randomize Timer sunt utilizate pentru a genera numere aleatoare. În scopul de a genera numere întregi aleatoare între 0 și 10, s-au combinat funcțiile Int și Rnd, Int(Rnd * 10). De exemplu, atunci când Rnd = 0.654, atunci Rnd * 10 = 6.54, și Int (6.54) = 6. Utilizarea liniei de program cells(1,1).Value=mark va plasa valoarea de 6 în celula (1,1). Pe baza valorii din celula A1, folosind structura If...Then...Elseif …Else se poate afișa gradul corespunzătoar în celula A2. Deci, atunci când se face clic pe butonul de
comandă, acesta va genera un număr aleator între 1 și 10 și îl plasează în celulele A1 și gradul corespunzător în celula A2. Rezultatul rulării programului este prezentat în figura 4.2.
Figura 4.2.
Exemplu 4.3
Acest exemplu demonstr ează utilizarea operatorului Not. Private Sub CommandButton1_Click() Dim x, y As Integer x = Int(Rnd * 10) + 1 y = x Mod 2 If Not y = 0 Then MsgBox " x este număr impar " Else MsgBox " x este număr par " End If End Sub In program, funcţia Rnd este o funcţie aleatoare care produce numere aleatoare cuprinse intre 0 and 1. Astfel Rnd*10 generează un număr aleatoriu cuprins intre 0 and 9. Int este o funcţie VBA care returnează un întreg. De aceea Int(Rnd*10)+1 generează numere aleatoare cuprinse între 1 and 10. Mod este un operator care returnează restul împărţirii a doua numere întregi . Dacă x este un număr par, x Mod 2 va genera valoarea zero. Bazat pe această logică, dacă x Mod 2 este diferit de zero, atunci x este un număr impar, altfel este un număr par.
Exemplu de utilizarea operatorului
Not