Documente Academic
Documente Profesional
Documente Cultură
Emil Cosma 1
VBA
Cuprins
O introducere în programare3
Macrocomenzi5
Înregistrarea unei macrocomenzi VBA5
Rezumat10
Editorul VBA11
Lansarea editorului VBA11
Mediul de editare VBA11
Module VBA13
Proceduri13
Identificarea modulelor15
Rularea modulelor16
Save şi Open pentru aplicaţiile Office şi modulele asociate16
Sistemul de asistenţă la scrierea codului16
Formulare VBA18
Crearea unui formular18
Rularea unui formular18
Proprietăţile formularului19
Rezumat21
Module VBA51
Variabile locale (private) 51
Variabile publice (globale) 51
Variabile private52
Transmiterea argumentelor prin valoare şi prin referinţă54
Funcţii recursive55
Aplicaţii56
Formulare VBA60
Formulare (form-uri) 60
Proprietăţi şi metode61
Proprietatea Caption62
Proprietatea StartUpPosition63
Proprietatea Height şi Width63
Proprietăţile ForeColor şi BackColor64
Utilizarea controalelor64
65
65
68
70
72
73
74
77
79
80
Modificarea proprietăţilor din cod81
Aplicaţii86
O introducere în programare
Există multe limbaje de programare: Pascal, C, Fortran, Oracle, FoxPro, Java, Basic.
La fel, există multe versiuni ale limbajului Basic. Versiunile mai vechi de DOS (dinainte de
5.0) aveau o versiune de Basic inclusă, numită GW-Basic. Versiunile mai noi de DOS
includ QBasic. Toate aceste pachete de programe permit crearea programelor de
calculator cu BASIC, dar ele implementează limbajul BASIC puţin diferit. În Windows
este implementat limbajul Visual Basic care permite scrierea unor aplicaţii Windows.
Adesea, numele limbajului BASIC este ortografiat cu litere mici (Basic). Cu toate
acestea, BASIC şi-a făcut de fapt debutul ca un acronim, reprezentând prescurtarea de
la Beginner's All-purpose Symbolic Instruction Code (codul de instrucţiuni simbolice
generale pentru începători). Ca limbaj de programare, Visual Basic este un dialect BASIC.
El este logic, seamănă cu limba engleză şi este uşor de înţeles. Fiind un mediu de
programare vizuală, acesta permite programatorilor să asambleze vizual programul,
într-o fereastră, folosind componentele dintr-o cutie cu instrumente (toolbox) utile
pentru realizarea aplicaţiilor. Printre aceste instrumente se includ: un editor de texte
pentru scrierea programului sursă, un compilator pentru limbaj şi alte facilităţi pentru
testarea şi verificarea aplicaţiei (de natura depanatoarelor).
Prof. univ. Emil Cosma 4 O introducere în programare
Simbol Semnificaţie
Observaţii
Indicaţii, menţiuni
Aplicaţii
Rezumat
Un calculator poate face numai ceea ce un om îl instruieşte să facă.
Un program de calculator este o listă de comenzi pe care calculatorul le
urmăreşte de la început până la sfârşit.
Există mai multe limbaje de calculator. Limbajul tratat în continuare este o formă
de BASIC.
Un program BASIC trebuie să fie convertit în limbaj maşină, înainte de a putea fi
înţeles de către calculator. Compilatorul din Visual Basic face această conversie.
Scrierea unui program seamănă mult cu scrierea unui document text. Trebuie
scrise mai multe „schiţe" înainte ca programul să fie complet.
Prof. univ. Emil Cosma 5 Macrocomenzi
Macrocomenzi
Limbajul Visual Basic for Applications (VBA), integrat în editoarele din familia
Microsoft Office (Word, Excel, PowerPoint, Acces, Outlook), constituie un mediu de
programare puternic, asemănător celui din Visual Studio (Visual Basic, C++, Java,
etc.). Acest limbaj de programare poate fi utilizat pentru:
Mediul de programare abordat este Visual Basic for Applications inclus în Microsoft
Office 2007 dar, informaţiile sunt, în general, valabile şi pentru suita Office 2003.
Acesta conţine un instrument complet de dezvoltare VBA, numit Visual Basic
Editor.
În Word, Excel sau PowerPoint (celelalte programe din pachetul Office nu posedă
funcţii de înregistrare ale macrocomenzilor) înregistrarea unei macrocomenzi începe
prin stabilirea unui nume pentru macrocomandă (cum ar fi Macro1), dar acest nume se
poate schimba cu orice alt nume, în caseta de text Macro name:
Prof. univ. Emil Cosma 6 Macrocomenzi
numele nu pot avea mai mult de 255 de caractere, dar este recomandată
specificarea unor nume scurte, uşor accesibile;
primul caracter trebuie să fie o literă sau o liniuţă de subliniere (_);
în nume nu sunt permise spaţiile sau punctele.
↓ Exemple______________________________________________________________________________________________
______________________________________________________________________________________________Exemple ↑
• Deoarece modulul de înregistrare a macrocomenzilor memorează toate acţiunile
utilizatorului, este indicată neefectuarea unor comenzi neesenţiale pe parcursul
înregistrării. Intrarea în starea ”Recording” este marcată în bara de stare a
programului Office. Acest buton va fi acţionat în momentul terminării
înregistrării:
↓ Exemplu______________________________________________________________________________________________
Adăugarea (Word) unui buton de rulare a unei macrocomenzi, în Quick Access
Toolbar:
se acţionează butonul .
din fereastra Modify Button se selectează un simbol (de
exemplu ):
• Dacă, în bara de mesaje (Message Bar), este notificat faptul că executarea
macrocomenzilor nu este permisă, din motive de securitate,
↓ Exemplu______________________________________________________________________________________________
se deschide în editare un document (Excel);
se poziţionează cursorul (de exemplu în celula B2);
se iniţiază înregistrarea unei macrocomenzi, ;
se stabileşte numele macrocomenzii (aici Data) care va fi asociată cu combinaţia
de taste Ctrl +d ;
în celula curentă se introduce funcţia TODAY():
Macrocomenzile sunt asociate documentelor Office. Ele pot fi salvate împreună cu
aceste documente: din lista Save as type, se selectează tipul de fişier ce conţine
menţiunea Macro-Enabled.
O macrocomandă reprezintă o listă de instrucţiuni scrise în limbajul de
programare Basic, varianta VBA.
VBA este un mediu de programare puternic, asemănător celui din Visual Studio
(Visual Basic, C++, Java, etc.)
Instrucţiunile unei macrocomenzi pot fi editate - se pot modifica, şterge
instrucţiunile Basic existente, se pot adăuga altele noi.
Macrocomenzile pot fi rulate de câte ori este nevoie.
Din motive de securitate, la lansarea aplicaţiilor Office, se notifică existenţa
macrocomenzilor, executarea lor nefiind permisă în mod implicit.
Prof. univ. Emil Cosma 11 Editorul VBA
Editorul VBA
Programele din suita Office au asociate un editor VBA numit VBE care facilitează
scrierea şi editarea unor secvenţe program în limbajul Visual Basic (în cercurile
programatorilor profesionişti, Visual Basic Editor este numit mediu integrat de dezvoltare
sau IDE). VBE transpune acţiunile utilizatorului în instrucţiuni Basic sub forma
macrocomenzilor, prin procedeul de înregistrare. Se pot edita însă şi macrocomenzi
proprii, fie pornind de la zero, fie utilizând ca punct de plecare o macrocomandă
înregistrată.
acţionarea butonului (Visual Basic) din tab-ul Developer. Acest tab nu este
vizualizat implicit, dar poate fi activat:
clic pe butonul Microsoft Office ,
Options ,
Popular,
.
MenuBar
ToolBar
Fereastra
Project
Fereastra
de cod
Fereastra
Properties
Fereastra de cod. Chiar dacă limbajul Visual Basic permite construirea unei părţi
din proiect, prin procedeul „Recording”, este necesară şi scrierea codului sursă al
programului. Programele conţin linii de comenzi care se introduc în fereastra de
cod.
Prof. univ. Emil Cosma 13 Editorul VBA
Module VBA
Proceduri
Un modul este compus din una sau mai multe unităţi de bază numite proceduri.
Există două tipuri de proceduri:
Definiţia sintactică este (Exit Sub este opţional şi reprezintă punctul de ieşire
din procedură, dacă lipseşte procedura se termină la End Sub):
↓ Exemple______________________________________________________________________________________________
Procedura apelantă este ex1(), iar cea apelată este ex2() – nu au argumente:
Procedura apelantă este ex1(), iar cea apelată este ex2() – are 2 argumente:
______________________________________________________________________________________________Exemple ↑
Proceduri Function
Între lista parametrilor de apel şi lista argumentelor funcţiei trebuie să existe
o corespondenţă biunivocă, determinată de ordinea argumentelor în listă.
Exit Function este opţional şi reprezintă punctul de ieşire din procedură - dacă
lipseşte procedura se termină la End Function.
Argumentul As, opţional, impune tipul valorii returnate la terminarea funcţiei.
↓ Exemple______________________________________________________________________________________________
Din procedura Sub ex1() este apelată procedura Function ex2() – funcţie fără nici
un argument:
O funcţie ValoareTva, pentru calculul valorii TVA, poate fi definită într-un modul:
______________________________________________________________________________________________Exemple ↑
Identificarea modulelor
Atunci când se introduce un modul nou într-un proiect, VBA îi atribuie un nume
generic, cum ar fi Module1, Module2, …. Practic este necesară utilizarea unor nume
sugestive pentru ca, prin acestea, modulele să poată fi diferenţiate. Pentru a schimba
numele unui modul:
Rularea modulelor
Modulele includ o secvenţă de instrucţiuni Basic care trebuie să fie corecte din
punct de vedere sintactic. Detectarea erorilor se poate efectua prin compilare (Debug,
Compile Project).
În aplicaţiile Office există mai multe metode de rulare a modulelor, însă cel mai
des utilizate sunt următoarele două:
În cadrul editorului, se acţionează, de obicei, butonul din ToolBar.
Aceeaşi comanda se poate lansa şi prin meniu: , .
În aplicaţia Office, caseta Macros evidenţiază modulul care poate fi
executat prin clic pe butonul Run. Caseta Macros este vizualizată:
prin tab-ul View, Macros ,
cu Shortcut-ul Alt+F8 (cel mai frecvent).
• Verifică erorile de sintaxă, adică erorile care apar atunci când un cuvânt este
ortografiat greşit, o funcţie este introdusă incorect, etc. VBA semnalează o eroare
de sintaxă, fie afişând o casetă de dialog, fie neafişând cuvântul, în formatul şi
culoarea corespunzătoare.
↓ Exemplu______________________________________________________________________________________________
______________________________________________________________________________________________Exemplu ↑
Prof. univ. Emil Cosma 18 Editorul VBA
Formulare VBA
În Visual Basic Editor crearea unui formular (prin meniu, Insert, sau
utilizând butonul din Toolbar) se realizează în modul de proiectare (design mode).
Formular Caseta cu
instrumente
(Toolbox)
Proprietăţile formularului
↓ Exemplu______________________________________________________________________________________________
Adăugarea unui buton în formular:
se execută clic pe controlul CommandButton şi se trasează în fereastra
formularului
Textul înscris în antetul formularului (UserForm1) se poate modifica
stabilind, de exemplu, proprietatea Caption la valoarea Fereastra mea.
Pentru buton, proprietatea Caption se modifică la valoarea Start:
Atunci când se execută dublu clic pe control, limbajul VBA afişează fereastra
de cod în care sunt incluse şi liniile de cod implicite (procedură). Procedura
Private Sub CommandButton1_ Click() se va executa ori de câte ori
utilizatorul, în faza de execuţie, acţionează butonul (procedura este un
eveniment pe care Windows îl transmite programului spre a fi administrată).
Programatorul poate adăuga propriul lui cod sursă. De exemplu instrucţiunea
MsgBox (”Bun venit in VBA”) spune limbajului VBA să afişeze o
casetă de mesaj:
Prof. univ. Emil Cosma 21 Editorul VBA
______________________________________________________________________________________________Exemplu ↑
VBA se poate lansa dintr-o aplicaţie Office, cel mai adesea utilizând shortcut-ul
Alt+F11.
După lansarea mediului de programare VBA se pot edita module şi formulare noi
sau se pot edita cele existente (stocate împreună cu documentele Office sau
exportate ca fişiere cu extensia .bas).
Fereastra Project Explorer arată modulele şi formularele din proiect. Un proiect are
cel puţin un modul sau un formular.
Pentru a crea o aplicaţie VBA e necesară scrierea codului sursă al programului şi
apoi compilarea programului (Debug, Compile Project) pentru eliminarea
eventualelor erori de sintaxă.
Instrucţiunile programului se introduc în fereastra de cod VBA.
Fereastra Properties afişează atributele unui obiect din proiect.
Caseta de instrumente Toolbox conţine controale care se pot folosi pentru a
realiza interfaţa cu utilizatorul programului.
Se poate construi o interfaţă cu utilizatorul plasând controale din Toolbox pe un
formular.
Se pot redimensiona controalele (şi formularul) trăgând de punctele de
dimensionare ale controalelor, care apar atunci când este selectat controlul.
O modalitate de afişare a ferestrei de cod este executarea unui dublu clic pe
obiectul pentru care se doreşte scrierea codului de program.
Atunci când utilizatorul apasă pe un buton dintr-un formular creat, VBA generează
un eveniment Click. Codul de program care se adaugă la procedura de eveniment
Click a butonului determină ce anume face butonul.
Prof. univ. Emil Cosma 22 Secvenţe de cod VBA
O aplicaţie VBA include unul sau mai multe formulare şi module. Secvenţele de
cod (program sursă), asociate acestora, sunt constituite din linii de program editat în
limbajul de programare Visual Basic. În principiu o linie de program, formată din mai
multe cuvinte care pot fi scrise cu majuscule şi/sau cu minuscule, are două părţi: o
instrucţiune şi unul sau mai multe argumente.
Cuvintele
÷ O linie poate ocupa şi două rânduri, reunite prin spaţiu şi linie de subliniere
( _) la sfârşitul primului rând.
÷ O linie de program poate conţine mai multe instrucţiuni separate prin
:(două puncte), lucru nerecomandabil datorită dificultăţilor de citire a
programului.
÷ Nu este permisă tăierea cuvintelor !
Prof. univ. Emil Cosma 23 Secvenţe de cod VBA
↓ Exemple______________________________________________________________________________________________
Valoare = pret * _
cantitate
este echivalentă cu:
Valoare = pret * cantitate
Valoare = 2 : cantitate = 50
este echivalentă cu:
Valoare = 2
cantitate = 50
______________________________________________________________________________________________Exemple ↑
Comentariile
↓ Exemplu______________________________________________________________________________________________
REM Programator: Parvulescu Andrei
REM Program de calcul al salariilor
'...
REM Aici sunt alte instructiuni
'...
Prof. univ. Emil Cosma 24 Secvenţe de cod VBA
Tipuri de date
Byte 1 0 255
Currency 8 -922.337.203.685.477,5808
Format monetar
922.337.203.685.477,5807
Pentru scrierea valorilor numerice sunt folosite, uneori, literele E sau D. „E"
provine de la „exponent" iar „D" de la „exponent dublă precizie". Prin exponent se
înţelege o putere a lui 10 cu care se înmulţeşte o altă valoare.
Literele E şi e (sau D şi d) sunt utilizate într-o notaţie specială, denumită
ştiinţifică. Notaţia ştiinţifică este o reprezentare prescurtată, utilizată pentru numere
foarte mari sau foarte mici. Se consideră că această notaţie este mai inteligibilă decât
repetarea unui număr mare de zerouri. Convertirea la valoarea reală se poate face
oricând, astfel:
o calculează 10 la puterea dată de numărul care urmează după D sau E;
o valoarea obţinută se înmulţeşte cu numărul care-l precede pe D sau E.
↓ Exemplu______________________________________________________________________________________________
87,972E+6 înseamnă 87,972 * 106 adică 87.972.000.000
______________________________________________________________________________________________Exemplu ↑
Operatori.
Operatorii leagă operanzi de acelaşi tip. Operatorii folosiţi în programele Basic
sunt următorii :
* înmulţire
/ împărţire
\ câtul unei împărţiri cu rest
Mod modulo (restul împărţirii)
^ ridicare la putere
↓ Exemplu______________________________________________________________________________________________
(3 + 2) * (4 + 1) 25
102 / 4 25.5
102 \ 4 25
102 Mod 4 2
______________________________________________________________________________________________Exemplu ↑
Constante şi variabile
÷ Identificatorii de variabile pot conţine litere, cifre şi caracterul de subliniere
(underscore), nu pot să înceapă cu cifre, nu pot conţine spaţii ori alte caractere
speciale.
÷ Este interzisă folosirea unor nume care sunt cuvinte cheie în Basic (de
exemplu, nu se poate defini o variabilă numită sub, dar se poate utiliza
identificatorul sub16)
Constante
↓ Exemplu______________________________________________________________________________________________
Const PI As Double = 3.1416, Raza As Integer = 25
Const LungimeCerc = 2 * PI * Raza
_____________________________________________________________________________________________Exemplu ↑
Constantele de tip Date se scriu între 2 caractere # (diez). Data şi ora se pot
scrie în funcţie de setările definite în calculator.
↓ Exemplu______________________________________________________________________________________________
#17/1/2007#
#1:12:00 PM#
#17/1/2007 1:12:00 PM#
_____________________________________________________________________________________________Exemplu ↑
Variabile
Pentru ca Visual Basic să atribuie unei constante sau unei variabile un tip
dorit, trebuie utilizat un sufix:
Sufix Tip dată
$ String
& Long
! Single
# Double
@ Currency
↓ Exemplu______________________________________________________________________________________________
Const Sold = 100@ 'constanta sold este de tip Currency
Const Raza = 25.0! 'constanta Raza este de tip Single
Dim D! 'este echivalenă cu: Dim D As Single
Dim A$, B$, C$ 'este echivalenă cu: Dim A, B, C As String
_____________________________________________________________________________________________Exemplu ↑
Instrucţiunea de atribuire
<NumeVariabilă> = <expresie>
↓ Exemplu______________________________________________________________________________________________
Dim Pretul As Single, Valoarea As Single
Dim Cantitatea As Integer
'...
Pretul = 34.3
Cantitatea = 10
Valoarea = Pretul * Cantitatea
_____________________________________________________________________________________________Exemplu ↑
Prof. univ. Emil Cosma 30 Secvenţe de cod VBA
↓ Exemplu______________________________________________________________________________________________
'prin instrucţiunea de atribuire:
Raza = 25 'raza este considerată de tip Integer
PI = 3.14 'PI este considerată de tip Single
LungimeCerc = 2 * PI * Raza 'LungimeCerc va fi de tip Single
O listă reuneşte mai multe variabile care au acelaşi nume, fiind identificate în
cadrul listei printr-un indice. Limita minimă implicită a indicelui este zero !.
↓ Exemplu______________________________________________________________________________________________
'...
Dim Salariu(25) As Single 'salariul a 25 persoane
Dim Masiv3D(5, 6, 7) As Integer 'Tablou cu 3 dimensiuni
'...
Salariu(0) = 1546.23 'Salariul primei persoane
Salariu(1) = 1265.7 'Salariul celei de a doua persoane
'...
Masiv3D(2, 5, 6) = 11
_____________________________________________________________________________________________Exemplu ↑
Liste dinamice
Prin instrucţiunea Dim se declară o listă cu număr finit de elemente. Există
instrucţiunea ReDim care permite crearea de liste dinamice. Redim urmează unei
instrucţiuni Dim la care nu se precizează nici o limită. Nu se poate utiliza ReDim pentru a
redimensiona o listă care s-a declarat deja cu un număr finit de elemente.
ReDim poate include şi clauza Preserve pentru a se conserva vechile valori ale listei.
Prof. univ. Emil Cosma 31 Secvenţe de cod VBA
↓ Exemplu______________________________________________________________________________________________
Dim Salariu() As Single 'listă dinamică
'...
ReDim Salariu(25)
'...
Salariu(0) = 1546.23
Salariu(9) = 1366.7
'...
ReDim Salariu(30) 'se adaugă elemente suplimentatre
'dar ATENŢIE!
'se pierd valorile
'Salariu(0) şi Salariu(9)
'...
ReDim Preserve Salariu(30) 'cu clauza Preserve
'nu se pierd valori
_____________________________________________________________________________________________Exemplu ↑
Aplicaţii
Secvenţa:
Sub Salarii()
Dim Sal(25) As Single
Sal(0) = 1543.1
Sal(1) = 1447.76
Sal(2) = 1633.34
MsgBox("Salariul mediu " & (Sal(0) + Sal(1) + Sal(2)) / 3)
End Sub
Va determina afişarea următoarei casete de text:
(1 + Rate) Nper − 1
MyFV = Pmt *
Rate
Unde:
Pmt – reprezintă plăţile,
Rate – este rata dobânzii,
Nper – numărul de perioade.
Secvenţa:
Sub CalculFV()
Plata = 100 'Suma depusă lunar
Dobanda = 0.06 'Dobânda este de 6%
Numar = 15 'Se fac 15 depuneri
Valoare = Plata * ((1 + Dobanda) ^ Numar - 1) / Dobanda
MsgBox("Sold " & Valoare)
End Sub
Va determina afişarea următoarei casete de text:
Prof. univ. Emil Cosma 33 Funcţii VBA predefinite
Basic oferă utilizatorului mai multe funcţii pentru a realiza diferite operaţiuni
pentru care, altfel, ar trebui scrise secvenţe de cod. Funcţiile pot apare ca operanzi în
relaţiile de calcul şi pot avea 0, 1 sau mai multe argumente (constante sau expresii de
calcul) iar cu ajutorul lor se execută calcule sau prelucrări şi se furnizează un rezultat.
Funcţia Format
<strFormat> Exemple
Format(8.6, "#.#") 8,6
Format(8.6, "#.00") 8,60
Formatarea valorilor numerice
Format(8.76, "#.00") 8,76
Format(8.76, "#.0") 8,8
Format(0.1, "Percent") 10,00 %
Format procentual
Format(0.1, "# %") 10 %
Separarea grupurilor de 3 cifre Format(10000,"###,### lei") 10.000 lei
Format monetar Format(10, "Currency") 10,00 lei
Afişare cu două zecimale Format(10.236, "Fixed") 10,24
Format ştiinţific Format(1233.07, "Scientific") 1,23E+03
True/Yes, False/No dacă <expresie> Format(0, "True/False") False
este #0 sau 0 Format(12.1, "Yes/No") Yes
Format("SALUT", "<") salut
Formatarea string-urilor
Format("salut", ">" SALUT
Format(Date, "Long Date") 27 martie 2007
Formatarea datelor
Format(Date, "dddd, mmm d yyyy") Marţi, mar 27 2007
calendaristice
… Date este o funcţie VBA care furnizează data curentă
Prof. univ. Emil Cosma 34 Funcţii VBA predefinite
Funcţii matematice
Funcţii financiare
Funcţia Descriere
FV(rate, nper, pmt, pv, type) Calculează valoarea viitoare a unei investiţii
bazate pe plăţi periodice şi constante şi o rată a
dobânzii constantă.
PV(rate, nper, pmt, fv, type) Întoarce valoarea actualizată a unei investiţii.
Valoarea actualizată este suma totală pe care o
reprezintă în prezent o serie de plăţi viitoare.
De exemplu, pentru împrumut, suma
împrumutată este valoarea actualizată pentru
creditor.
NPer(rate, pmt, pv, fv, type) Furnizează numărul de perioade pentru o
investiţie bazată pe plăţi periodice constante şi
o rată constantă a dobânzii.
Pmt(rate, nper, pv, fv, type) Calculează plata pentru un împrumut bazat pe
plăţi constante şi o rată constantă a dobânzii.
Ipmt(rate, per, nper, pv, fv, type) Determină plata dobânzii pe o perioadă dată,
pentru o investiţie bazată pe plăţi periodice
constante şi o rată constantă a dobânzii.
Argumentele marcate bold sunt obligatorii, celelalte sunt opţionale.
↓ Exemple______________________________________________________________________________________________
a) Pentru 13 depuneri lunare, a 100 unităţi monetare, cu dobândă anuală 10%,
soldul atins se poate calcula astfel:
' Definirea formatului monetar.
Fmt = "###,##0.00"
sold = FV(10 / 100 / 12, 13, -100)
MsgBox(Format(sold, Fmt))
Prof. univ. Emil Cosma 36 Funcţii VBA predefinite
Aceste funcţii sunt utilizate frecvent în aplicaţii: de la afişarea datei şi/sau orei
curente, la transformarea din ani în zile sau din ore în minute.
Aplicaţii
1. Să se calculeze valoarea funcţiei f(x) pentru diferite valori ale argumentului x>0 :
f ( x) = x 2 + x + 1 + e x
x = 7 ' x se initializeaza cu diverse valori
E = Exp(1)
f = Sqr(x ^ 2 + x + 1) + E ^ x
MsgBox ("Valoarea lui f : " & f)
2. Să se scrie o secvenţă de program prin care să se determine diferenţa (în ore) între
ora curentă şi o altă oră a zilei.
Ora = #9:05:27 PM#
MsgBox(DatePart("h", Time - Ora))
DataNasterii = #3/20/1990#
MsgBox(DateDiff("d", DataNasterii, Date))
4. O persoană fizică depune 500 lei într-un cont de economii cu o dobândă anuală de
11% şi îşi planifică să mai depună câte 50 de lei la începutul fiecăreia din următoarele
Prof. univ. Emil Cosma 39 Funcţii VBA predefinite
12 luni. Câţi bani va avea în cont la sfârşitul celor 12 luni (atenţie, argumentul type
este 1)?
Răspuns: 1.194,84 lei
6. După câte luni se va atinge un sold propus de 3 mii lei pentru depuneri lunare de 150
lei şi la o rată a dobânzii anuale de 14% ?
Răspuns: 22,907… ≈ 23 luni
7. Cât trebuie să economisiţi lunar ca, după 10 ani, contul în bancă să fie de 15 mii lei
la o dobândă lunară de 1% ?
Răspuns: -65,20 lei
'dobanzile pe cele 4 luni
Ipmt1 = IPmt(2 / 100, 1, 4, 4000)
Ipmt2 = IPmt(2 / 100, 2, 4, 4000)
Ipmt3 = IPmt(2 / 100, 3, 4, 4000)
Ipmt4 = IPmt(2 / 100, 4, 4, 4000)
'Suma platilor constante
PlataCt = 4 * Pmt(2 / 100, 4, 4000)
'Suma platilor variabile
PlataVar = (-4000 + Ipmt1 + Ipmt2 + Ipmt3 + Ipmt4)
'Afisarea sumelor
MsgBox(PlataCt & " / " & PlataVar)
Prof. univ. Emil Cosma 40 Programare structurată. Structuri de control VBA
Instrucţiune 1
True
Condiţie
False
Instrucţiune 2
Ciclul (iteraţia) cu test iniţial sau cu test final (“atâta timp cât”, ”până când”) - Do
While, Do Until.
Instrucţiuni
Condiţie
Instrucţiuni Condiţie
InputBox
Pentru efectuarea unor operaţii simple de introducere a unor date (de tip String)
de la tastatură se poate folosi funcţia InputBox. Într-o formă simplificată funcţia are
următoarea sintaxă:
↓ Exemplu______________________________________________________________________________________________
Sub test()
Dim AnulNasterii As Integer
AnulNasterii = InputBox("Nascut in anul", "Datele personale")
End Sub
______________________________________________________________________________________________Exemplu ↑
Prof. univ. Emil Cosma 42 Programare structurată. Structuri de control VBA
MsgBox
Funcţia MsgBox este utilizată, de obicei, pentru afişarea unui mesaj, dar poate
recepţiona şi un răspuns concretizat prin apăsarea unor butoane (Ok, Cancel, Abort,
Retry, Yes, No)
______________________________________________________________________________________________Exemplu ↑
Structurile de control
Structurile selective
If <condiţie> Then
<instrucţiuni 1>
[Else
<instrucţiuni 2>]
End If
Prof. univ. Emil Cosma 43 Programare structurată. Structuri de control VBA
↓ Exemplu______________________________________________________________________________________________
Următoarea secvenţă program verifică dacă un an este bisect sau nu (un an este
bisect dacă este divizibil cu 4 ŞI nu este divizibil cu 100 SAU este divizibil cu 400):
Sub test()
Dim ANUL As Integer
ANUL = InputBox("Anul este:") 'Se citeste ANUL
If ANUL Mod 4 = 0 And ANUL Mod 100 <> 0 Or ANUL Mod 400 = 0 Then
r = MsgBox("Anul este bisect", , ANUL)
Else
r = MsgBox("Anul nu este bisect", , ANUL)
End If
End Sub
______________________________________________________________________________________________Exemplu ↑
Pentru a codifica mai multe alternative, este posibilă înlănţuirea mai multor instrucţiuni
If, dar cu cât numărul acestora este mai mare, cu atât urmărirea lor devine mai dificilă.
Alternativă pentru astfel de situaţii este instrucţiunea Select Case.
↓ Exemplu______________________________________________________________________________________________
Dim selectie As Integer
selectie = InputBox("Culoarea dorita")
Select Case selectie
Case 1
Culoare = "Rosu"
Case 2, 3, 4
Culoare = "Nuanta de verde"
Case 5
Culoare = "Albastru"
Case 6 To 9
Culoare = "Nuanta de gri"
Case Else
Culoare = "Nici o Culoare"
End Select
r = MsgBox(Culoare, , selectie)
______________________________________________________________________________________________Exemplu ↑
↓ Exemplu______________________________________________________________________________________________
Pentru citirea a două note de la tastatură şi afişarea unor calificative se poate utiliza
următoarea secvenţă program:
______________________________________________________________________________________________Exemplu ↑
Structurile repetitive
Do While <condiţie>
<instrucţiuni>
[Exit Do]
<instrucţiuni>
Loop
Într-un ciclu Do While grupul de instrucţiuni care constituie corpul ciclului este
executat atât timp cât este îndeplinită condiţia. Clauza Exit Do impune abandonarea
execuţiei instrucţiunii (salt după Loop). Ciclul se poate executa de zero, unu sau mai
multe ori.
Do Until <condiţie>
<instrucţiuni>
[Exit Do]
<instrucţiuni>
Loop
Într-un ciclu Do Until grupul de instrucţiuni care constituie corpul ciclului este
executat pâna când este îndeplinită condiţia. Clauza Exit Do impune abandonarea
execuţiei instrucţiunii (salt după Loop). Ciclul se poate executa de zero, unu sau mai
multe ori.
Prof. univ. Emil Cosma 46 Programare structurată. Structuri de control VBA
↓ Exemplu______________________________________________________________________________________________
Pentru scrierea unui număr natural zecimal în baza de numeraţie 2, se poate
folosi metoda împărţirilor succesive la 2, până la obţinerea primului cât egal cu zero.
Exemplu:
6:2=3:2=1:2=0
6 2 0 _
0 1 1
Do Until indice = 0
indice = indice - 1
NumarBinar = NumarBinar & SirulResturilor(indice)
Loop
r = MsgBox(NumarBinar, , NumarZecimal)
Do
<instrucţiuni>
[Exit Do]
[<instrucţiuni>]
Loop While | Until <condiţie>
↓ Exemplu______________________________________________________________________________________________
Suma primelor n numere naturale:
Dim n As Integer
n = InputBox("Valoarea lui n: ")
Suma = 0
For i = 1 To n
suma = suma + i
Next
r = MsgBox("este " & suma, ,
"Suma primelor " & n & " numere")
______________________________________________________________________________________________Exemplu ↑
Prof. univ. Emil Cosma 48 Programare structurată. Structuri de control VBA
Aplicaţii
Dim valoare As Single
valoare = InputBox("Valoarea este")
If valoare < 100 Then
pretul = valoare * 110 / 100
Else
pretul = valoare * 115 / 100
End If
MsgBox("Pretul este: " & pretul)
Trei segmente de dreaptă pot forma un triunghi dacă fiecare este strict mai
mic ca suma celorlalte două.
4. Se consideră polinomul:
Dim n As Integer Dim n As Integer
'n trebuie sa fie pozitiv 'n trebuie sa fie pozitiv
Do Do
n = InputBox("n=") n = InputBox("n=")
Loop While n <= 0 Loop Until n > 0
suma = 0 : i = 0 suma = 0 : i = 0
Do While i < n Do Until i >= n
suma = suma + i suma = suma + i
i = i + 2 i = i + 2
Loop Loop
r = MsgBox(suma, , n) r = MsgBox(suma, , n)
Dim sir() As Integer, n As Integer
n = InputBox("Numarul de elemente")
ReDim sir(n)
For i = 0 To n - 1
sir(i) = InputBox("Valoarea " & i + 1)
Next
max = sir(0)
Prof. univ. Emil Cosma 50 Programare structurată. Structuri de control VBA
min = sir(0)
suma = 0
For i = 0 To n - 1
suma = suma + sir(i)
If min > sir(i) Then
min = sir(i)
End If
If max < sir(i) Then
max = sir(i)
End If
Next
MsgBox("Maxim " & max & " Minim " & min & " Suma " & suma)
contor = 1
Do
raspuns = InputBox("Raspuns:", contor)
Select Case raspuns
Case "d"
da = da + 1
Case "n"
nu = nu + 1
Case "x"
x = x + 1
Case Else
Exit Do
End Select
contor = contor + 1
Loop While raspuns = "d" Or raspuns = "n" Or raspuns = "x"
MsgBox("Da:" & da & " Nu:" & nu & " Nu stiu:" & x)
Prof. univ. Emil Cosma 51 Module VBA
Module VBA
Programarea modulară este un procedeu prin care mai multe instrucţiuni sunt
grupate în proceduri (Sub şi Function) destinate realizării în mod repetat a unor
acţiuni. Acestea pot fi definite în cadrul limbajului (proceduri standard) sau de către
programator (proceduri utilizator). Programarea structurată combinată cu programarea
modulară contribuie la creşterea eficienţei şi productivităţii în proiectarea de aplicaţii.
Procedurile de dimensiuni mici, scrise pentru realizarea diverselor sarcini, în locul
programelor vaste, monolitice, concretizează programarea structurată. Prin divizarea
aplicaţiei în mai multe proceduri se reduce efortul, o dată cu numărul de erori în
scrierea programelor. De asemenea, este simplificată întreţinerea aplicaţiei.
Din punct de vedere al referirii variabilelor de lucru, din diferite zone ale
programului, se deosebesc două tipuri de variabile:
↓ Exemplu______________________________________________________________________________________________
Sub test()
Static Dobanda As Single
Dobanda = 3 / 100
'...
End Sub
'...
Public rataDobanzii As Single
'...
______________________________________________________________________________________________Exemplu ↑
Observaţii:
Variabilele publice şi locale sunt declarate la început de modul.
Orice program poate conţine unul sau mai multe proceduri.
Singura deosebire dintre procedurile Sub şi Function este că cele de tip
Function returnează o valoare care se atribuie unei variabile iar celelalte nu.
Din orice procedură pot fi apelate alte proceduri (apeluri în cascadă).
Orice procedură apelată este căutată mai întâi în cadrul secţiunii curente, apoi
în modulele externe.
Execuţia unei proceduri depinde de parametrii externi transmişi acestuia şi se
va opri la sfârşit (End Sub, End Function) sau la întâlnirea instrucţiunii de
ieşire din procedură (Exit Sub, Exit Function).
După executarea unei proceduri se revine în programul apelant.
O procedură poate avea atributele Private sau Public.
↓ Exemple______________________________________________________________________________________________
()
O procedură ValoareTva, pentru calculul valorii TVA (Tva este variabilă cu atribut
Public), poate fi definită într-un modul extern:
Prof. univ. Emil Cosma 53 Module VBA
()
Se editează o procedură, inclusă într-un modul, pentru ordonarea unui şir de
numere prin metoda interschimbării.
Explicarea metodei interschimbării:
÷ Se consideră un şir de numere a 1 , a 2 , a 3 … a n-1 , a n.
÷ Se compară, pe rând câte două elemente ale şirului. Dacă valorile lor corespund
criteriului de ordonare (crescător sau descrescător) atunci ele rămân pe aceeaşi
poziţie, dacă nu, se interschimbă:
a 1 a 2 a 3 … a n-1 a n
÷ Comparările se reiau până când nu mai e necesară nici o interschimbare.
Sub Ordonare(n As Byte, a() As Single)
Dim aux As Single
Do While Not gata
gata = True
For i = 0 To n - 2
If a(i) > a(i + 1) Then
aux = a(i)
a(i) = a(i + 1)
a(i + 1) = aux
gata = False
End If
Next
Loop
End Sub
Pentru citirea elementelor şirului, apelul procedurii de ordonare a elementelor lui
şi afişarea şirului ordonat, se poate utiliza următoarea secvenţă:
Sub test()
Dim a() As Single
Dim n As Byte
Dim SirOrdonat As String
SirOrdonat = ""
n = InputBox("Numarul de elemente")
ReDim a(n)
For i = 0 To n - 1
a(i) = InputBox("elementul " & i + 1)
Next
'
Call Ordonare(n, a) 'Apelul procedurii
'
For i = 0 To n - 1
Prof. univ. Emil Cosma 54 Module VBA
↓ Exemplu______________________________________________________________________________________________
Procedura Sub ValoareTva, pentru calculul valorii TVA, transmiterea parametrilor
prin referinţă:
Sub ValoareTva(ByRef valoare, ByRef Tva)
Tva = Valoare * 0.19
End Sub
Apelul procedurii şi transmiterea parametrilor Valoare şi Tva:
Sub Test()
Dim Valoare As Single, Tva As Single
Valoare = InputBox("Care este valoarea?")
'
Call ValoareTva(Valoare, Tva) 'apelul procedurii Sub
'
MsgBox("Valoarea Tva:" & Tva)
End Sub
______________________________________________________________________________________________Exemplu ↑
Funcţii recursive
O funcţie este recursivă dacă se apelează pe ea însăşi.
↓ Exemplu______________________________________________________________________________________________
Pentru calculul funcţiei factorial, fact, este definită următoarea secvenţă de
instrucţiuni:
Function fact(ByVal n As Byte) As Integer
If n = 0 Then
fact = 1
Else
fact = n * fact(n - 1)
End If
End Function
Aplicaţii
(1 + Rate) Nper − 1
MyFV = Pmt *
Rate
Unde:
Pmt – reprezintă plăţile,
Rate – este rata dobânzii,
Nper – numărul de perioade.
Funcţia Function MyFV(ByRef Rate, ByRef Nper, ByRef Pmt)
As Double
End Function
Apel
Sub Test()
Dim Rate As Double, Nper As Double, Pmt As Double
Rate = InputBox("Rata Dobanzii")
Nper = InputBox("Numarul de perioade")
Pmt = InputBox("Plata")
r1 = MyFV(Rate, Nper, Pmt)
r2 = FV(Rate, Nper, Pmt)
MsgBox(r1 & " " & r2)
End Sub
Prof. univ. Emil Cosma 57 Module VBA
k
2. Să se calculeze combinările de n luate câte k ( Cn ) utilizând relaţia de recurenţă:
Funcţia
Function comb(ByRef n, ByRef k) As Long
If k = 0 Or n = k Then
Comb = 1
Exit Function
End If
If k = 1 Then
Comb = n
Exit Function
End If
comb = comb(n - 1, k) + comb(n - 1, k - 1)
End Function
Apel
Sub Test()
Dim n As Byte, k As Byte
n = InputBox("?n")
k = InputBox("?k")
MsgBox("Comb(" & n & "," & k & ")=" & comb(n, k))
End Sub
1, n 0
Fib ( n ) 1, n 1
Fib ( n 1) Fib ( n 2), n 1
Funcţia
Function Fib(ByRef n) As Long
If n = 0 Or n = 1 Then
Fib = 1
Else
Fib = Fib(n - 1) + Fib(n - 2)
End If
End Function
Apel
Sub Test()
Dim n As Byte
n = InputBox("?n")
MsgBox("al " & n & "-lea termen:" & fib(n))
End Sub
Prof. univ. Emil Cosma 58 Module VBA
4. Să se calculeze cel mai mare divizor comun a două numere, conform relaţiei
recursive a lui Euclid:
x, dacă y 0
cmmdc( x, y )
cmmdc( y, x mod y ) dacă y 0
unde mod este operatorul modulo.
Funcţia
Function cmmdc(ByRef x, ByRef y) As Long
If y = 0 Then
cmmdc = x
Else
cmmdc = cmmdc(y, x Mod y)
End If
End Function
Apel
Sub Test()
Dim x As Long, y As Long
x = InputBox("?x")
y = InputBox("?y")
MsgBox("cmmdc(" & x & "," & y & ") = " & cmmdc(x, y))
End Sub
5. Să se editeze propria funcţie de calcul a numărului lui Euler (e) cu patru zecimale
exacte (2,7182…) folosind formula:
1 1 1
e 1 ...
1! 2 ! 3!
Se foloseşte funcţia de calcul a factorialului şi structura Do While, punând condiţia
3
de oprire 10 k , unde n este numărul de iteraţii necesare, iar 10-k este
(n 1)!
eroarea (în cazul cerut k este 5).
Funcţia
Function fact(ByRef n As Byte)
If n = 0 Then
fact = 1
Else
fact = n * fact(n - 1)
End If
End Function
Function EulMeu(ByRef k) As Single
Dim i As Byte
i = 1
EulMeu = 1
Do While 3 / fact(i + 1) > 10 ^ -k
EulMeu = EulMeu + 1 / fact(i)
i = i + 1
Loop
End Function
Apel
Sub Test()
Dim k As Byte
k = 5
MsgBox(EulMeu(k) & " " & Exp(1))
End Sub
Prof. univ. Emil Cosma 60 Formulare VBA
Formulare (form-uri)
Un proiect VBA grupează unul sau mai multe formulare şi module. În formulare
(UserForm) se poziţionează controale (obiecte de interfaţă) care permit introducerea
sau extragerea datelor utilizatorului în mod interactiv. Controalelor din formular le sunt
asociate proprietăţi şi metode (proceduri eveniment). Procedurile eveniment sunt
secvenţe de instrucţiuni care pot fi modificate, ca de altfel şi proprietăţile controalelor
incluse în formular. Modificările efectuate se reflectă în aspectul formularului şi în
comportamentul acestuia în diferite situaţii..
Proprietăţi şi metode
Un formular poate conţine mai multe obiecte (controale), el însuşi fiind considerat
un obiect. Fereastra Properties permite alegerea controlului şi a proprietăţii a cărei
valoare se schimbă, ca de exemplu:
Proprietatea Caption este destinată stabilirii unui titlu (denumire) pentru
formular sau control.
Proprietatea (Name) permite atribuirea unor nume controalelor. VBA stabileşte
valori implicite proprietăţii (Name) cum ar fi:
UserForm1, UserForm2… pentru formulare (prin convenţie, numele
formularelor utilizator vor fi prefixate de cuvântul frm, de exemplu:
frmPrincipal, frmCalcul);
Label1, Label2… pentru etichete (prefix convenţional: lbl);
CommandButton1, CommandButton2… pentru butoane (prefix: btn);
TextBox1, TextBox2… pentru casete de text (prefix: txt).
Aceste nume ale controalelor pot fi folosite aşa cum au fost definite de VBA însă
utilizatorul are posibilitatea stabilirii unor denumiri proprii.
O categorie specială de proprietăţi o reprezintă metodele. Metodele sunt secvenţe
de instrucţiuni asociate diferitelor obiecte la activarea/dezactivarea acestora.
Proprietatea Caption
Dacă nu este afişată fereastra de proprietăţi a unui formular, din meniul View
(afişare) se selectează opţiunea Properties Window (fereastra de proprietăţi) sau
butonul dintre butoanele standard. Pentru un formular care conţine controale sau
componente, se poate folosi şi lista derulantă din fereastra Properties pentru a selecta
obiecte din formular. Unui obiect selectat i se pot configura proprietăţile.
Proprietatea StartUpPosition
Utilizarea controalelor
Etichetă
Casetă de text
Casetă de validare
Cadru de grupare
Listă derulantă
Casetă de imagine
Generator de valori
Controlul Label este utilizat pentru afişarea unor texte care nu pot fi editate de
utilizator. Este util pentru descrierea altor obiecte din formular cum ar fi TextBox,
Prof. univ. Emil Cosma 66 Formulare VBA
ListBox, etc.
↓ Exemplu______________________________________________________________________________________________
Pe un formular se introduce o etichetă cu numele
lblPoza, proprietatea Visible având valoarea
False. O imagine de fundal este fixată prin
proprietatea Picture:
______________________________________________________________________________________________Exemplu ↑
Prof. univ. Emil Cosma 68 Formulare VBA
Acest control este unul dintre cele mai folosite în programarea interfeţelor grafice
datorită avantajelor pe care le oferă la introducerea datelor şi la manipularea lor.
Defineşte un câmp de editare în care utilizatorul poate introduce un text. Controlul
TextBox afişează mai multe linii atunci când proprietatea Multiline este setată pe
True. Aspectul textului afişat este determinat de proprietăţile Font şi ForeColor. La
fel ca şi la alte controale, proprietăţile pot fi modificate prin cod program, în timpul
rulării aplicaţiei.
Caseta de text este foarte flexibilă în VBA, permiţând introducerea datelor pe una
sau mai multe linii de text, folosirea barelor de derulare (Scrollbars), etc. De asemenea,
o casetă de text poate fi folosită în modul activ (utilizatorul are acces la conţinutul său)
sau în modul inactiv (utilizatorul poate doar să vizualizeze conţinutul, textul fiind
protejat în cazul în care se încearcă modificarea sa).
Principalele proprietăţi, ale unei casete de text, sunt rezumate în tabelul următor:
Proprietate
Name
Nume VBA: TextBox1, TextBox2, … Convenţie prefix: txt.
BackColor
Culoarea de fundal a casetei de text. În momentul proiectării (la plasarea
casetei pe formular) se pot alege valori din 2 categorii: Palette, System,
fiecare cu propria sa paletă de culori.
BorderStyle
Tipul marginii casetei de text. Sunt disponibile 2 variante:
÷ 0-FmBackStyleTransparent;
÷ 1-FmBackStyleOpaque.
Enabled
Proprietate de tip boolean care permite utilizatorului să modifice conţinutul
casetei (True - implicit) sau protejează textul împotriva modificărilor (False).
ForeColor
Culoarea textului care este afişat în interiorul casetei. Maniera de selectare
este asemănătoare cu cea asociată proprietăţii BackColor.
MaxLength
Numărul maxim de caractere care pot fi introduse în caseta de text. Poate fi
modificată la o valoare de tip Integer pozitivă.
MousePointer
Stabileşte felul cursorului mouse-ului atunci când acesta se află pe caseta de text.
Prof. univ. Emil Cosma 69 Formulare VBA
Valorile pot fi alese dintr-o listă: AppStarting, Arrow, Cross, Ibeam, NoDrop,
SizeAll …
Multiline
Precizează dacă textul din casetă poate fi plasat pe mai multe rânduri. Este o
proprietate de tip boolean (implict False).
PasswordChar
Defineşte care este caracterul (de exemplu *) ce se va afişa în mod repetat,
astfel încât textul din interior să nu poată fi descifrat. Utilă pentru proceduri
de introducere a parolelor sau a cuvintelor-cheie.
ScrollBars
Stilul barelor de derulare aferente casetei:
÷ None (nu este prezentă nici o bară de derulare);
÷ Horizontal (bară de derulare orizontală, sub caseta de text);
÷ Vertical (bară de derulare verticală, în dreapta casetei de text);
÷ Both (bare de derulare verticală şi orizontală). În cazul în care se
alege această variantă, se recomandă testarea ei în acelaşi timp cu
proprietatea Multiline.
TextAlign
Alinierea textului introdus în caseta de text. Alinierea poate fi :Left (implicit),
Right, Center.
↓ Exemplu______________________________________________________________________________________________
Se editează un formular care să permită următoarele operaţiuni:
÷ introducerea numelui (mărcii) unui autoturism;
÷ introducerea preţului autoturismului, în Euro;
÷ cursul, la zi, a monedei europene;
÷ în funcţie de cursul monedei Euro se calculează preţul autoturismului în
lei;
÷ confirmarea stocului existent;
÷ confirmarea includerii de taxe;
÷ opţiunea de culoare;
÷ afişarea informaţiile despre autoturism: marca, preţul în lei, culoare,
dacă se află în stoc, dacă preţul are taxele incluse.
txtMarca txtCursEuro
txtPretEuro
btnInfo
lblInfo
Principalele proprietăţi:
Proprietate
Name
Nume VBA: CheckBox1, CheckBox2, … Convenţie prefix: chk.
Alignment
Specifică locul de plasare a cadrului de bifare în cadrul controlului. Această
proprietate poate lua valorile Left şi Right. Right este implicit.
Enabled
Este proprietate de tip boolean care stabileşte dacă checkbox-ul este sau nu
activ.
Font
Stilul fontului cu care este scris textul însoţitor.
ForeColor
Culoarea cu care este scris textul însoţitor.
Caption
Proprietate ce determină textul însoţitor (explicativ) al casetei de validare.
Value
Proprietate importantă cu următoarele valori:
÷ True, dacă este bifată caseta;
÷ False, dacă este debifată caseta (implicit).
Visibile
Dacă este True (implicit), caseta de validare este vizibilă pe formular. În caz
contrar, este invizibilă.
↓ Exemplu______________________________________________________________________________________________
Pe formularul anterior se introduc două CheckBox-uri (chkStoc, chkTaxe). În
procedura eveniment btnInfo_Click se adaugă următoarele instrucţiuni:
If chkStoc.Value Then
Stoc = "Se afla in stoc"
Else
Stoc = "Nu se afla in stoc"
End If
If chkTaxe.Value Then
Taxe = "Toate taxele incluse!"
Else
Taxe = "Nu include taxe"
End If
lblInfo.Caption = "Autoturismul " & txtMarca.Text & vbCrLf &
"Are pretul " & PretLei & " lei (cu TVA)" &
vbCrLf & Stoc & vbCrLf & Taxe
Prof. univ. Emil Cosma 72 Formulare VBA
checkBox bifat
Rezultatul prelucrării
______________________________________________________________________________________________Exemplu ↑
Rolul controlului de tip Frame este de a grupa două sau mai multe controale (de
regulă, CheckBox sau OptionButton) astfel încât să formeze un set de elemente între
care se stabileşte o relaţie. De exemplu în cazul controlului CheckBox, utilizatorul poate
bifa un control indiferent de starea celorlalte.
Există însă situaţii în care este de dorit ca starea unei opţiuni să elimine în mod
automat celelalte opţiuni şi astfel se ajunge la utilizarea butoanelor de opţiune
structurate într-un grup.
Este controlul care se foloseşte atunci când trebuie selectată doar o singură
opţiune din mai multe posibile. De regulă, aceste butoane sunt comasate într-un cadru
de grupare, asigurându-se, în acest fel, selectarea doar a unei singure opţiuni.
Proprietăţile cele mai importante ale unui control de tip buton radio sunt:
Proprietate
Name
Nume VBA: OptionButton1, OptionButton2, … Convenţie prefix: rbn.
Alignment
Locul de plasare a cadrului de bifare în cadrul controlului. Această proprietate
poate lua valorile Left şi Right. Right este implicit.
Caption
Şirul de caractere care însoţeşte butonul radio.
TextAlign
Modalitatea de aliniere a textului în cadrul controlului. Poate lua valorile Left,
Center, Right. Implicit: Left.
Value
Este proprietatea cea mai folosită, indicând dacă butonul este selectat - True
sau nu – False (implicit).
Visible
Proprietate de tip boolean care stabileşte dacă butonul radio este sau nu vizibil
pentru utilizator.
↓ Exemplu______________________________________________________________________________________________
Se plasează pe formular obiectul de tip Frame, cu proprietatea Name,
frmCuloare. Se aduc, în interiorul acestui control, din cutia cu instrumente, trei
butoane radio: rbnAlb, rbnGri, rbnRosu (pentru selectarea unei culori).
Controlul Frame are rolul de container pentru butoanele radio iar deplasarea lui
determină şi deplasarea elementelor pe care le conţine.
Prof. univ. Emil Cosma 74 Formulare VBA
______________________________________________________________________________________________Exemplu ↑
Controlul ListBox dintr-un formular afişează o listă de una sau mai multe
elemente. Dacă numărul total al elementelor excede numărul celor care pot fi afişate,
un scroll bar este automat adăugat la acel control. Prin proprietatea MultiSelect
elementele listei pot fi afişate în coloane multiple (implicit MultiSelect este
fmMultiSelectSingle).
este -1. Dacă este selectat primul element din listă, valoarea lui ListIndex este 0.
Funcţia ListCount furnizează numărul elementelor listei.
În esenţă, controlul ListBox poate conţine mai multe valori care să fie
gestionate pe o suprafaţă fixă de pe formular, accesul la valorile ascunse realizându-se
prin intermediul barelor de derulare. Funcţia Clear permite ştergere elementelor listei
(golirea listei).
dreapta (de regulă pentru elemente de tip numeric) sau la centrul listei.
Visible
Dacă este True, lista este vizibilă; în caz contrar, ea există ca obiect în
memorie, dar nu este vizibilă pe ecran.
↓ Exemplu______________________________________________________________________________________________
Cea mai utilizată operaţiune este cea de adăugare a elementelor în listă (aici
lstAuto). În momentul proiectării interfeţei, cu ajutorul procedurii Sub
UserForm_Initialize(), se introduc elementele listei (aici, mărci de
autoturisme). Utilizându-se o singură coloană (lstAuto.ColumnCount = 1)
lista (lstAuto.List()) se preia din tabloul Lista(5).
lstAuto
btnAdauga
btnSterge
______________________________________________________________________________________________Exemplu ↑
↓ Exemplu______________________________________________________________________________________________
În exemplul următor se utilizează două ComboBox-uri (cboMarca şi cboPret).
Cu ajutorul procedurii Sub UserForm_Initialize(), se introduc elementele
listei (la fel ca în exemplul anterior - pentru ListBox):
Prof. univ. Emil Cosma 79 Formulare VBA
cboMarca cboPret
btnInfo
lblInfo
Acest control permite afişarea pe suprafaţa formularului a unor imagini preluate din
fişiere grafice. Formatele suportate sunt multiple: bmp, gif, jpg, ico etc. Referitor la
aspectul vizual, cele mai importante proprietăţi sunt următoarele:
Proprietate
Name
Nume VBA: Image1, Image2, … Convenţie prefix: img.
Prof. univ. Emil Cosma 80 Formulare VBA
BackStyle
Fundalul casetei:
÷ Opaque (implicit);
÷ Transparent.
BorderStyle
Stilul marginii casetei:
÷ None: nici o bordură;
÷ Single: bordură (implicit);
Picture
Imaginea care se va afişa în casetă. În momentul proiectării, această
imagine poate fi preluată prin indicarea fişierului care o conţine.
÷ Vertical;
÷ Horizontal
Value
Reprezintă valoarea curentă a generatorului.
Visibile
Dacă este True, generatorul este vizibil pentru utilizator; dacă este False,
este ascuns.
↓ Exemplu______________________________________________________________________________________________
Într-un formular se introduc următoarele controale:
÷ Controlul spbVarsta (cu proprietăţile Min = 1, Max = 120);
÷ Eticheta lblInfo.
lblInfo
Pentru modificări ale proprietăţilor unui control este necesar ca valorile acestora
să fie citite şi redefinite în timpul execuţiei (Run Mode). Pentru fiecare control se dau
valori implicite (default), ele pot fi însă modificate prin acţiuni ale utilizatorului.
Când se gestionează mai multe formulare se impune, de cele mai multe ori,
Prof. univ. Emil Cosma 82 Formulare VBA
↓ Exemplu______________________________________________________________________________________________
Având formularul UserForm1, deschis, în mediul de proiectare (cu un buton,
CommandButton1 inclus) se adaugă un nou formular.
Se deschide editorul de cod (dublu-clic pe butonul Button1). Se aplică metoda
Show pentru activarea celui de al doilea formular:
Private Sub CommandButton1_Click()
Me.Caption = "Eu sunt formularul 1"
UserForm2.Caption = "Eu sunt formularul 2"
UserForm2.Show
End Sub
______________________________________________________________________________________________Exemplu ↑
Când se impune modificarea mai multor proprietăţi ale unui control se utilizează,
de multe ori, structura:
With <control>
<instrucţiuni>
End With
↓ Exemplu______________________________________________________________________________________________
Se creează un formular;
Se introduce, în formular, controlul ListBox cu numele lstCardinale;
Codul următor realizează iniţializarea valorilor din listă:
Private Sub UserForm_Initialize()
With lstCardinale
.AddItem "Nord"
.AddItem "Sud"
.AddItem "Est"
.AddItem "Vest"
.ListIndex = 3
End With
End Sub
Prof. univ. Emil Cosma 83 Formulare VBA
Rularea formularului:
______________________________________________________________________________________________Exemplu ↑
↓ Exemplu______________________________________________________________________________________________
Se creează un formular conţinând două butoane radio şi o casetă de validare.
Codul următor restricţionează accesul la radio butoane:
Private Sub CheckBox1_Click()
With Me 'Me se referă la formularul curent
If .CheckBox1.Value = True Then
.OptionButton1.Enabled = False
.OptionButton2.Enabled = False
Else
.OptionButton1.Enabled = True
.OptionButton2.Enabled = True
End If
End With
End Sub
Efectul bifării/debifării casetei de validare:
______________________________________________________________________________________________Exemplu ↑
Prof. univ. Emil Cosma 84 Formulare VBA
↓ Exemplu______________________________________________________________________________________________
Pe un formular se introduc două etichete (Textul 1 şi Textul 2) şi două CheckBox-
uri.
Procedurile care tratează evenimentele Click ale etichetelor impun focusul:
Private Sub Label1_Click()
CheckBox1.SetFocus
End Sub
Private Sub Label2_Click()
CheckBox2.SetFocus
End Sub
Efectul click-ului pe cele două etichete:
______________________________________________________________________________________________Exemplu ↑
↓ Exemplu______________________________________________________________________________________________
Pe un formular se introduc două casete de text şi un buton (btnValidare).
Procedura care tratează evenimentul Click al butonului afişează un mesaj de
eroare realizând focusul pe TextBox-ul care a generat eroarea:
Private Sub btnValidare_Click()
If Not IsNumeric(TextBox1.Text) Then
MsgBox ("Eroare 1")
TextBox1.SetFocus
End If
If Not IsNumeric(TextBox2.Text) Then
MsgBox ("Eroare 2")
TextBox2.SetFocus
End If
End Sub
Efect când se introduce, de exemplu, o valoare eronată în al doilea TextBox:
Prof. univ. Emil Cosma 85 Formulare VBA
______________________________________________________________________________________________Exemplu ↑
La închiderea unui dialog, toate datele introduse de utilizator se pierd. Din acest
motiv, informaţia necesară a fi reutilizată trebuie să fie salvată în variabile de la nivelul
modul, înaintea descărcării formularului. Închiderea (descărcarea) formularului se
realizează prin instrucţiunea Unload.
↓ Exemplu______________________________________________________________________________________________
Pe un formular se introduc un TextBox (txtMem) şi un buton (btnStop) iar
String-ul introdus în TextBox e necesar a fi salvat:
Aplicaţii
Controale
Control Tip Proprietate Valoare
proprietate
ForeColor Blue
Font, Size 10
Font,FontStyle Bold
ForeColor Green
Font, Size 10
Font,FontStyle Bold
Font, Size 12
Font,FontStyle Bold
Prof. univ. Emil Cosma 87 Formulare VBA
TextAlign Center
ForeColor Red
Font,FontStyle Bold
ForeColor Blue
Font, Size 18
Font,FontStyle Bold
ForeColor Red
Font, Size 18
Font,FontStyle Bold
ForeColor Green
Font, Size 18
Font,FontStyle Bold
ForeColor Purple
Font, Size 18
Font,FontStyle Bold
ForeColor Black
Font, Size 18
Font,FontStyle Bold
Metode
Control Secvenţa de cod
Private Sub btnAdun_Click()
If IsNumeric(txtA.Text) And
IsNumeric(txtB.Text) Then
A = Val(txtA.Text)
B = Val(txtB.Text)
Rezultat = A + B
lblOperator.Caption = "+"
lblRezultat.Caption = Rezultat
Else
MsgBox("Eroare! Valoare numerică!")
End If
Prof. univ. Emil Cosma 88 Formulare VBA
End Sub
Observaţii:
÷ Deoarece valorile introduse în TextBox-urile txtA şi txtB sunt
de tip String este necesară funcţia de convertire Val
÷ Cu funcţia IsNumeric se testează dacă valoarea introdusă este
o valoare numerică
Controale
Control Tip Proprietate Valoare
proprietate
Font, Size 10
Font,FontStyle Bold
B rbnFV Caption FV
u
ForeColor Red
t
Font,FontStyle Bold
o
a Value True
n rbnPV Caption PV
e
ForeColor Green
Font,FontStyle Bold
Radio
rbnPmt Caption Pmt
ForeColor Blue
Font,FontStyle Bold
Buton Caption Calculeaza
btnCalcul
Font, Size 12
Font,FontStyle Bold
Metode
Control Secvenţa de cod
Dim selectie As Byte
Private Sub UserForm_Initialize()
UserForm1
selectie = 1
End Sub
Private Sub rbnFv_Click()
rbnFV selectie = 1
End Sub
Private Sub rbnPV_Click()
rbnPV selectie = 2
Prof. univ. Emil Cosma 90 Formulare VBA
End Sub
Private Sub rbPmt_Click()
rbnPmt selectie = 3
End Sub
Private Sub btnCalcul_Click()
If IsNumeric(txtD.Text) And
IsNumeric(txtN.Text) And
IsNumeric(txtV.Text) Then
D = Val(txtD.Text)
N = Val(txtN.Text)
V = Val(txtV.Text)
Controalele ActiveX
Controalele ActiveX (în cazul formularelor mai sunt denumite şi controale OLE,
pentru a face diferenţierea) pot fi plasate şi direct în documentele aplicaţiilor:
documente Word, foi de calcul Excel, diapozitive PowerPoint. Inserarea lor este facilitată
de tab-ul Developer, Controls. Aceste controale au atribute cu proprietăţi ajustabile,
recunosc evenimente. Prin scrierea procedurilor eveniment, interfaţa cu utilizatorul
proiectului poate fi personalizată şi definită corespunzător.
Pot fi adăugate controale unui document, foi de calcul electronic sau slide pentru
a le transforma în obiecte interactive, în acelaşi mod în care controalele se adaugă unui
formular. Astfel, unui document, i se pot adăuga casete de text, liste, butoane radio,
pentru a-l transforma într-un formular activ (online). Se pot adăuga controale (Form
Controls) pe o foaie de calcul pentru a executa proceduri macro uzuale etc.
Editarea lor este permisă în modul Design mode iar activarea lor în Run
Mode. Bascularea între cele două moduri este realizată în Word (dar şi în
Excel) prin acţionarea butonului , din tab-ul Developer. În
PowerPoint se trece în Slide Show pentru a se ajunge în Run Mode şi se
revine într-un context de editare pentru Design Mode.
Proprietăţile controalelor se stabilesc după ce se acţionează butonul
.
Word
Controale ActiveX
Pentru editarea şi utilizarea documentelor Word active se impune respectarea
următoarelor reguli:
Controalele ActiveX se pot adăuga stratului (layer-ului) de text. Controlul
este inserat ca un caracter, respectându-se atributele liniei şi paragrafului.
Controalele nu pot fi aduse prin drag&drop, cu mouse-ul, în document. La
click pe un control, acesta este inserat în punctul de inserţie pe text.
În Design Mode, controalele ActiveX sunt disponibile pentru editare.
În Run Mode controalele reacţionează la evenimente.
↓ Exemplu______________________________________________________________________________________________
Un coş de cumpărături online...
…Se creează un tabel Word cu următorul conţinut:
Produs Preţ
Aparat foto
1188
Sony digital DSC-H2
http://www.sony.com/
Laptop
1978
Acer TM2492NWLMi
http://global.acer.com/
Telefon GSM
428
Motorola V3
http://www.motorola.com/
Suma totala de plată:
Coşul de cumpărături:
0
Goleste Cosul
Pe layer-ul de text:
÷ Se introduc textele: Produs, Preţ, Aparat foto, Laptop, Telefon GSM, Coşul de
cumpărături:, Suma totala de plată:.
÷ Se includ imaginile (Insert Picture).
÷ Se stabilesc Hyperlink-urile:http://www.sony.com/, http://global.acer.com/,
http://www.motorola.com/ care pot fi activate prin Ctrl+Click.
Prof. univ. Emil Cosma 93 Documente Office active
cboCos ComboBox
cboCos.Clear
End Sub
Private Sub btnSterg_Click()
If cboCos.ListCount >= 1 Then
If cboCos.ListIndex <> -1 Then
lblTotal.Caption = Val(lblTotal.Caption) -
Val(cboCos.Text)
cboCos.RemoveItem (cboCos.ListIndex)
cboCos.ListIndex = -1
cboCos.Text = "" 'valoarea afişată este nulă
'(şirul vid)
End If
End If
End Sub
Câteva precizări:
÷ Proprietăţile controalelor au fost tratate, mai pe larg, într-un capitol
anterior.
÷ Prin acţionarea butonului , în ComboBox, se introduce preţul şi
denumirea corespunzătoare produsului iar lista de produse poate fi
consultată prin desfăşurarea listei derulante:
VBA interacţionează cu documentul asociat. De exemplu se poate face
inserarea unui text pe poziţia curentă a cursorului:
'…
ActiveDocument.Content.InsertAfter ”Un text inserat”
'…
Proprietăţile controalelor se pot modifica prin program. De exemplu
stabilirea titlului (caption) unui buton:
Private Sub CommandButton1_Click()
If CommandButton1.Caption = "Start" Then
CommandButton1.Caption = "Stop"
Else
CommandButton1.Caption = "Start"
End If
End Sub
Rich Text
Proprietăţi:
generale: Title, Tag;
pentru redactare: ştergere, editare;
pentru caracteristici specifice (în cazul de faţă pentru un control Drop-down
List).
Prof. univ. Emil Cosma 96 Documente Office active
↓ Exemplu______________________________________________________________________________________________
Într-un document Word se creează un formular pe care se introduc următoarele
controale Content: Text, Drop-Down List, Rich Text, Date Picker:
Text
Drop-Down List
Rich Text
Date Picker
______________________________________________________________________________________________Exemplu ↑
Excel
↓ Exemplu______________________________________________________________________________________________
Crearea unei macrocomenzi pentru calcule financiare (funcţia FV):
Record Macro (Macro Name : functiaFV, Shortcut key: Ctrl+f);
Editarea datelor pentru calcul şi a funcţiei FV:
Range("A3").Select
ActiveCell.FormulaR1C1 = "Plata"
Range("A4").Select
ActiveCell.FormulaR1C1 = "Valoare FV"
Range("C1").Select
ActiveCell.FormulaR1C1 = "0.1"
Range("C2").Select
ActiveCell.FormulaR1C1 = "2"
Range("C3").Select
ActiveCell.FormulaR1C1 = "100"
Range("C4").Select
ActiveCell.FormulaR1C1 = "=FV(R[-3]C,R[-2]C,R[-1]C)"
End Sub
______________________________________________________________________________________________Exemplu ↑
Prof. univ. Emil Cosma 99 Documente Office active
Câteva precizări:
÷ Variabilele l şi c reţin adresa (colţul stânga sus al noului domeniu de celule);
÷ Cu Cells(…, ...).Value se afişează valorile textuale şi numerice (datele de intrare
sunt iniţializate cu zero);
÷ Cu Cells(…, ...).Activate sunt activate celule de calcul pentru a reţine adresele
lor;
÷ a1, a2, a3 sunt adresele celulelor ce conţin datele necesare calculului;
÷ Funcţia FV este scrisă textual şi rezultă prin concatenarea unor şiruri de
caractere.
Form Controls devin active imediat după ce au fost introduse, acţionarea lor
ducând la rularea macroinstrucţiunii asociate. Butoanele Design Mode şi Properties nu
vizează acest grup de controale, ci doar controalele ActiveX.
Prof. univ. Emil Cosma 100 Documente Office active
↓ Exemplu______________________________________________________________________________________________
Într-un document Excel se introduce un Button (Form Control).
Sub Button1_Click()
MsgBox ("S-a acţionat un Button (Form Control)")
End Sub
______________________________________________________________________________________________Exemplu ↑
ActiveX Controls sunt definite la fel ca în Word.
Cuvântul cheie Me, dintr-o procedură eveniment a unui control ActiveX de
pe o foaie de calcul, se referă la foaia de calcul şi nu la control.
Dacă se definesc mai multe Sheet-uri numele controlului trebuie calificat cu
numele Sheet-ului:
Prof. univ. Emil Cosma 101 Documente Office active
'
Sheet2.CommandButton1.Caption = "Run"
'
Aplicaţii