Sunteți pe pagina 1din 101

Prof. univ.

Emil Cosma 1

VBA
Cuprins
O introducere în programare3

Macrocomenzi5
Înregistrarea unei macrocomenzi VBA5
Rezumat10

Editorul VBA11
Lansarea editorului VBA11
Mediul de editare VBA11
Module VBA13
Proceduri13
Identificarea modulelor15
Rularea modulelor16
Save şi Open pentru aplicaţiile Office şi modulele asociate16
Sistemul de asistenţă la scrierea codului16
Formulare VBA18
Crearea unui formular18
Rularea unui formular18
Proprietăţile formularului19
Rezumat21

Secvenţe de cod VBA22


Cuvintele22
Comentariile23
Tipuri de date24
Expresiile25
Operanzi25
Operatori25
Ordinea de evaluare a expresiilor26
Constante şi variabile27
Constante27
Variabile28
Instrucţiunea de atribuire29
Liste (arrays) de variabile30
Liste dinamice30
Aplicaţii31

Funcţii VBA predefinite 33


Funcţia Format33
Funcţii matematice34
Funcţii financiare34
Funcţii pe şiruri de caractere36
Funcţii pentru dată calendaristică şi timp37
Funcţii pentru conversii37
Funcţii pentru testarea tipului de date37
Aplicaţii38
Prof. univ. Emil Cosma 2
Programare structurată. Structuri de control VBA40
Introducerea/extragerea datelor41
InputBox41
MsgBox42
Structurile de control42
Instrucţiunea de selecţie simplă42
Instrucţiunea de selecţie multiplă43
Structurile repetitive45
Ciclul Do While (cu test iniţial) 45
Ciclul Do Until (cu test iniţial) 45
Ciclurile Do While şi Do Until cu test final46
Ciclul For … Next, cu număr finit de paşi47
Aplicaţii48

Module VBA51
Variabile locale (private) 51
Variabile publice (globale) 51
Variabile private52
Transmiterea argumentelor prin valoare şi prin referinţă54
Funcţii recursive55
Aplicaţii56

Formulare VBA60
Formulare (form-uri) 60
Proprietăţi şi metode61
Proprietatea Caption62
Proprietatea StartUpPosition63
Proprietatea Height şi Width63
Proprietăţile ForeColor şi BackColor64
Utilizarea controalelor64
65
65
68
70
72
73
74
77
79
80
Modificarea proprietăţilor din cod81
Aplicaţii86

Documente Office active91


Controale ActiveX (Word) 92
Controale Content (Excel) 95
Form Controls şi ActiveX Controls99
Aplicaţii101
Prof. univ. Emil Cosma 3 O introducere în programare

O introducere în programare

Un program de calculator este o listă de instrucţiuni care spun unui calculator ce


sarcini are de îndeplinit. Calculatorul rulează instrucţiunile până când ajunge la sfârşitul
programului. Fiecare linie dintr-un program este, de obicei, o singură comandă pe care
calculatorul trebuie să o execute, cum ar fi adunarea a două numere. Cu o succesiune
de comenzi calculatorul poate realiza mai multe: bilanţul unui carnet de cecuri, tipărirea
unui document, desenarea de imagini.

Programul de calculator (program sursă) poate fi scrise în limbaje diferite.


Calculatoarele înţeleg numai limbajul maşină (program obiect) – un şir de biţi. Limbajele
de programare ca BASIC (limbaj procedural simplu, creat în 1964) permit oamenilor să
scrie programe într-un limbaj asemănător limbii engleze. Unele limbaje de calculator,
cum ar fi câteva versiuni de BASIC, convertesc treptat un program în limbajul maşină,
pe măsură ce programul rulează, folosind ceea ce se numeşte interpretor. Alte limbaje,
cum ar fi Pascal şi C, folosesc un compilator pentru a converti integral programul,
înainte de a-l rula. Un compilator transformă programul într-un fişier executabil (.exe)
care poate fi rulat în mod direct. Cu câteva excepţii, majoritatea limbajelor de
programare ale calculatoarelor sunt însoţite de un compilator. În orice caz, toate
programele pot să fie citite de oameni şi trebuie să fie convertite în limbaj maşină,
pentru a putea fi interpretate de calculator.

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

 Convenţii (pentru redactare):

Simbol Semnificaţie

 Observaţii

 Indicaţii, menţiuni

 Aplicaţii

 Rezumat

În descrierea limbajului de programare Visual Basic se utilizează următoarele


notaţii:

[] - elementul este opţional;


| - variantă;
<tip> - tip de dată;
<valoare> - valoarea unei constante, a unei variabile sau a unei expresii;
<expresie> - expresie oarecare;
<condiţie> - condiţie (expresie logică).

Editorul de programe Basic colorează cuvintele pentru a facilita detectarea lor.


Sunt câteva culori implicite: verde pentru comentarii, albastru pentru cuvintele-
cheie, negru pentru elemente definite de utilizator (variabile şi constante). În
particular, se va utiliza simbolul , atunci când o linie de program depăşeşte
lungimea unui rând de text.


 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:

 înregistrarea acţiunilor utilizatorului (de exemplu: introducerea şi formatarea unui


text, rularea unor comenzi de meniu, lansarea opţiunilor din casetele de dialog
etc.) prin transpunerea lor în secvenţe de instrucţiuni Basic, care definesc un
script numit macrocomandă;

 gestionarea conţinutului documentului Office, cu care VBA-ul poate comunica;

 dezvoltarea unor programare independente de conţinutul documentului Office


(este necesară deschiderea, cel puţin formal, unei aplicaţii Word, Excel, etc.).

O macrocomandă (apelată printr-o comandă de meniu, apăsarea unei taste sau a


unui buton dintr-o bară de instrumente) reprezintă o listă de instrucţiuni - instrucţiuni
de macrocomandă (macro statements). Unele instrucţiuni execută operaţii specifice
macrocomenzii, însă cele mai multe corespund acţiunilor înregistrate ale utilizatorului.
Este, astfel, posibilă automatizarea activităţilor de rutină sau repetitive şi derularea lor,
prin lansarea macrocomenzilor.

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.

 Înregistrarea unei macrocomenzi VBA

Cea mai simplă metodă de creare a unei macrocomenzi este


utilizarea resursei Macro Recorder. Prin această metodă, operaţiunile
dorite a fi automatizate sunt înregistrate pas cu pas (editare text,
comenzi de meniu, casete de dialog …). Macro Recorder-ul transformă
toate operaţiile în instrucţiuni Basic corespunzătoare (module VBA).

Î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______________________________________________________________________________________________

În Word, macrocomanda poate fi asociată


cu un buton (Button) de pe o bară de in-
strumente, sau, cu o combinaţie de taste
(Keyboard) → Alt+, Ctrl+. Ea se poate stoca
(Store macro in) în orice şablon deschis
(devine astfel disponibilă pentru orice document
care foloseşte şablonul) sau în orice document
deschis (va putea fi utilizată doar în documentul
respectiv). Caseta de text Description conţine,
opţional, descrierea macrocomenzii.

În Excel, macrocomanda va fi plasată în


registrul de lucru curent, într-un registru de
lucru nou sau în registrul Personal Macro Workbook
(macrocomenzile vor fi disponibile în toate
registrele de lucru).

______________________________________________________________________________________________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:

• În PowerPoint, macrocomanda se poate memora în orice prezentare deschisă.


Ea va fi creată utilizând editorul VBA.
Prof. univ. Emil Cosma 7 Macrocomenzi

↓ Exemplu______________________________________________________________________________________________
Adăugarea (Word) unui buton de rulare a unei macrocomenzi, în Quick Access
Toolbar:

Quick Access Toolbar

 se deschide în editare un document;


 se iniţiază înregistrarea unei macrocomenzi, ;
 se stabileşte numele macrocomenzii (aici Antet) care va fi asociată unui buton
(Assign macro to, Button);
 în fereastra Word Option, Customize, , ;
 noul buton va apare în lista Quick Access:

 se acţionează butonul .
 din fereastra Modify Button se selectează un simbol (de
exemplu ):

 în Quick Access Toolbar va apare noul buton:

 se introduce, în fereastra documentului un text (pentru dată şi oră, se selectează


din tab-ul Insert, ):
Universitatea "Ovidius" Constanţa
Facultatea de Ştiinţe Economice
Data: 11 februarie 2007 Ora: 11:24
 se încheie înregistrarea apăsând butonul , din bara de stare;
Prof. univ. Emil Cosma 8 Macrocomenzi

 macrocomanda, fiind asociată documentului, poate fi utilizată oricând prin


acţionarea butonului (a se remarca actualizarea datei şi a orei):

Universitatea "Ovidius" Constanţa


Facultatea de Ştiinţe Economice
Data: 13 februarie 2007 Ora: 17:16

 vizualizarea conţinutului macrocomenzii , Edit în Editorul VBA:

În corpul macroinstrucţiunii apar instrucţiuni ale limbajului de programare Visual


Basic în care sunt transformate acţiunile utilizatorului. Acest instrucţiuni au mai multă
sau mai puţină semnificaţie, mai ales pentru un programator începător. Deocamdată,
important este faptul de a ştii că ele pot fi modificate.
______________________________________________________________________________________________Exemplu ↑

O macrocomandă obişnuită are următoarele elemente:


 Cuvântul cheie Sub (prescurtare de la subrutină) - acest cuvânt cheie
marchează începutul unei macrocomenzi.
 Numele macrocomenzii - după cuvântul cheie Sub este plasat numele unei
macrocomenzi urmat de paranteze.
 Comentariile - rânduri care încep cu un apostrof ('). Comentariile nu sunt
prelucrate atunci când macrocomanda este rulată.
 Instrucţiunile macrocomenzii - corpul principal al macrocomenzii (liniile
dintre cuvintele cheie Sub şi End Sub).
Prof. univ. Emil Cosma 9 Macrocomenzi


• Dacă, în bara de mesaje (Message Bar), este notificat faptul că executarea
macrocomenzilor nu este permisă, din motive de securitate,

utilizatorul poate lua decizia adecvată acţionând butonul .

• Rularea unei macrocomenzi se poate realiza şi prin shortcut-ul Alt+F8.

↓ 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():

 se salvează foaia electronică de calcul: Save as type, Excel Macro-Enabled


Workbook ;
 se deschide documentul Excel, dându-se permisiunea de executare a
macrocomenzilor: , Enable this content ;
 se poate introduce data curentă, în orice celulă (de exemplu în D4) utilizând
shortcut-ul Ctrl +d :
Prof. univ. Emil Cosma 10 Macrocomenzi

 vizualizarea conţinutului macrocomenzii , Edit în Editorul VBA:

 la executarea macrocomenzii se poate constata că, este introdusă data curentă,


dar cursorul se va deplasa, mereu, în celula B3 (pentru că, la înregistrarea
macrocomenzii, după introducerea funcţiei de dată calendaristică a fost apăsată
tasta Enter). Dacă, în editorul VBA, se şterge instrucţiunea
Range(”B3”).Select, activarea celulei B3 va fi anulată.
______________________________________________________________________________________________Exemplu ↑


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ă.

Lansarea editorului VBA

Activarea editorului VBE poate fi realizată în mai multe moduri:


 prin vizualizarea unei macrocomenzi înregistrate;
 prin shortcut-ul Alt+F11 (de fapt, acest shortcut este un comutator care
face trecerea între Visual Basic Editor şi aplicaţia de bază).

 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,
 .

 Mediul de editare VBA

Editorul de programe Basic oferă instrumente de lucru, cum ar fi:

 Bara de meniuri, MenuBar, conţine o serie de meniuri, fiecare dintre acestea


conţinând comenzi. De exemplu, se poate selecta comanda Run Sub/UserForm
din meniul Run. Multe dintre comenzile meniurilor au aşa-numitele taste rapide
(hotkeys) care se pot folosi pentru a selecta comanda direct din tastatură (F5 în
Prof. univ. Emil Cosma 12 Editorul VBA

cazul de faţă) – fără deschiderea meniului.

MenuBar

ToolBar

Fereastra
Project

Fereastra
de cod

Fereastra
Properties

 Bara de instrumente, Toolbar, furnizează acces la multe dintre comenzile cele


mai des utilizate în limbajul Visual Basic. Multe dintre butoanele din bara de
instrumente sunt doar modalităţi rapide de selectare a unei comenzi din meniuri.
De exemplu, butonul (Save) salvează documentul din proiectul curent, având
aceeaşi pictogramă şi acelaşi efect ca şi selectarea comenzii din meniul File.

 Fereastra Project oferă o trecere în revistă a obiectelor din proiectul curent. De


exemplu, un modul sau un formular utilizator (UserForm) va fi unul dintre aceste
obiecte. De fapt, în unele proiecte pot exista mai multe obiecte. Executând un clic
pe semnele plus(+) şi minus(-) de lângă dosarele din fereastra Project, se pot
afişa mai multe sau mai puţine detalii.

 Fereastra Properties afişează proprietăţile obiectului care este curent selectat.


Proprietăţile sunt atribute ale unui obiect. De exemplu, modulul are o proprietate
numită (Name) pentru identificarea acestuia.

 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

În Visual Basic Editor, macrocomenzile sunt grupate în aşa numitele module


(esenţa limbajului VBA). Modulele sunt secţiuni care grupează instrucţiuni Basic. Dacă
documentul Office are asociată o macrocomandă, instrucţiunile care o compun sunt
afişate în fereastra de cod. Pentru editarea propriilor module este necesară inserarea
acestora (prin meniu, Insert, sau utilizând butonul din Toolbar).

 Proceduri

Un modul este compus din una sau mai multe unităţi de bază numite proceduri.
Există două tipuri de proceduri:

 proceduri Sub (subrutine)

 proceduri Function (funcţii)

Pentru lucrul cu procedurile trebuie avută în vedere, în primul rând, definirea


grupului de instrucţiuni care vor constitui corpul procedurii şi, în al doilea rând apelul lor
(de câte ori este nevoie).

 Tratarea mai pe larg a acestor secţiuni de program va fi făcută în capitolul


Module VBA.
Proceduri Sub

O procedură Sub reprezintă un grup de instrucţiuni care primeşte, de la


programul apelant un şir de parametri, realizează anumite prelucrări, după care dă
controlul programului apelant.

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):

Sub NumeProcedură (argument1, argument2, …)


<instrucţiuni VBA>
[Exit Sub]
<instrucţiuni VBA>
End Sub

Apelul procedurii (cuvântul Call poate să nu apară):

[Call] NumeProcedură (parametru1, parametru2, …)

Argumentele de apel - 0, 1 sau mai multe - sunt în corespondenţă biunivocă cu


Prof. univ. Emil Cosma 14 Editorul VBA

parametrii de transmis. Această corespondenţă este determinată de ordinea şi


tipul argumentelor aflate în listă.

 În exemplificările următoare, pentru afişarea unor casete de mesaj, se va


utiliza funcţia MsgBox.

↓ 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

O funcţie definită de utilizator reprezintă un grup de instrucţiuni care primeşte un


set de parametrii (argumentele funcţiei) de la programul apelant şi îi returnează
acestuia valoarea. Numele unei funcţii poate intra în componenţa expresiilor de calcul
ca operand.

Definiţia sintactică este:

Function NumeFuncţie (argument1, argument2, …) [As <tip>]


<instrucţiuni VBA>
[Exit Function]
<instrucţiuni VBA>
End Function
Prof. univ. Emil Cosma 15 Editorul VBA

Apelul funcţiei se realizează prin numele funcţiei urmat de lista


parametrilor, pusă între paranteze.


 Î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:

 Se selectează modulul în fereastra Project Explorer.


 În fereastra Properties, proprietatea (Name), se tastează numele modulului.
Numele utilizat începe cu o literă, nu conţine spaţii sau semne de punctuaţie
(liniuţele de subliniere sunt acceptate) şi nu are mai mult de 31 de caractere.
Prof. univ. Emil Cosma 16 Editorul VBA

 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).

şi pentru aplicaţiile Office şi modulele asociate

Modulele create într-un document Office pot fi stocate în două moduri:

• Împreună cu documentul. În acest caz este necesar ca, la salvare, să se facă


precizarea tipului de fişier: Macro-Enabled (Save As type). Pentru un astfel
de fişier, atunci când se deschide, în Message Bar va apare mesajul:

Se poate permite executarea macrocomenzilor în fereastra Security Alert –


Macro (clic pe butonul Options…) :

• Separat, ca fişiere cu extensia .bas (fişiere Basic). Pe această cale se


exportă/importă modulul ca fişier .bas, de fapt un fişier text care cuprinde
codul VBA. Exportare/importarea unui modul este realizată prin meniul
editorului (File, Export File… Ctrl+E / File, Import File… Ctrl+M).

 Sistemul de asistenţă la scrierea codului

VBA oferă sugestii şi alternative în timpul tastării codului, prin instrumentul


IntelliSense, după ce s-a introdus un cuvânt-cheie care este recunoscut ca având
parametri. Editorul de program afişează lista valorilor posibile pentru respectivii parametrii.
Parametri semnifică proprietăţile unui control (care în cod se separă de numele controlului
prin punct), argumentele unei proceduri sau funcţii, tipurile de dată etc. Această facilitate se
numeşte Auto Members.
Prof. univ. Emil Cosma 17 Editorul VBA
Poziţionarea în listele respective se face mai uşor prin tastarea primelor litere ale
cuvântului dorit („Int" pentru Integer). Scrierea efectivă a cuvântului dorit are loc prin
apăsarea tastei Enter, tasta „virgulă" dacă se scriu elementele unei liste.

La tastarea liniilor de cod, VBA execută mai multe operaţii:

• Formatează culoarea fiecărui cuvânt din linie; în mod prestabilit, cuvintele


cheie din VBA sunt afişate cu albastru, comentariile cu verde, erorile cu roşu, iar
celelalte texte cu negru.

• Adaugă linii şi cuvinte noi, specifice limbajului. De exemplu, dacă se introduce


cuvântul cheie Sub urmat de numele procedurii, VBA adaugă automat o
pereche de paranteze rotunde după nume şi introduce o linie End Sub pentru
a marca sfârşitul procedurii.
• Cuvintele cheie sunt schimbate în formatul potrivit (dacă se tastează end sub,
VBA transformă expresia în End Sub la apăsarea tastei Enter.

• 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______________________________________________________________________________________________

 Într-un modul se tastează sub Salut,


 Se apasă tasta Enter,
 Se apasă tasta Tab,
 Se introduce textul msgbox(”Bun venit in VBA!”),
 Modulul va fi afişat astfel:

______________________________________________________________________________________________Exemplu ↑
Prof. univ. Emil Cosma 18 Editorul VBA

 Formulare VBA

Cu ajutorul formularelor (se poate utiliza şi termenul form) se defineşte


interfaţa grafică, asemănătoare cu cea editată în mediile de programare Visual Studio,
astfel că practica în VBA poate fi considerată introductivă către acestea.
În formular se pot introduce controale ActiveX (obiecte OLE) care permit
interacţiunea cu utilizatorul. Un control are atribute (proprietăţi) ajustabile şi sesizează
evenimente (este „viu”). Controalelor li se asociază secvenţe de cod, sub forma unor
proceduri, numite proceduri eveniment.
Crearea unui dialog utilizator (termenul utilizator este adăugat pentru
diferenţierea de dialogurile încorporate mediului) necesită parcurgerea mai multor
etape:
 crearea unui formular (UserForm), care constituie suportul pe care sunt
adăugate controalele;
 plasarea controalelor pe formular;
 stabilirea proprietăţilor pentru controale;
 scrierea procedurilor asociate controalelor, de răspuns la evenimentele
declanşate prin acţionarea lor.

 Crearea unui formular

În Visual Basic Editor crearea unui formular (prin meniu, Insert, sau
utilizând butonul din Toolbar) se realizează în modul de proiectare (design mode).

 Rularea unui formular

În modul de execuţie (run mode) controalele răspund evenimentelor. Pentru


rularea unui formular se acţionează, de obicei, butonul din ToolBar (aceeaşi
comanda se poate lansa şi prin meniu: Run, Run Sub/UseForm). Se pot rula doar
proiectele corecte sintactic (verificare prin compilare: Debug, Compile Project).
Prof. univ. Emil Cosma 19 Editorul VBA

Design Project Properties Toolbox


Mode Explorer (Ctrl+R) Window (F4)

Formular Caseta cu
instrumente
(Toolbox)

Fereastra UserForm include obiectul care are UserForm1 în bara de titlu. În


formular se pot introduce controalele care definesc interfaţa cu utilizatorul. Numele
proiectului apare în fereastra Project Explorer, iar proprietăţile formularului (dar şi
ale unui control din formular) sunt afişate în fereastra Properties. O linie punctată
gri şi punctele de dimensionare înconjoară obiectul selectat curent.

 Proprietăţile formularului

Proprietăţile formularului sunt afişate, alfabetic (Alphabetic) sau pe categorii


(tab-ul Categorized):
 Aparenţă (Appearence) : culorile utilizate, efectele vizuale de umplere etc.
 Comportare (Behaviour) : modul de continuare a acţiunilor la părăsirea
ultimului control de pe formular (Cycle) sau accesul utilizatorului la obiect
(Enabled).
 Font (Font) : fontul implicit (poate fi modificat pentru fiecare control în parte).
 Diverse (Misc) : numele formei, imaginea mouse-ului etc.
 Imagine (Picture) : imagini utilizate.
 Poziţie (Position) : poziţie şi dimensiuni.

Pentru a adăuga un control în formular se execută clic pe pictograma


corespunzătoare din Toolbox şi se trasează în fereastra formularului.
Prof. univ. Emil Cosma 20 Editorul VBA

Mărimea controlului se poate stabili utilizând punctele de dimensionare. Când se


plasează indicatorul mouse-ului deasupra unui punct de dimensionare, acesta îşi
modifică înfăţişarea pentru a indica direcţiile în care se poate trage acesta, ţinând
apăsat butonul stâng al mouse-ului.

Pentru a muta controlul, se plasează indicatorul mouse-ului deasupra sa, cursorul


acestuia transformându-se într-o pictogramă cu patru săgeţi. Butonul mouse-ului se ţine
apăsat şi se deplasează cursorul.

 Se pot redimensiona majoritatea controalelor, trăgând de punctele lor de


dimensionare. De asemenea se poate realiza deplasarea lor.

↓ 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

 La rularea programului ( ) va apare caseta de mesaj conţinând textul


”Bun venit in VBA”:

______________________________________________________________________________________________Exemplu ↑

 Tratarea mai pe larg a controalelor care definesc interfaţa grafică cu


utilizatorul va fi făcută în capitolul Formulare VBA.


 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

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.

Editorul de program colorează cuvintele pentru a facilita detectarea lor. Sunt


câteva culori implicite: verde pentru comentarii, albastru pentru cuvintele-cheie, negru
pentru elementele definite de utilizator (variabile şi constante) etc.

 Cuvintele

Prin reunirea caracterelor alfabetice, numerice, precum şi a unor caractere


speciale se formează cuvintele. Acestea se pot grupa în 2 categorii:
• cuvinte rezervate (cheie);
• cuvinte utilizator.

Cuvintele rezervate (cheie) aparţin limbajului şi au o semnificaţie predefinită,


motiv pentru care pot fi folosite numai în modul în care sunt specificate în formatele
generale (de exemplu: For, Next, Do, Loop, etc).

Cuvintele utilizator sunt create de programator atât pentru a defini datele ce se


prelucrează, programele, fişierele, procedurile, cât şi pentru a înscrie comentarii în
programe (de exemplu: cantitate, PU, Valoare, etc).


÷ 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

Un comentariu constituie o linie de cod care nu se execută, având în cuprins explicaţii


asupra altor porţiuni de cod (care, de regulă, urmează). În acest fel, la o parcurgere
ulterioară a codului, va fi facilitată înţelegerea acestuia. Comentariile incluse de
programatori la scrierea unei aplicaţii ajută foarte mult la modificarea sau întreţinerea
acesteia.

Un comentariu este deci un mesaj inclus într-o secvenţă de program cu diferite


scopuri, precum:
o identificarea programului;
o descrierea obiectivului general al programului;
o descrierea scopului fiecărei proceduri în parte;
o explicarea secvenţelor sau a calculelor mai complexe.

În Basic există două variante:


o Utilizarea instrucţiunii REM: desemnează un comentariu care se întinde pe
întreg rândul;
o Utilizarea unui apostrof (') la începutul comentariului: în acest caz se pot scrie
comentarii şi după o instrucţiune, pe acelaşi rând.

Liniile de comentarii nu sunt executate şi nu sunt vizibile în momentul execuţiei


aplicaţiei - Basic ignoră la execuţie liniile care încep cu REM sau apostrof.

↓ 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

Sub Calc_Impozit(Salariu As Single)


'Procedura de calcul a impozitului
Dim Impozit As Single 'variabila pentru memorarea
'impozitului
'Se utilizeaza 2 variabile:
'una pentru suma fixa si una pentru procent.
Dim SumaFixa, Procent As Single
'calculul impozitului
Impozit = SumaFixa + Salariu * Procent / 100
End Sub
______________________________________________________________________________________________Exemplu ↑

 Tipuri de date

Există 3 mari categorii de date: numerice, şir de caractere (string) şi speciale.


Încadrarea unei date într-o anume categorie este absolut necesară pentru a putea
efectua calcule sau alte prelucrări. Un şir de caractere este o secvenţă de zero sau mai
multe caractere care sunt tratate ca o entitate. Visual Basic lucrează cu şiruri de
caractere de lungime fixă sau variabilă. Tipul de dată considerat implicit este Variant,
care indică o dată de tip nespecificat. La preluarea acestei date într-o secvenţă de cod
este necesară conversia ei în tipul corespunzător prelucrării ce urmează.

Tipul Descriere Lungime Interval de valori


(byte)

Boolean Date de tipul logic 1 True sau False

Byte 1 0  255

Integer Numere întregi 2 -32.768  32.767

Long 4 -2.147.483.648  2.147.483.647

Currency 8 -922.337.203.685.477,5808 
Format monetar
922.337.203.685.477,5807

Single 4 -3.4028235E+38  -1.401298E-45

Numere zecimale în 1.401298E-45  3.4028235E+38

Double virgulă flotantă


8 -1,797.693.134.86232E308 
(pentru aplicaţii
-4,940.656.458.41247E-324 şi
ştiinţifice)
4,940.656.458.41247E-324 
1,797.693.134.86232E308

Date Date calendaristice 8 1 ian. 100  31dec. 9999


şi de timp
String Şir de caractere
Prof. univ. Emil Cosma 25 Secvenţe de cod VBA

Object Obiecte (cum ar fi 4


controale şi
formulare)

Variant Date de orice tip,


utilizat atunci când
tipul acestora este
incert

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 ↑

 Expresiile (de calcul)

Relaţiile de calcul se transpun în expresii formate din:

 Operanzi care pot fi:


 Constantele.
 Variabilele.
 Funcţiile (Basic sau utilizator).

 Operatori.
Operatorii leagă operanzi de acelaşi tip. Operatorii folosiţi în programele Basic
sunt următorii :

 Operatorii aritmetici - leagă operanzi numerici.


Operator Descriere
+ adunare
- scădere
Prof. univ. Emil Cosma 26 Secvenţe de cod VBA

* înmulţire
/ împărţire
\ câtul unei împărţiri cu rest
Mod modulo (restul împărţirii)
^ ridicare la putere

 Operatorii relaţionali - produc rezultate de tip boolean.


Operator Descriere
< strict mai mic
> strict mai mare
= egalitate
<> sau >< diferit
<= sau =< mai mic sau egal
>= sau => mai mare sau egal

 Operatorii logici - leagă expresii logice.


Operator Descriere
NOT Rezultatul este adevărat dacă operandul este
(nu) fals şi invers (Not X).
AND Rezultatul este adevărat când cei doi operanzi
(şi) sunt adevăraţi (X And Y).
OR Rezultatul este adevărat dacă unul din operanzi
(sau) este adevărat (X OR Y)
XOR Rezultatul este adevărat dacă unul din operanzi
(sau exclusiv) este adevărat. Dacă ambii operanzi sunt, sau
adevăraţi, sau falşi, rezultatul este fals.

 Operatorul de concatenare a şirurilor: &

Ordinea de evaluare a expresiilor

Dacă o relaţie sau o expresie cuprinde simultan operatori aritmetici, relaţionali şi


logici ordinea de evaluare este :
Operator Prioritate
Operatorii aritmetici sau & 0 (maximă)
Operatorii relaţionali 1
Operatorii logici 2
Prof. univ. Emil Cosma 27 Secvenţe de cod VBA

Pentru expresiile aritmetice:


Operator Prioritate
Operatorul unar (semn +, -) 0
Ridicarea la putere 1
Înmulţirea şi împărţirea 2
Adunarea şi scăderea 3
Parantezele pot modifica ordinea de efectuare a operaţiilor.

↓ Exemplu______________________________________________________________________________________________
(3 + 2) * (4 + 1) 25
102 / 4 25.5
102 \ 4 25
102 Mod 4 2
______________________________________________________________________________________________Exemplu ↑

 Constante şi variabile

Ca toate limbajele de programare, Basic permite utilizarea memoriei calculatorului


pentru stocarea datelor utilizate de programele ce se execută. Conţinutul acestor zone
de stocare este asociat unor identificatori, cuvinte cărora li se asociază o valoare
definită prin unul din tipurile de date menţionate.


÷ 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

O constantă este un identificator a cărui valoare asociată nu se modifică pe


parcursul unui program. Constantele se pot declara (explicit) cu instrucţiunea:

Const <NumeConstantă> [As <tip>] = <expresie>


Prof. univ. Emil Cosma 28 Secvenţe de cod VBA

↓ Exemplu______________________________________________________________________________________________
Const PI As Double = 3.1416, Raza As Integer = 25
Const LungimeCerc = 2 * PI * Raza
_____________________________________________________________________________________________Exemplu ↑

 Constantele de tip String se scriu între ghilimele.


↓ Exemplu______________________________________________________________________________________________
"Parvulescu Andrei"
"Constanta"
"204712"
"Str Trifoiului nr 5"
"#%$"
"" 'este şirul nul pentru că intre ghilimele
'nu este specificat nici un caracter
_____________________________________________________________________________________________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

Numai o parte a datelor dintr-o aplicaţie sunt constante. O variabilă este un


identificator al unei porţiuni din memoria calculatorului, a cărui conţinut poate fi schimbat
prin program. Fiecare variabilă este de un anumit tip care impune lungimea zonei de
memorie ocupată de aceasta.

Pentru declararea explicită a variabilelor se utilizează instrucţiunea Dim. Aceasta este


plasată la începutul programului, indicând că, undeva pe parcurs, vor fi necesare variabilele
declarate. Formatul instrucţiunii de declarare este:

Dim <NumeVariabilă> As <tip>


Prof. univ. Emil Cosma 29 Secvenţe de cod VBA

 Instrucţiunea Dim se poate plasa oriunde într-o procedură, dar se recomandă


scrierea sa la începutul acesteia. Nu se pot defini două variabile cu acelaşi nume
în aceeaşi procedură.
↓ Exemplu______________________________________________________________________________________________
Dim Raza As Single, LungimeCerc As Single
Dim Contor As Integer
_____________________________________________________________________________________________Exemplu ↑

 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

Prin instrucţiunea de atribuire, unei variabile i se asociază valori. Formatul ei este:

<NumeVariabilă> = <expresie>

<expresie> poate fi o constantă, o expresie matematică sau o altă variabilă.

↓ 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

 Declaraţiile constantelor şi a variabilelor pot fi explicite sau implicite, iar Basic


suportă ambele tipuri de declaraţii. Declararea implicită are loc o dată cu prima
instrucţiune de atribuire, VBA atribuind automat tipul cel mai adecvat.

↓ 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

'dar prin instrucţiunea de atribuire:


Raza = 25& 'raza este considerată de tip Long
_____________________________________________________________________________________________Exemplu ↑

 Liste (arrays) de variabile

Termenul englezesc array are în terminologia românească doi corespondenţi: listă


sau vector, pentru tablourile cu o singură dimensiune, matrice pentru tablourile cu 2
dimensiuni. Termenul tablou, care corespunde direct celui array, este mai utilizat când
sunt definite mai multe dimensiuni.

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

1. Să se editeze un modul pentru declararea şi afişarea următoarelor variabile: nume


(student), prenume, vârsta, anul (de studii), taxă (plătitor de taxă), alegând tipurile
de dată adecvate.

 Se lansează un program Office, se lansează Editorul Basic (Alt+F11), se inserează un


modul având următorul conţinut (declaraţiile explicite cu Dim nu sunt obligatorii):
Sub DatePersonale()
Dim nume As String, prenume As String
Dim varsta As Integer, anul As Integer
Dim taxa As Boolean
nume = "Parvulescu"
prenume = "Andrei"
varsta = 21
anul = 2
taxa = True
MsgBox(nume & " " & prenume & " Vârsta " & 
varsta & " Anul " & anul & " Taxa " & taxa)
End Sub
Ca urmare a executării secvenţei se va afişa următoarea casetă de text:
Prof. univ. Emil Cosma 32 Secvenţe de cod VBA

2. Să se scrie o secvenţă de program în care să se declare o listă de salarii (ale unor


salariaţi), pentru care se va calcula un salariu mediu:

 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:

3. Pentru calculul valorii de viitor a unei investiţii (MyFv) se utilizează formula:

(1 + Rate) Nper − 1
MyFV = Pmt *
Rate

Unde:
Pmt – reprezintă plăţile,
Rate – este rata dobânzii,
Nper – numărul de perioade.

Să se scrie un program pentru calculul depunerilor băneşti cu dobândă.

 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

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

Se utilizează, în special, pentru a specifica modul de afişare a numerelor:


Format ( <expresie>, <strFormat>)

<expresie> poate fi o variabilă, o constantă sau o expresie formată din acestea.


<strFormat> este una dintre valorile predefinite prezentate în tabelul următor sau
formatul de afişare definit de utilizator sub forma unui şir de caractere. Fiecare caracter
# indică o cifră, iar 0 precizează dacă apar în completare zerouri, la început sau la
sfârşit.

<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ţiile matematice şi trigonometrice au ca argumente şi ca rezultate valori


numerice.

Funcţia Descriere Exemple


Int Numărul întreg mai mic sau egal Int(-8.4) -9
Int(8.4) 8
Fix Partea întreagă Fix(-8.4) -8
Fix(8.4) 8
Abs Valoarea absolută Abs(-7.2) 7,2
Sgn Semnul unei expresii Sgn(-2/3) -1
Rnd Numere aleatoare subunitare Int((100 * Rnd) + 1) 83 ?
numere între 1 şi 100
Exp e la puterea x e = Exp(1) 2,7182…
Log Logaritmul natural (baza e) Log(e) 1
În baza 10 : log(x)/log(10) Log(1000)/Log(10) 3
Sqr Radical indice 2 Sqr(9) 3
Atn Arctangentă Pi = 4*Atn(1) 3,1415…
Sin Sinus Sin(Pi/2) 1
Cos Cosinus Cos(Pi) -1
Tan Tangentă Tan(Pi/4) 1

 Funcţii financiare

Funcţiile financiare efectuează calcule obişnuite pentru afaceri, ca de exemplu


determinarea plăţii pentru un împrumut, valoarea viitoare sau valoarea netă actualizată
a unei investiţii şi valorile obligaţiunilor sau cupoanelor.
Argumentele comune pentru funcţiile financiare includ:
 Valoarea viitoare (fv) – valoarea investiţiei sau împrumutului după ce s-au
efectuat toate plăţile.
 Numărul de perioade (nper) – numărul total de plăţi sau perioade ale unei
investiţii.
 Valoarea actualizată (pv) – valoarea unei investiţii sau a unui împrumut la
începutul perioadei de investiţie. De exemplu, valoarea actualizată a unui
împrumut este capitalul de bază care este împrumutat.
 Rata (rate) – rata dobânzii sau rata de actualizare pentru un împrumut sau o
investiţie.
 Tip (type) – intervalul la care sunt efectuate plăţile în timpul perioadei de
plată, ca de exemplu la începutul unei luni sau la sfârşitul acesteia ( 0 sau 1,
implicit 0).
Prof. univ. Emil Cosma 35 Funcţii VBA predefinite

 Unele funcţii financiare se folosesc pentru anuităţi. O anuitate constă dintr-o


serie de plăţi constante efectuate pe o perioadă continuă (de exemplu un
împrumut pentru un autoturism, sau un împrumut ipotecar).
În funcţiile de anuităţi, sumele plătite, cum ar fi depozitele pentru
economii, sunt reprezentate de numere negative; sumele primite, cum ar fi
un cec de dividente, sunt reprezentate prin numere pozitive.
Se recomandă consecvenţă în legătură cu unităţile utilizate pentru
specificarea argumentelor rate şi nper (de exemplu, pentru plăţi lunare la un
împrumut pe un număr de ani, rata dobânzii va fi împărţită întotdeauna cu 12, iar
nper va fi înmulţit cu 12 şi cu numărul de ani).

Cele mai importante funcţii financiare sunt incluse în tabelul următor:

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

b) Calculul depunerii bancare pentru returnarea lunară a 150 unităţi monetare


(dobânda anuală 9,5%, 12 ani):

depozit= PV(9.5 / 100 / 12, 13 * 12, 150)

c) Numărul de luni necesare atingerii unui sold de 2000 unităţi monetare


(depunere lunară 100, dobânda anuală 9,5%):

NrdeLuni = NPer(9.5 / 100 / 12, -100, -2000)


(e necesară o rotunjire, 18,64 ≈ 19)

d) Pentru un împrumut bancar de 13000 unităţi bancare, pe 12 ani, dobânda


anuală 9,5%, plăţile lunare sunt:
PlataLunara = Pmt(9.5 / 100 / 12, 12 * 12, 13000)

e) Dobânda datorată în al doilea an, pentru un împrumut de 13000 unităţii


monetare, pe 12 ani, (dobânda anuală 9,5%):

Dobanda2 = IPmt(9.5 / 100, 2, 12, 13000)


______________________________________________________________________________________________Exemple ↑

 Funcţii pe şiruri de caractere

Aceste funcţii realizează prelucrări simbolice asupra unor şiruri de caractere.

Funcţia Descriere Exemple


Asc Codul unui caracter Asc("B") 66
Len Numărul de caractere din şir Len("Visual Basic") 12
Ucase Litere mari UCase("abc") "ABC"
Lcase Litere mici LCase("ABC") "abc"
LTrim Elimina spaţiile din stânga LTrim(" def") "def"
RTrim Elimina spaţiile din dreapta RTrim("def ") "def"
Trim Elimina spaţiile de la capete Trim(" def ") "def"
Mid Extrage un subşir Mid("abcdef", 3, 2) "cd"
Space Generează spaţii "a" + Space(5) + "b" "a b"
Replace Înlocuieşte un şir cu alt şir Replace("As","s","ce") "Ace"
Left Extrage un subşir stânga Left("abcef", 3) "abc"
Right Extrage un subşir dreapta Right("abcef", 3) "cef"
Prof. univ. Emil Cosma 37 Funcţii VBA predefinite

 Funcţii pentru dată calendaristică şi timp

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.

Funcţia Descriere Exemple


Now Data si ora curentă Now 17.03.2007 17:01:08
Date Data curentă Date 17.03.2007
Time Ora curentă Time 17:01:08
Day Ziua Day(Date) 17
Month Luna Month(Date) 3
Year Anul Year(Date) 2007
DateSerial Data specificată DateSerial(2007,2,17) 17.02.2007
TimeSerial Ora specificată TimeSerial(18, 5, 27) 18:05:27
DateAdd*** Adună la o dată x=DateAdd("d", 10, Date) 04.07.2007
DateDiff*** Diferenţa dintre date DateDiff("d", Date, x) 10
DatePart ***
Un interval de timp DatePart("m", Date) 3
Primul argument reprezintă intervalul de timp (d – ziua, m – luna, q – trimestrul, y – ziua
***

din an, w – ziua din săptămână, ww - săptămâna, yyyy – anul)

 Funcţii pentru conversii

Se utilizează pentru a converti argumentul într-o dată de tipul specificat de funcţia


utilizată.
Funcţia Exemple
Chr Chr(65) "A"
Str Str(-14.34) "-14.34"
Val Val(" 1615 198Constanta") 1615198
CBool CBool(4 > 5) False
CByte CByte(12 * 13) 156
CInt CInt(1725.6 - 1700) 26
CSng CSng(17 / 18) 0,9444444
CDbl CDbl(1 / 2.0E+99) 5E-100
CDate CDate(#3/17/2007#) 17.03.2007

 Funcţii pentru testarea tipului de date

Funcţiile pentru testarea tipului de date sunt denumite şi funcţii pentru


inspectarea datelor, stabilind dacă o expresie, sau o variabilă, este sau nu este de un
anume tip.
Prof. univ. Emil Cosma 38 Funcţii VBA predefinite

Funcţia Descriere Exemple


IsDate Argumentul este o IsDate(#3/17/2007#) True
IsNumeric expresie IsNumeric(12.3) True
VarType Argumentul este o
variabilă
0 - Empty
1 - Null
2 - Integer
3 - Long
4 - Single VarType("Basic") 8
5 - Double
6 - Currency
7 - Date
8 - String

 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))

3. Scrieţi o secvenţă program prin care să determinaţi a câta zi de naştere sărbătoriţi


astăzi.


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

5. Ca urmare a depunerii cu o dobândă anuală de 15% a unei sume, o bancă


returnează lunar 400 de lei timp de şase ani. Care este valoarea acestei sume?
Răspuns: -18.917 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

8. Returnarea unui împrumut bancar se poate realiza în plăţi constante (care se


determină cu funcţia Pmt) sau în plăţi variabile (valoarea împrumutului/ numărul de
perioade + dobânda calculată prin Ipmt). Suma plăţilor constante este egală cu suma
plăţilor variabile. Să se verifice această situaţie pentru un împrumut de 4000 lei
returnabil în 4 luni cu o dobândă lunară de 2%.


'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

Programare structurată. Structuri de control VBA

Procesul de rezolvare a problemelor cu ajutorul calculatorului constă în două


activităţi: dezvoltarea algoritmului şi reprezentarea acestuia ca program. Procesul de
elaborare al algoritmului reprezintă etapa cea mai importantă, obligatorie şi de cele mai
multe ori cea mai dificilă. Descoperirea algoritmului înseamnă găsirea unei metode de
rezolvare a problemei, claritatea şi calitatea acestuia impunând fiabilitatea şi calitatea
programului. În contextul dezvoltării programelor, etapele de rezolvare ale problemelor
corespund cu cele definite de matematicianul G. Polya, în 1945:

 Înţelegerea problemei este etapa cea mai importantă şi constă în:


• definirea datelor de intrare (tip, proprietăţi, domeniul valorilor),
• definirea rezultatelor (ieşirile),
• stabilirea relaţiilor dintre date şi rezultate.
 Conceperea modului de rezolvare a problemei şi descrierea acestuia printr-un
algoritm.
 Reprezentarea algoritmului ca program.
 Evaluarea programului din punct de vedere al corectitudinii şi ca potenţial
instrument pentru rezolvarea altor probleme.

În practica reprezentării algoritmilor se utilizează diverse forme cum ar fi


schemele logice, limbajul algoritmic (pseudocod), limbajele de programare, însă,
indiferent de modul de descriere al acestora, se stabileşte o mulţime bine definită de
blocuri elementare la care se au în vedere două elemente: sintaxa şi semantica (sintaxa
se referă la reprezentarea simbolică a acestora, în timp ce semantica la semnificaţia
lor).

Ansamblul de instrucţiuni ale limbajului de programare, alese pentru


reprezentarea algoritmilor, trebuie să fie adaptat la specificul de calcul electronic. De
obicei aceste instrucţiuni sunt definite la un nivel mai înalt decât cel oferit de limbajul în
cod maşină, astfel încât abordarea construcţiei şi analizei algoritmilor se face prin
prisma unor concepte moderne, cum ar fi principiile programării structurate.

Programarea structurată (introdusă în 1972 de E.W. Dijkstra, fundamentarea


matematică fiind făcută de Böhm şi Jacopini într-un articol publicat în 1966) este o
metodă de codificare a algoritmilor de calcul, prin definirea unui set de instrucţiuni
grupate în trei structuri fundamentale: secvenţa, selecţia şi ciclul.
Prof. univ. Emil Cosma 41 Programare structurată. Structuri de control VBA
 Secvenţa, tradusă în instrucţiuni simple (instrucţiunea de atribuire, instrucţiunea de
apel subprogram, instrucţiuni de intrare/ieşire, subprograme).

Instrucţiune 1 Instrucţiune 2 Instrucţiune n

 Selecţia, (structura alternativă) - If … Then … End If.

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

 Introducerea/extragerea datelor (funcţiile InputBox şi MsgBox


într-o formă simplificată)

 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ă:

<variabilă> = InputBox(<mesaj>, [<titlu>])

↓ 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)

<variabilă> = MsgBox(<mesaj> [,<constantă>] [,<titlu>])

<constantă> poate fi:


O(zero) - va apărea doar butonul Ok
1 - butoanele Ok şi Cancel
(<variabilă> va fi 1 sau 2)
2 - butoanele Abort Retry şi Ignore
(<variabilă> va fi 3, 4 sau 5)
3 - butoanele Yes No şi Cancel
(<variabilă> va fi 6, 7 sau 2)
4 - butoanele Yes No
(<variabilă> va fi 6 sau 7)
↓ Exemplu______________________________________________________________________________________________
Sub test()
raspuns = MsgBox("TEST", 1)
MsgBox(raspuns)
End Sub

______________________________________________________________________________________________Exemplu ↑

 Structurile de control

 Structurile selective

 Instrucţiunea de selecţie simplă

If <condiţie> Then
<instrucţiuni 1>
[Else
<instrucţiuni 2>]
End If
Prof. univ. Emil Cosma 43 Programare structurată. Structuri de control VBA

Instrucţiunea de selecţie simplă condiţionează execuţia unor seturi de instrucţiuni


prin evaluarea expresiei logice reprezentată în <condiţie>. Dacă expresia logică
<condiţie> este True se va executa grupul <instrucţiuni 1>.
În cazul valorii False a condiţiei apar două cazuri:
• dacă există clauza Else se va executa grupul <instrucţiuni 2>.
• în absenţa clauzei Else nu se execută nici o instrucţiune, comanda terminându-
se imediat.

↓ 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 ↑

 Instrucţiunea de selecţie multiplă

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.

Select Case <expresie>


Case <listă de valori 1> | Is <condiţie 1>
<instrucţiuni 1>
Case < listă de valori 2>| Is <condiţie 2>
<instrucţiuni 2>
….
[Case < listă de valori n>| Is <condiţie n>
<instrucţiuni n>
[Case Else
<instrucţiuni>]
End Select
Prof. univ. Emil Cosma 44 Programare structurată. Structuri de control VBA

 Selecţie după listă de valori. În funcţie de valoarea efectivă a expresiei, care


poate fi numerică sau caractere, se va executa un singur bloc de instrucţiuni.
Dacă expresia are o valoare ce nu se regăseşte între valorile prevăzute, se va
executa - dacă s-a specificat - blocul de instrucţiuni de după Case Else (altfel,
nu se execută nimic). În lista de valori, elementele listei sunt separate prin
virgulă. Se poate folosi şi clauza To (pentru precizarea unui interval de valori).

↓ 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 ↑

 Selecţie după condiţie. Pentru a extinde posibilităţile de utilizare a structurii


alternative, se foloseşte un format care permite compararea expresiei cu o
valoare, folosind alt operator decât cel de egalitate (clauza Is).

↓ Exemplu______________________________________________________________________________________________
Pentru citirea a două note de la tastatură şi afişarea unor calificative se poate utiliza
următoarea secvenţă program:

Dim Nota1 As Integer, Nota2 As Integer


Nota1 = InputBox("Prima nota este:")
Nota2 = InputBox("A doua nota este:")
Media = (Nota1 + Nota2) / 2
Select Case Media
Case Is < 5
Calificativ = "Nesatisfacator"
Case Is <= 7
Calificativ = "Slab"
Case Is <= 8
Prof. univ. Emil Cosma 45 Programare structurată. Structuri de control VBA
Calificativ = "Bine"
Case Is < 10
Calificativ = "Foarte bine"
Case 10
Calificativ = "Felicitari"
Case Else
Calificativ = "Eroare"
End Select
r = MsgBox(Calificativ, , Media)

______________________________________________________________________________________________Exemplu ↑

 Structurile repetitive

 Ciclul Do While cu test iniţial („execută cât timp…”)

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.

 Ciclul Do Until cu test iniţial („execută până când…”)

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

Rezultă că 6 (10) = 110 (2)


Dim NumarZecimal As Integer
Dim SirulResturilor(30) As Integer
Dim NumarBinar As String
NumarBinar = ""
NumarZecimal = InputBox("Numarul zecimal")
câtul = NumarZecimal
indice = 0

Do While câtul > 0


SirulResturilor(indice) = câtul Mod 2
câtul = câtul \ 2
indice = indice + 1
Loop

Do Until indice = 0
indice = indice - 1
NumarBinar = NumarBinar & SirulResturilor(indice)
Loop

r = MsgBox(NumarBinar, , NumarZecimal)

 indice reprezintă poziţia în şirul resturilor (rezultate prin împărţiri succesive la


2);
 SirulResturilor conţine valorile cifrelor binare (dar în ordine inversă) şi este o
variabilă de tip Array completată in ciclul Do While;
 NumarBinar este şirul caracterelor binare, compus în ciclul Do Until;
 MsgBox afişează numărul zecimal şi numărul binar.
______________________________________________________________________________________________Exemplu ↑

 Ciclurile Do While şi Do Until cu test final

Există variante ale instrucţiunilor Do While şi Do Until care permit execuţia


condiţionată a secvenţei de instrucţiuni, cel puţin o dată:
Prof. univ. Emil Cosma 47 Programare structurată. Structuri de control VBA

Do
<instrucţiuni>
[Exit Do]
[<instrucţiuni>]
Loop While | Until <condiţie>

 Ciclul For … Next, cu număr finit de paşi

For <valoare> = <valoare 1> To <valoare 2> [Step <valoare 3>]


<instrucţiuni>
[Exit For]
<instrucţiuni>
Next [<valoare>]

În ciclul For … Next grupul de instrucţiuni, constituind corpul acestuia, se execută


după valorile variabilei contor <valoare>, într-un interval specificat prin <valoare 1> şi
<valoare 2>. Variabila contor se incrementează implicit cu 1, dacă nu este precizat
pasul (Step) sau cu valoarea <valoare 3> dacă apare clauza Step. Variabila contor
primeşte o valoare iniţială (<valoare 1>). După fiecare ciclu, contorul este incrementat şi
comparat cu valoarea finală (<valoare 2>). Dacă nu s-a ajuns la valoarea finală, execuţia
ciclului de instrucţiuni se reia, în caz contrar trecându-se la linia de după Next. Exit For are
acelaşi rol ca Exit Do de la comenzile Do. . . Loop.

↓ 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

1. Să se editeze şi să se execute secvenţele de program prezentate ca exemple pentru


utilizarea instrucţiunilor de control.

2. Să se calculeze preţul de vânzare al unui produs pe două variante de adaos


comercial:

valoare *110% dacă valoare  100,


preţul  
valoare *115% dacă valoare  100


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)

3. Notând cu a, b, c trei valori pozitive să se stabilească dacă segmentele de dreaptă


corespunzătoare acestora pot constituii un triunghi. În caz afirmativ să se
stabilească natura acestui triunghi (oarecare, isoscel, echilateral) şi să i se calculeze
perimetrul.

 Trei segmente de dreaptă pot forma un triunghi dacă fiecare este strict mai
mic ca suma celorlalte două.

Dim a As Single, b As Single, c As Single


a= InputBox("Latura a")
b = InputBox("Latura b")
c = InputBox("Latura c")
If a < b + c And b < a + c And c < a + b Then
perimetrul = a + b + c
Select Case True
Case a = b And b = c
mesaj = "Tringhiul este echilateral"
Case a = b Or a = c Or b = c
mesaj = "Tringhiul este isoscel"
Case Else
mesaj = "Triunghiul este oarecare"
End Select
MsgBox(mesaj & " iar perimetrul este: " & perimetrul)
Else
MsgBox("Cele trei segmente nu formeaza un triunghi")
End If
Prof. univ. Emil Cosma 49 Programare structurată. Structuri de control VBA

4. Se consideră polinomul:

P(x) = a n xn + a n-1 xn-1 + … + a 1 x + a 0

Să se calculeze valoarea P(b) a polinomului pentru o valoare dată, b, a


necunoscutei x.

 Se citesc gradul polinomului, şirul coeficienţilor şi b. Se aplică relaţiile de recurenţă:


P = an
P = P*b + a i , i=n-1, … ,1, 0

Dim n As Integer, b As Integer


Dim a() As Integer
n = InputBox("Gradul polinomului")
ReDim a(n + 1)
For i = 0 To n
a(i) = InputBox("a" & i)
Next
b = InputBox("Valoarea lui b")
P = b
For i = n - 1 To 0 Step -1
P = P * b + a(i)
Next
MsgBox("Valoarea polinomului= " & P)

5. Să se calculeze, folosind ciclurile cu test iniţial şi final, suma numerelor naturale


pare, strict mai mici decât un număr natural n dat.


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)

6. Considerând un şir de numere întregi să se calculeze maximul şi minimul


elementelor din şir, precum şi suma lor.


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)

7. Într-un sondaj de opinie este intervievat un eşantion de n persoane, pe grupuri de


vârstă. Răspunsurile posibile sunt: ”d” (da), ”n” (nu), ”x” (nu ştiu). Să se editeze o
secvenţă program care să contorizeze şi să afişeze răspunsurile intervievaţilor.


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.

În general, programatorii preferă să pună procedurile de utilitate generală în


module. Se includ aici procedurile necesare în mai multe aplicaţii. Pentru a adăuga un
modul extern se acţionează butonul (Module), din linia de butoane standard (prin
meniu Insert, Module). Noul modul apare în structura proiectului iar în fereastra de cod
se poate scrie codul necesar.

Din punct de vedere al referirii variabilelor de lucru, din diferite zone ale
programului, se deosebesc două tipuri de variabile:

 Variabile locale accesibile doar în procedura în


care au fost definite. Ele sunt declarate prin Dim, Redim sau Static.
Variabilele declarate cu Static îşi păstrează valorile pe tot timpul execuţiei
programului, spre deosebire de cele declarate prin Dim sau Redim care sunt
şterse din memorie la terminarea procedurii.
↓ Exemplu______________________________________________________________________________________________
Sub test()
Static Dobanda As Single
Dobanda = 3 / 100
'...
End Sub
______________________________________________________________________________________________Exemplu ↑

 Variabile publice (globale) accesibile din orice procedură – prin declaraţia


Public.
Prof. univ. Emil Cosma 52 Module VBA

↓ Exemplu______________________________________________________________________________________________
Sub test()
Static Dobanda As Single
Dobanda = 3 / 100
'...
End Sub
'...
Public rataDobanzii As Single
'...
______________________________________________________________________________________________Exemplu ↑

 Variabile private limitate la un modul sau procedură – prin declaraţia


Private.
↓ Exemplu______________________________________________________________________________________________
'...
Private 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

Apelul procedurii şi transmiterea parametrului Valoare:

()
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

SirOrdonat = SirOrdonat & a(i) & " "


Next
MsgBox(SirOrdonat)
End Sub
()
O funcţie ValoareTva, pentru calculul valorii TVA, poate fi definită într-un modul
extern:
Function ValoareTva(val As Single) As Single
ValoareTva = val * 0.19
End Function
Apelul funcţiei şi transmiterea parametrului Valoare se poate realiza în acelaşi
modul sau dintr-un modul extern:
Sub test()
Dim Valoare As Single, v As Single
Valoare = InputBox("Care este valoarea?")
'
v = ValoareTva(Valoare) 'apelul functiei
'
MsgBox("Valoarea Tva:" & v)
End Sub
()
Pentru calculul sumei 1+1/2+ … +1/n se defineşte următoarea funcţie:
Function Suma(n As Byte)
Dim s As Single
s = 0
For i = 1 To n
s = s + 1 / i
Next
Suma = s
End Function
Apelul funcţiei şi transmiterea parametrului n:
Sub test()
Dim n As Byte, v As Single
n = InputBox("?n")
'
v = Suma(n) 'apelul functiei
'
MsgBox("Pentru " & n & " elemente: " & v)
End Sub
______________________________________________________________________________________________Exemple ↑

Transmiterea argumentelor prin valoare şi prin referinţă

Există două variante de transmitere a argumentelor, stabilindu-se astfel dacă


procedura, care le primeşte, le poate modifica şi transmite înapoi:
 Dacă se transmit prin valoare (cuvânt cheie ByVal), procedura apelată poate

modifica valorile, dar aceste modificări nu se vor transmite procedurii


apelante. Transmiterea prin valoare protejează variabilele transmise, valorile
Prof. univ. Emil Cosma 55 Module VBA

lor neputând fi modificate în procedura apelantă (procedura apelată primeşte


copii ale variabilelor din procedura apelantă). Se recomandă transmiterea
datelor prin valoare, atunci când modificarea lor nu e necesară sau e riscantă.
 Dacă se transmit prin referinţă (cuvânt cheie ByRef), procedura apelată poate
modifica valorile variabilelor transmise, modificări care sunt apoi transmise
procedurii apelante. Transmiterea prin referinţă (sau adresă) permite
procedurii să actualizeze variabilele, modificările fiind percepute de variabile şi
în procedura apelantă. După ce acesta redobândeşte controlul, variabilele
transmise şi modificate vor rămâne cu noile valori.

↓ 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

Apelul funcţiei şi transmiterea parametrului n:


Sub Test()
Dim n As Byte, f As Integer
n = InputBox("?n")
'
Prof. univ. Emil Cosma 56 Module VBA

f = fact(n) 'apelul functiei


'
MsgBox("Factorial de " & n & " este: " & f)
End Sub
______________________________________________________________________________________________Exemplu ↑

 Aplicaţii

1. Editaţi propria funcţie de calcul a depunerilor cu dobândă cu relaţia:

(1 + Rate) Nper − 1
MyFV = Pmt *
Rate
Unde:
Pmt – reprezintă plăţile,
Rate – este rata dobânzii,
Nper – numărul de perioade.

Comparaţi rezultatul aplicării ei cu valorile obţinute de funcţia Basic, Fv.


Funcţia Function MyFV(ByRef Rate, ByRef Nper, ByRef Pmt) 
As Double

MyFV = Pmt * ((1 + Rate) ^ Nper - 1) / Rate

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ţă:

Cnk  Cnk1  Cnk11 , cazuri particulare : Cn0  Cnn  1 şi Cn1  n


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

3. Să se calculeze al n-lea termen al şirului Fibonacci definind o funcţie recursivă.


Relaţia de calcul este:

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!

Să se compare valoarea calculată cu Exp(1).


Prof. univ. Emil Cosma 59 Module VBA


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

Form ulare VBA

În mediul Windows, o aplicaţie oferă o multitudine de alternative grupate în


ferestre de dialog dintre cele mai diferite. Activităţile şi ordinea în care se desfăşoară
ele sunt stabilite de utilizator - programul se află într-o stare de aşteptare, iar
utilizatorul poate alege una din opţiunile oferite. Programul trebuie conceput astfel încât
să răspundă la toate acţiunile utilizatorului. Orice acţiune - apăsarea unei taste, clic cu
mouse-ul şi mişcarea lui, etc. - reprezintă un eveniment. Aplicaţiile care rulează sub
sistemul de operare Windows sunt dirijate de evenimente iar rezolvarea sarcinilor de
execuţie ale acestora impune conceptul de „programarea dirijată de evenimente”.
Interfaţa cu utilizatorul, a unui program, permite utilizatorului să interacţioneze
cu programul şi conţine orice control (cum ar fi butoane, casete de text) pe care
utilizatorul îl manipulează pentru a furniza comenzi sau informaţii programului.

Formulare (form-uri)

Limbajul Basic facilitează crearea interfeţelor cu utilizatorul prin intermediul unui


set de controale, din caseta cu instrumente (Toolbox).

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..

În varianta Visual Basic şi a produselor similare, proiectul (programul) este un


ansamblu de proceduri eveniment, cele mai multe având dimensiuni reduse şi fiecare
tratând un eveniment individual. O astfel de procedură este ataşată unui control şi se
execută numai când controlul respectiv interceptează evenimentul pentru care a fost
scrisă. Altfel spus, un program va răspunde unui eveniment care se produce la execuţie
numai dacă a fost scrisă o procedură pentru evenimentul respectiv; în caz contrar,
evenimentul va fi ignorat. Fiecare control al unui formular (ca şi formularul însuşi)
suportă mai multe evenimente. De exemplu, un buton poate răspunde la evenimentul
clic dacă pentru acest eveniment este scrisă o procedură. Atunci când aplicaţia se va
lansa în execuţie, iar utilizatorul va efectua clic pe buton (se produce în acest fel
evenimentul), va fi lansată automat în derulare procedura definită.
Prof. univ. Emil Cosma 61 Formulare VBA

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.

Designer-ul oferă posibilitatea modificării unei proprietăţi prin comenzi de


atribuire, referirea la proprietatea respectivă făcându-se prin construcţia:
<nume formular>.<nume proprietate>

Referirea la un control din cadrul unui formular se realizează printr-o construcţie


asemănătoare, adică:
<nume formular>.<nume obiect>.<nume proprietate>

Există construcţii speciale, mai scurte, cum ar fi Me - care indică formularul


curent.
↓ Exemplu______________________________________________________________________________________________
'
Me.Caption = "Actualizare"
'modifică proprietatea Caption (titlu) a formularului
'
UserForm2.Label1.Caption = "Numele persoanei"
'modifică proprietatea Caption a obiectului Label1
'
Me.Hide
'execută metoda Hide (ascundere)ataşată formularului
______________________________________________________________________________________________Exemplu ↑
Prof. univ. Emil Cosma 62 Formulare VBA

Proprietatea Caption

În general, proprietatea Caption a unui obiect controlează textul pe care


respectivul obiect îl afişează. Proprietatea Caption a unui formular stabileşte titlul
form-ului.

Dacă nu este afişată fereastra de controale (Toolbox), având formularul deschis în


mediul de proiectare, din meniul View (afişare) se selectează opţiunea Toolbox sau se
apasă butonul din linia de butoane standard. Pentru introducerea unui control în
formular (de exemplu un buton) se utilizează mouse-ul (tragerea obiectului în formular
sau clic pe obiect şi apoi clic pe formular).

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.

Pentru a configura proprietatea Caption, a unui formular, în fereastra de


proprietăţi:

 Se selectează acesta din lista (derulantă) a obiectelor, inclusă în fereastra


Properties.
 Din lista de proprietăţi se alege proprietatea Caption.
 Se introduce textul nou pentru proprietatea Caption (de exemplu, Form-ul
meu).

Pentru a configura proprietatea Caption din cod:


 Se deschide editorul de cod (dublu-clic pe butonul Command Button1).
 Se foloseşte cuvântul cheie Me pentru a referi formularul în interiorul procedurii
de tratare a unui eveniment Click pe un buton:
Prof. univ. Emil Cosma 63 Formulare VBA

Private Sub CommandButton1_Click()


Me.Caption = "O noua denumire"
End Sub

 Se rulează proiectul şi, prin clic pe buton,


titlul formularului se schimbă la noua
valoare.

Proprietatea StartUpPosition

Proprietatea StartUpPosition determină poziţia unui formular atunci când este


executat prima oară. De obicei, atunci când un formular rulează, utilizatorul îl poate
muta.
Pentru a amplasa un formular în mijlocul ecranului folosind fereastra de
proprietăţi:

 Având formularul deschis, în fereastra Properties se selectează opţiunea


StartUpPosition.
 În coloana din dreapta, se selectează 2-CenterScreen.
 Se rulează proiectul. Fereastra bazată pe form va
apărea în centrul ecranului.

Proprietăţile Height şi Width

Prin aceste proprietăţi se fixează înălţimea şi lăţimea (în pixeli) a ferestrei


formularului (unitatea de măsură standard pentru monitoarele de calculator).

Se poate configura dimensiunea formularului în trei moduri:


 Trăgând cu mouse-ul de latura de jos şi/sau din dreapta a formularului, în
Prof. univ. Emil Cosma 64 Formulare VBA

mediul de proiectare, până ce formularul atinge dimensiunile dorite.


Schimbările făcute în acest fel sunt reflectate, în fereastra Properties, de
Width (lăţime) şi Height (înălţime).
 Setând în fereastra de proprietăţi dimensiunile Width şi Height.
 Configurând în cod valorile pentru Width şi Height.

Pentru a schimba dimensiunile unui formular din cod:


 Se deschide editorul de cod (dublu-clic pe butonul Command Button1).
 Se foloseşte cuvântul cheie Me pentru a referi formularul în interiorul procedurii
de tratare a unui eveniment Click pe un buton:
Private Sub CommandButton1_Click()
Me.Width = 500
Me.Height = 300
End Sub
 Se rulează proiectul şi, prin clic pe buton, dimensiunile formularului se schimbă
la noile valori.

Proprietăţile ForeColor şi BackColor

Proprietatea ForeColor stabileşte culoarea elementelor grafice şi, mai


important, a textului. Proprietatea BackColor stabileşte culoarea de fundal. Ele se
configurează în acelaşi mod.

Atunci când se configurează proprietăţile ForeColor şi BackColor ale unui


formular, se configurează, de asemenea, şi valorile implicite ale acestora pentru orice
control aşezat în interiorul formularului (în afara cazului în care se configurează culorile
individual pentru un control, acesta va folosi valorile oferite de form).

Pentru a configura proprietatea ForeColor folosind


fereastra de proprietăţi:
 Se deschide un formular în mediul de proiectare.
 În fereastra Properties se alege ForeColor.
 În coloana din dreapta, clic pe săgeata în jos.
 Din tabul Palette se alege culoarea, în mod vizual.

Utilizarea controalelor

Includerea controalelor în cadrul unui formular se realizează prin introducerea


(drag&drop) unor obiecte (CommandButton, Label, TextBox, etc.) în acest
formular. Pentru aceasta, se acţionează butonul corespunzător din Toolbox şi se
stabileşte porţiunea dreptunghiulară (zona) din formular unde va fi afişat obiectul.
Prof. univ. Emil Cosma 65 Formulare VBA

Practic, obiectul va fi desenat (se poziţionează cursorul mouse-ului în colţul stânga-sus


al zonei de afişare, se ţine apăsat butonul stâng şi se trage cursorul spre colţul dreapta-
jos). O dată plasat pe formular, proprietăţile (starea) unui control pot fi vizualizate şi
modificate în fereastra „Properties", iar comportamentul său poate fi modelat prin scrierea
procedurilor eveniment. Toate controalele sunt obiecte şi, ca urmare, răspund la
evenimentele declanşate de entităţile exterioare (utilizator, alte controale) prin intermediul
procedurilor eveniment.

 Multe proprietăţi enumerate anterior pentru formulare se pot aplica nu numai


acestora ci şi controalelor din formular.

Cele mai importante controale:


Buton

Etichetă

Casetă de text

Casetă de validare
Cadru de grupare

Buton radio (opţiune)


Casetă cu listă

Listă derulantă

Casetă de imagine
Generator de valori

Controlul CommandButton este tipic pentru startul evenimentelor, pentru


căutarea şi închiderea formularelor, etc. Codul program de executat este plasat în
metoda Click. Textul afişat pe buton este conţinut în proprietatea Caption, iar
numele lui în proprietatea (Name). Mediul de proiectare VBA atribuie nume butoanelor
(CommandButton1, CommandButton2, …) dar este indicat ca utilizatorul să
folosească denumiri semnificative. Prin convenţie aceste denumiri ar putea fi prefixate
prin literele btn (btnCalculeaza, btnStart, …).

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.

Proprietăţile cele mai importante ale controlului Label:


Proprietate
Name
Nume VBA: Label1, Label2, … Convenţie prefix: lbl.
AutoSize
Proprietate de tip boolean care defineşte modalitatea de dimensionare a etichetei
(automat - True, manual - False). Implicit este False (dimensiune fixă). Dacă se
fixează la valoarea True înălţimea etichetei se autoreglează în funcţie de textul
introdus.
BackColor
Culoarea de fundal a textului de pe etichetă. Sunt disponibile 2 palete de culori:
Palette şi System.
BorderStyle
Stilul marginii (cadrului) etichetei: FmBackStyleOpaque,
FmBackStyleTranparent.
Caption
Este proprietatea cea mai des utilizată şi se referă la conţinutul efectiv al
etichetei. Poate fi stabilit atât la proiectare, cât şi în momentul execuţiei.
ControlTipText
Afişează un indicator textual, atunci când se plasează cursorul mouse-ului în zona
etichetei.
Font
Fontul (stilul caracterelor) cu care este afişat textul de pe etichetă. Este o
proprietate care fixează atribute pentru tip, mărime, stil de afişare.
ForeColor
Culoarea cu care este scris textul în cadrul etichetei. Are aceeaşi plajă de
valori ca şi BackColor.
Heigth
Înălţimea etichetei, în pixeli.
Picture
Imaginea care apare pe fundalul etichetei. Această proprietate reprezintă de
fapt o referinţă către un fişier de tip imagine (bmp, jpg, gif, ico, etc).
PicturePosition
Alinierea imaginii în cadrul etichetei.
TextAlign
Prof. univ. Emil Cosma 67 Formulare VBA

Modalitatea de aliniere a textului în cadrul suprafeţei etichetei. Valori:


FmTextAlignLeft, FmTextAlignCenter, FmTextAlignRight. Implicit alinierea
textului este la stânga.
Visible
Permite ascunderea etichetei sau (re)afişarea ei pe ecran, în funcţie de
valorile care îi sunt atribuite: False, True.
Width
Lăţimea etichetei, în pixeli.

↓ 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:

 În procedura eveniment a butonului se scriu următoarele linii de cod care au


rolul de a modifica titlul formularului (UserForm1), a etichetei şi a butonului
(btnVizualizeaza):
Private Sub btnVizualizeaza_Click()
Me.Caption = "Poza mea"
lblPoza.Visible = True
btnVizualizeaza.Caption = "O fetiţă!"
End Sub

 Rezultat al apăsării butonului, la rularea


formularului:

______________________________________________________________________________________________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.

 Pentru informaţiile introduse de la tastatură, textbox-urilor li se atribuie nume


semnificative (txtMarca, txtPretEuro, txtCursEuro). Butonul de comandă
(btnInfo) determină afişarea - în eticheta lblInfo - informaţiilor necesare.
Proprietatea Font a acestor controale poate fi modificată pentru o afişare mai
vizibilă (de exemplu Bold):
Prof. univ. Emil Cosma 70 Formulare VBA

txtMarca txtCursEuro

txtPretEuro

btnInfo
lblInfo

 Procedura de preluare a informaţiilor şi de afişare a rezultatelor prelucrării lor


(asociată butonului „Info”) conţine următoarele instrucţiuni:

Private Sub btnInfo_Click()


If IsNumeric(txtPretEuro.Text) And 
IsNumeric(txtCursEuro.Text) Then
PretEuro = Val(txtPretEuro.Text)
CursEuro = Val(txtCursEuro.Text)
PretLei = PretEuro * CursEuro * 1.19
lblInfo.Caption = "Autoturismul " & txtMarca.Text 
& vbCrLf & "Are pretul " & PretLei & 
"lei (cu TVA)"
'Observaţie: vbCrLf -> pentru rând nou
Else
MsgBox("Eroare! Valoare numerică!")
End If
End Sub
______________________________________________________________________________________________Exemplu ↑

 Proprietatea Text a casetelor de text returnează întotdeauna o valoare de tip


String, iar în cazul în care sunt introduse valori numerice, se impune realizarea
unei conversii la tipul de date al variabilei care preia valoarea respectivă. Cu
funcţia IsNumeric, de tip boolean, se poate testa dacă argumentul este numeric
(rezultat True pentru argument numeric).

Controlul CheckBox creează posibilitatea de se specifica anumiţi parametri prin


intermediul unor casete de validare. Realizarea practică se face prin efectuarea unui clic
cu mouse-ul (bifare – debifare).
Prof. univ. Emil Cosma 71 Formulare VBA

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

 Un rezultat al execuţiei formularului ar putea arăta astfel:

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.

Principalele proprietăţi ale unui Frame sunt:


Proprietate
Name
Nume VBA: Frame1, Frame2, … Convenţie prefix: frm.
Caption
Textul care apare în antetul grupului.
Enabled
Dacă este True, elementele din grup vor putea fi accesate. Dacă este False,
elementele din grup nu pot fi manipulate de utilizator.
Font
Tipul fontului cu care este scris titlul grupului.
Visible
Dacă este True, grupul este vizibil pe formular; în caz contrar, grupul este
invizibil.
Prof. univ. Emil Cosma 73 Formulare VBA

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

 Codul care completează versiunea anterioară a formularului este următorul:


Private Sub btnInfo_Click()
If rbnAlb.Value Then
Culoare = "Alb"
End If
If rbnGRi.Value Then
Culoare = "Gri"
End If
If rbnRosu.Value Then
Culoare = "Gri"
End If
'.
'.
'.
lblInfo.Caption ="Autoturismul " & txtMarca.Text & vbCrLf & 
"Are pretul " & PretLei & " lei (cu TVA)" & 
vbCrLf & Stoc & vbCrLf & Taxe & 
vbCrLf & "Culoare: " & Culoare
'Observaţie: vbCrLf -> pentru rând nou
'.
'.

 Când se lansează în execuţie formularul, se va putea selecta doar un singur


buton, cel selectat anterior fiind în mod automat debifat (astfel se poate alege
doar o singură variantă din mai multe posibile):

______________________________________________________________________________________________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).

Funcţia ListIndex returnează o valoare întreagă care corespunde primului


element selectat din listă. Dacă nu este selectat nici un element, valoare lui ListIndex
Prof. univ. Emil Cosma 75 Formulare VBA

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).

Proprietăţile importante ale unei casete cu listă sunt enumerate în tabelul


următor:
Proprietate
Name
Nume VBA: ListBox1, ListBox2, … Convenţie prefix: lst.
BorderStyle
Marginea casetei cu listă:
÷ None: nu apare nici o bordură;
÷ Single - bordură.
ColumnWidths
Lăţimea (în număr de puncte) fiecărei coloane în cazul în care lista suportă
coloane multiple.
Enabled
Proprietate de tip boolean care, atunci când are valoarea True, permite
utilizatorului să selecteze elemente din listă. În caz contrar, lista este vizibilă,
dar inactivă.
Font
Stilul fontului pentru elementele din cadrul listei.
ColumnCount
Lista este afişată pe un număr de coloane stabilit prin această proprietate.
MultiSelect
Poate lua una dintre valorile:
÷ Single: utilizatorul poate selecta doar un singur element din listă la
un moment dat (implicit);
÷ Multi: pot fi selectate mai multe valori, prin simpla apăsare a
butonului din stânga al mouse-ului;
÷ Extended: pot fi selectate mai multe valori, prin folosirea mouse-
ului şi a tastei Ctrl, precum şi prin deplasarea mouse-ului în timp ce
butonul din stânga este apăsat.
TextAlign
Implicit, elementele unei liste sunt aliniate la stânga. Se pot face şi alinieri la
Prof. univ. Emil Cosma 76 Formulare VBA

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).

 Atunci când se va lansa formularul în execuţie lista conţine autoturismele specificate.

lstAuto

 Se pot include, în formular, două butoane:

btnAdauga

btnSterge

 Adăugarea unei mărci noi de autoturism:


Prof. univ. Emil Cosma 77 Formulare VBA

Private Sub btnAdauga_Click()


'Introducerea unei noi mărci
Marca = InputBox("Se introduce o nouă marcă:")
LstAuto.AddItem (Marca)
End Sub
Se adaugă marca Renault:

 Pentru ştergerea unui element, aflat în listă, se apelează la funcţia RemoveItem:

Private Sub btnSterge_Click()


'Daca lstAuto contine elemente
If lstAuto.ListCount >= 1 Then
'Daca nu s-a selectat nici un element
' se alege ultimul din listă
If lstAuto.ListIndex = -1 Then
lstAuto.ListIndex = 
lstAuto.ListCount - 1
End If
lstAuto.RemoveItem(lstAuto.ListIndex)
End If
End Sub

Se şterge marca Opel:

______________________________________________________________________________________________Exemplu ↑

Caseta cu listă derulantă permite memorarea unei liste de elemente în mod


asemănător listelor clasice, însă suprafaţa ocupată pe formular este corespunzătoare
unei singure linii. În momentul selecţiei, caseta se derulează, afişând elementele
disponibile, iar după selectarea unuia dintre ele se reduce la forma iniţială. Selecţia
poate fi realizată şi prin tastarea primelor caractere care identifică elementele listei.
Prof. univ. Emil Cosma 78 Formulare VBA

Câteva proprietăţi ale ComboBox-ului:


Proprietate
Name
Nume VBA: ComboBox1, ComboBox2, … Convenţie prefix: cbo.
DropButtonStyle
Modul de vizualizare a butonului de derulare a listei:
÷ Plain: ;
÷ Arrow (implict): buton de selecţie marcat cu săgeată: ;
÷ Ellipses: ;
÷ Reduce: .
ColumnWidths
Lăţimea fiecărei coloane în cazul în care lista suportă coloane multiple.
Enabled
Dacă este True, lista este activă; dacă este False, caseta este vizibilă pe
ecran, dar nu poate fi selectat nici un element.
Font
Stilul caracterelor folosite pentru afişarea elementelor.
ListWidth
Lăţimea, în pixeli, a listei care apare în momentul când se apasă butonul de
selecţie. Valoarea stabilită nu poate fi mai mică decât lăţimea ComboBox-
ului.
MaxLength
Numărul maxim de caractere care pot fi introduse de utilizator. Implicit,
această proprietate are valoarea zero (pot fi introduse oricâte caractere).
TextAlign
Implicit, elementele unei liste sunt aliniate la stânga. Se pot face şi alinieri la
dreapta (de regulă pentru elemente de tip numeric) sau la centrul listei.
Text
Stabileşte sau returnează elementul curent care este selectat în casetă.
Visible
Dacă este True, controlul este vizibil pe formular; în caz contrar, nu este
vizibil pentru utilizator.

↓ 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

 Pentru afişarea elementelor curente se foloseşte proprietatea Text, care


returnează elementul curent selectat. În cazul în care nu este selectat nici un
element din listă, valoarea returnată este şirul vid (va apare un mesaj de
avertizare). Marca selectată se determină prin simplul apel al proprietăţii Text a
controlului cboMarca.

Private Sub btnInfo_Click()


Marca = cboMarca.Text
PretulMaxim = cboPret.Text
If Marca = "" Then
MsgBox("Marca?!")
Else
lblInfo.Caption = "Marca: " & Marca & vbCrLf 
& "Pret maxim: " & PretulMaxim
End If
End Sub
______________________________________________________________________________________________Exemplu ↑

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.

Controlul SpinButton oferă o modalitate de a selecta o valoare numerică dintr-


un anumit interval.

Proprietăţile definitorii ale generatorului de valori sunt următoarele:


Proprietate
Name
Nume VBA: SpinButton1, SpinButton2, … Convenţie prefix: spb.
Enabled
Proprietate de tip boolean:
÷ True: controlul este disponibil pentru a fi modificat de utilizator;
÷ False: utilizatorul nu poate modifica starea controlului.
SmallChange
Stabileşte pasul cu care se modifică valoarea curentă din generator atunci
când utilizatorul acţionează butoanele de incrementare sau decrementare.
Valoarea incrementului trebuie să fie un număr întreg mai mare sau egal cu
zero (implicit 1).
Max
Limita superioară a intervalului de valori. Această valoare trebuie să fie mai
mare sau egală cu Min.
Min
Limita inferioară a intervalului în care poate naviga utilizatorul.
Orientation
Orientarea butoanelor de incrementare/decrementare:
÷ Auto;
Prof. univ. Emil Cosma 81 Formulare VBA

÷ 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.

Incrementarea valorii curente

lblInfo

Decrementarea valorii curente

 Proprietatea Value se modifică dinamic, în funcţie de acţiunile utilizatorului


asupra butoanelor de navigare, deci valoarea numerică poate fi preluată şi
utilizată:
Private Sub spbVarsta_Change()
lblInfo.Caption = "Vârsta: " & spbVarsta.Value & " ani"
End Sub
______________________________________________________________________________________________Exemplu ↑

Modificarea proprietăţilor din cod

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.

Iniţializarea dialogului este realizată prin codul cuprins în procedura eveniment


Initialize. Afişarea formularului declanşează evenimentul Initialize şi astfel au
loc şi atribuirile de valori specificate.

Când se gestionează mai multe formulare se impune, de cele mai multe ori,
Prof. univ. Emil Cosma 82 Formulare VBA

activarea altor formulare din formularul curent.

↓ 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

 La rularea aplicaţiei rezultă:

______________________________________________________________________________________________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 ↑

 Este de remarcat că, deşi în modelele de obiecte Word, Excel şi PowerPoint


colecţiile sunt indexate de la 1, în tablourile şi colecţiile asociate formularelor se
foloseşte indexarea de la 0. De aici selectarea ultimei intrări (cu numărul de
ordine 4) din listă prin instrucţiunea ListIndex = 3.

Prin setarea proprietăţilor unui control şi aplicarea metodelor în timpul execuţiei,


se pot efectua modificări într-un dialog utilizator care se execută, modificări apărute ca
răspuns la acţiunile şi alegerile utilizatorului. De exemplu, accesibilitatea unor controale
poate fi controlată prin modificarea proprietăţii Enabled. Dacă proprietatea este setată
pe False, atunci utilizatorul nu poate accesa controlul.

↓ 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

Prin intermediul metodei SetFocus se controlează focalizarea. Un control care


are focusul este cel care răspunde la intrările din tastatură.

↓ 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 ↑

Valorile introdu-se, utilizând controalele TextBox, sunt de tip String. Pentru


colectarea unor valori numerice este necesară o conversie (de obicei cu funcţia Val).
Deoarece conversia string  numeric ia în considerarea caracterele, până la primul ce
nu reprezintă informaţie numerică, se impune validarea şirului introdus prin funcţia
IsNumeric.

↓ 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:

 Pentru ca, la descărcarea formularului, să fie memorată valoarea introdusă în


caseta de text se utilizează o variabilă de lucru (Nume) de tip Public:

Public Nume As String

Private Sub btnStop_Click()


Nume = txtMem.Text
Unload Me
End Sub
______________________________________________________________________________________________Exemplu ↑

 Pentru reutilizarea formularelor proiectate, acestea se exportă ca un fişier


.frm care poate fi importat în alte aplicaţii:
 În VBE, unde s-a proiectat formularul, se selectează opţiunea din meniu
File, Export File.
 Se alege un nume, pentru fişierul formular, şi Save. Se obţine un fişier
nume.frm.
 Reutilizarea formularului necesită deschiderea fişierului stocat: prin
meniu, File, Import File, selectarea numelui formularului şi Open.
Prof. univ. Emil Cosma 86 Formulare VBA

 Aplicaţii

1. Să se editeze un formular pentru calcule aritmetice.


Controale
Control Tip Proprietate Valoare
proprietate

UserForm1 Formular Caption Calculator

Label1 Etichetă Caption Primul operand

Label2 Etichetă Caption Al doilea operand

Label3 Etichetă Caption Rezultatul->

txtA TextBox TextAlign Right

ForeColor Blue
Font, Size 10
Font,FontStyle Bold

txtB TextBox TextAlign Right

ForeColor Green
Font, Size 10
Font,FontStyle Bold

lblRezultat Etichetă ForeColor Red

Font, Size 12
Font,FontStyle Bold
Prof. univ. Emil Cosma 87 Formulare VBA

TextAlign Center

lblOperator Etichetă Font, Size 10

ForeColor Red
Font,FontStyle Bold

btnAdun Buton Caption +

ForeColor Blue
Font, Size 18
Font,FontStyle Bold

btnScad Buton Caption -

ForeColor Red
Font, Size 18
Font,FontStyle Bold

btnInm Buton Caption x

ForeColor Green
Font, Size 18
Font,FontStyle Bold

btnImp Buton Caption :

ForeColor Purple
Font, Size 18
Font,FontStyle Bold

btnPt Buton Caption ^

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ă

Secvenţele de cod sunt la fel, doar


că se schimbă operatorii de calcul.

2. Să se editeze un formular pentru calcule financiare:


Controale
Control Tip Proprietate Valoare
proprietate

UserForm1 Formular Caption Calcule financiare

Label1 Etichetă Caption Rata dobanzii

Label2 Etichetă Caption Numarul de perioade

Label3 Etichetă Caption Valoare

Label4 Etichetă Caption Rezultat


Prof. univ. Emil Cosma 89 Formulare VBA

txtD TextBox TextAlign Right

Font, Size 10
Font,FontStyle Bold

txtN TextBox La fel cu txtD

txtV TextBox La fel cu txtD

Etichetă Font, Size 12


lblRezultat
Font,FontStyle Bold
ForeColor Red

frmFunctia Frame Caption Functia

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)

Select Case selectie


Case 1
lblRezultat.Caption = FV(D, N, V)
Case 2
lblRezultat.Caption = PV(D, N, V)
Case 3
lblRezultat.Caption = Pmt(D, N, V)
End Select
Else
MsgBox("Eroare! Valoare numerică!")
End If
End Sub
Prof. univ. Emil Cosma 91 Documente Office active

Docum ente Office active

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.

Deşi modul de operare al controalelor ActiveX este foarte asemănător cu cel al


controalelor OLE există unele deosebiri:

 Adăugarea controalelor se realizează cu ajutorul cutiei de unelte ActiveX


Controls (şi nu Toolbox ca în VBE). Afişarea acestei cutii se realizează din
tab-ul Developer, Controls:

 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
.

Evenimentele dintr-un document Office şi dintr-un formular fiind uneori diferite şi


tratările acestora sunt diferite.
Prof. univ. Emil Cosma 92 Documente Office active

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

 În Design Mode se creează următoarele controale:


Control Tip Proprietate Valoare proprietate

lblArt1 Etichetă Caption Sony digital DSC-H2

lblArt2 Etichetă Caption Acer TM2492NWLMi

lblArt3 Etichetă Caption Motorola V3

lblPret1 Etichetă Caption 1188

lblPret2 Etichetă Caption 1978

lblPret3 Etichetă Caption 428

lblTotal Etichetă Caption 0

cboCos ComboBox

btnAdaug1 Buton Caption

btnAdaug2 Buton Caption

btnSterg Buton Caption

btnReset Buton Caption

 Controalelor introduse li se asociază următoarele proceduri:


Private Sub btnAdaug1_Click()
cboCos.AddItem (lblPret1.Caption + "RON " + 
lblArt1.Caption)
lblTotal.Caption = Val(lblPret1.Caption) + 
Val(lblTotal.Caption)
End Sub
Private Sub btnAdaug2_Click()
cboCos.AddItem (lblPret2.Caption + "RON " + 
lblArt2.Caption)
lblTotal.Caption = Val(lblPret2.Caption) + 
Val(lblTotal.Caption)
End Sub
Private Sub btnAdaug3_Click()
cboCos.AddItem (lblPret3.Caption + "RON " + 
lblArt3.Caption)
lblTotal.Caption = Val(lblPret3.Caption) + 
Val(lblTotal.Caption)
End Sub
Private Sub btnReset_Click()
lblTotal.Caption = 0
Prof. univ. Emil Cosma 94 Documente Office active

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:

÷ Un produs poate fi introdus în coş de mai multe ori.


÷ Suma totală de plată se calculează. Pentru calculul acesteia este necesară
conversia string  numeric, prin funcţiei Val.
÷ Ştergerea unui produs din listă (de exemplu Sony digital DSC-H2 care apare de
două ori) este facilitată de funcţia RemoveItem :

÷ Proprietatea ListIndex stabileşte elementul selectat (ListIndex = -1


semnifică sfârşitul listei).
÷ Golirea coşului de cumpărături este concretizată prin funcţia Clear (se
şterg toate elementele din listă).
______________________________________________________________________________________________Exemplu ↑
Prof. univ. Emil Cosma 95 Documente Office active


 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

 Controale Content (Content controls)


Controalele Content sunt destinate editării şabloanelor sau formularelor (de
completat). Aceste controale sunt vizibile în tab-ului Developer:

Text Picture Combo Box

Rich Text

Drop-Down List Date Picker

Rich Text Paragraf

Text Text (textul poate fi introdus pe mai multe


linii)
Picture Imagine (jpg, bmp, etc.)
Combo Box Lista derulantă (poate fi selectat un element
din listă, sau se poate introduce)
Drop-Down List Listă (nu permite editarea)
Date Picker Dată calendaristică (din calendarul sistem)

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

 În se redactează conţinutul vizual al acestor controale (nume


şi prenume, opţiune, câteva motive, data solicitării):
Prof. univ. Emil Cosma 97 Documente Office active

 Controlul Drop-Down List este o listă derulantă cu


două elemente:

 După ieşirea din formularul poate fi completat:

______________________________________________________________________________________________Exemplu ↑

Excel

Apare necesitatea, de multe ori, ca acelaşi proces de calcul, să se desfăşoare în mai


multe zone (domenii de celule) ale foii de calcul electronic. Prin procedeul „Recording” se fac
limitări la domeniul de celule curent, memorând-se adresele de celule.

↓ 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:

 Comutare în VBE şi vizualizarea instrucţiunilor generate:


Sub functiaFV()
'
'functiaFV Macro
'
'Keyboard Shortcut: Ctrl+f
'
ActiveCell.FormulaR1C1 = "Rata dobanzii"
Range("A2").Select
ActiveCell.FormulaR1C1 = "Numar de plati"
Prof. univ. Emil Cosma 98 Documente Office active

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

Principala deficienţă a acestei macroinstrucţiuni este faptul că, de câte ori se


doreşte executarea ei, derularea calculelor are loc doar pe domeniul de celule A1:C4 – o
zonă fixă din foaia electronică de calcul. Dacă se doreşte repetarea calcului în alte zone
ale foii de calcul electronic instrucţiunile generate în modul „Recording” pot fi înlocuite:
Sub functiaFV()
'
'functiaFV Macro
'
'Keyboard Shortcut: Ctrl+f
'
l = ActiveCell.Row
c = ActiveCell.Column
'
Cells(l, c).Value = "Rata dobanzii"
Cells(l + 1, c).Value = "Numar de plati"
Cells(l + 2, c).Value = "Plata"
Cells(l + 3, c).Value = "Valoare FV"
'
Cells(l, c + 2).Value = 0
Cells(l, c + 2).Activate
a1 = ActiveCell.Address
'
Cells(l + 1, c + 2).Value = 0
Cells(l + 1, c + 2).Activate
a2 = ActiveCell.Address
'
Cells(l + 2, c + 2).Value = 0
Cells(l + 2, c + 2).Activate
a3 = ActiveCell.Address
'
Cells(l + 3, c + 2).Value = 
"=FV(" + a1 + "," + a2 + "," + a3 + ")"
'
Cells(l, c + 2).Activate
'
End Sub

______________________________________________________________________________________________Exemplu ↑
Prof. univ. Emil Cosma 99 Documente Office active

Modificările efectuate permit desfăşurarea calculului în orice zonă a foii de calcul.


Valorile necesare calculului pot fi introduse (reintroduse) în noul domeniu de celule,
funcţia de calcul returnând valoarea rezultată:

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.

Macroinstrucţiunea definită anterior se lansează prin shortcut-ul Ctrl+f, dar


poate fi asociată şi unui control (ActiveX sau Form).
Se pot adăuga controale, la caiete sau foi de calcul, lângă datele pe care le
controlează, astfel încât operarea în foaia de calcul să se efectueze cât mai cursiv şi mai
pe înţeles.

În Excel, controalele din grupul Controls al tab-ului Developer,


sunt de două tipuri:
• Form Controls sunt controale cărora li se asociază
macrocomenzi;
• ActiveX Controls sunt controale de tipul celor tratate
anterior.

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).

 Butonului i se poate asocia o macroinstrucţiune:

Sub Button1_Click()
MsgBox ("S-a acţionat un Button (Form Control)")
End Sub

 La acţionarea butonului se v-a executa procedura Button1_Click.


 Pentru editarea textului înscris pe buton sau a procedurii
(macrocomenzii) asociate se va apela la butonul drept al mouse-ului:

______________________________________________________________________________________________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

1. Să se editeze, pe layer-ul de text al unui document Office, interfeţele grafice necesare


pentru efectuarea calculelor aritmetice şi a calculelor financiare (a se revedea aplicaţiile
de la capitolul Formulare VBA).
2. Să se implementeze „coşul de cumpărături” conform exemplificărilor folosite la tratarea
controalelor ActiveX.
3. Să se creeze un formular (de completat) conform precizărilor efectuate la tratarea
controalelor Content.
4. Să se exerseze posibilitatea de efectuare a calculelor financiare (dar şi a altor calcule)
în domenii diferite ale foii de calcul electronic.

S-ar putea să vă placă și