100% au considerat acest document util (4 voturi)
1K vizualizări106 pagini

Excel VBA

Documentul prezintă o introducere în utilizarea limbajului de programare VBA în Microsoft Excel, inclusiv modul de lucru cu macrocomenzi, fișiere și foi de lucru, instrucțiuni VBA, controale de formular, tabele și grafice din VBA.

Încărcat de

Maria Tanase
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd
100% au considerat acest document util (4 voturi)
1K vizualizări106 pagini

Excel VBA

Documentul prezintă o introducere în utilizarea limbajului de programare VBA în Microsoft Excel, inclusiv modul de lucru cu macrocomenzi, fișiere și foi de lucru, instrucțiuni VBA, controale de formular, tabele și grafice din VBA.

Încărcat de

Maria Tanase
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd

Excel VBA

SUPORT DE CURS

1
CUPRINS
1. Lucrul cu macrocomenzi în Excel .................................................................. 5
1.1 Generalităţi legate de macrocomenzi ............................................................ 5
1.2 Editorul VBA ................................................................................................ 5
1.3 Înregistrarea unei macro-comenzi ................................................................. 7
1.4 Execuţia unei macrocomenzi ........................................................................ 8
1.5 Modificarea unei macrocomenzi ................................................................... 9
1.6 Ştergerea unei macro-comenzi ...................................................................... 9
1.7 Lucrul cu macro-comenzi globale ................................................................ 10
1.8 Salvarea fişierelor ce conţin macro-comenzi ................................................ 10
1.9 Deschiderea unor fişiere care conţin macrocomenzi .................................... 11
1.10 Introducerea unui buton asociat macro pe bara de instrumente .................. 11
1.11 Încrederea în fişiere ce conţin macro-comenzi ........................................... 12
2. Lucrul cu fişiere şi foi de calcul ...................................................................... 17
2.1 Elemente de bază de VBA pentru Excel ....................................................... 17
2.2 Lucrul cu fişiere Excel din VBA .................................................................. 18
Crearea unui fişier nou ........................................................................................ 19
Numărul de fişiere deschise ................................................................................ 19
Închiderea tuturor fişierelor deschise................................................................... 19
Referirea la un anumit fişier ............................................................................... 19
Salvarea unui fişier ............................................................................................. 19
Deschiderea unui fişier........................................................................................ 20
2.3 Lucrul cu foi Excel din VBA ........................................................................ 20
Referirea la o anumită foaie ................................................................................ 20
Inserarea unei noi foi de calcul............................................................................ 21
Redenumirea unei foi .......................................................................................... 21
Ştergerea unei foi ................................................................................................ 21
Ascunderea/afişarea unei foi................................................................................ 22
Copierea sau mutarea unei foi.............................................................................. 22
Vizualizarea unei foi înainte de tipărire............................................................... 23
Tipărirea unei foi ................................................................................................. 23
2.4 Lucrul cu domenii ......................................................................................... 23
2.5 Formule ......................................................................................................... 26
3. Instrucţiuni VBA ............................................................................................. 29
3.1 Variabile şi constante. Tipuri de date............................................................ 29
3.2 Funcţii cu interfaţa cu utilizatorul ................................................................. 31
3.3 Utilizarea funcţiilor VBA ............................................................................. 34
3.4 Instrucţiuni VBA .......................................................................................... 39
3.5 Proceduri ....................................................................................................... 49
3.6 Funcţii ........................................................................................................... 51
4. Utilizarea controalelor tip formular în foile de calcul..................................... 55
4.1 Formularele de date ...................................................................................... 55
2
4.2 Foi de calcul ce conţin controale de tip Form şi ActiveX........................ 55
4.3 Controale de tip Form............................................................................... 56
Caracteristici specifice controalelor............................................................... 57
4.4 Controale de tip ActiveX ........................................................................ 61
Caracteristici specifice controalelor............................................................... 62
Formulare UsersForm .................................................................................... 62
a) Caseta de text (Textbox) ............................................................................ 63
b) Etichete ...................................................................................................... 65
c) Butoane de comandă ................................................................................. 65
d) Butoane de opţiune .................................................................................... 66
e) Caseta de validare ...................................................................................... 66
f) Bare de derulare orizontală şi verticală....................................................... 67
g) Controlul spin ............................................................................................ 67
h) Caseta cu listă ........................................................................................ 68
i) Caseta combinată......................................................................................... 69
j) Controlul Image .......................................................................................... 70
k) Butoane Toggle .......................................................................................... 70
l) Controlul MultiPage.................................................................................... 70
m) Controlul TabStrip .................................................................................... 70
n) Controlul RefEdit ..................................................................................... 71
5. Tabele ......................................................................................................... 74
5.1 Crearea unui tabel din VBA .................................................................... 74
5.2 Obţinerea informaţiilor dintr-un tabel ..................................................... 74
5.3 Inserarea unui rând ................................................................................... 75
5.4 Inserarea unei coloane cu valori calculate............................................... 75
5.5 Totalizarea datelor ................................................................................... 76
5.6 Modificarea informaţiilor din tabel .......................................................... 77
6. Grafice ........................................................................................................ 78
6.1 Crearea unui grafic ................................................................................... 78
6.2 Locaţia unui grafic .................................................................................. 78
6.3 Crearea unui grafic aflat pe o foaie de lucru ........................................... 79
6.4 Crearea unui grafic pe o foaie de grafic .................................................. 79
6.5 Activarea unui grafic din VBA ............................................................... 80
6.6 Mutarea unui grafic ................................................................................ 80
6.7 Determinarea activării unui grafic........................................................... 81
6.8 Ştergerea unui grafic ............................................................................... 81
6.9 Formatarea graficelor cu ajutorul VBA .................................................. 82
6.10 Parcurgerea tuturor graficelor ................................................................ 83
6.11 Modificarea datelor utilizate de grafic .................................................. 85
6.12 Exportul unui grafic în format imagine ................................................ 88
6.13 Evenimente asociate graficelor ............................................................. 88
7. Tabele pivot .............................................................................................. 92
7.1 Noutăţi aduse tabelelor pivot în Excel 2007-2010 .................................. 92
3
7.2 Crearea unui tabel pivot cu ajutorul unei macrocomenzi ........................ 92
7.3 Simplificarea codului scris de macrocomanda ........................................ 93
7.4 Zona cache a pivotului (PivotCaches) ...................................................... 94
7.5 Colecţia PivotTables ................................................................................. 94
7.6 Câmpurile tabelului pivot ......................................................................... 95
7.7 Modificarea funcţiei afişate de tabelul pivot ............................................ 95
7.8 Câmpuri calculate ..................................................................................... 96
7.9 Elemente ale câmpurilor tabelului pivot.................................................... 97
7.10 Gruparea datelor ...................................................................................... 97
7.11 Eliminarea grupării datelor .................................................................... 99
7.12 Introducerea valorilor calculate în tabelele pivot .................................. 100
7.13 Ştergerea valorilor calculate în tabelele pivot ....................................... 101
7.14 Grafice pivot .......................................................................................... 101
Anexa Funcţii utile în VBA ..................................................................... 103

4
1. Lucrul cu macrocomenzi în Excel
Primul limbaj destinat macro-comenzilor în Excel a apărut în versiunea 2 a programului (Excel
2010 are versiunea 14). Limbajul XLM era alcătuit funcţii care se executau secvenţial şi, deşi era la
vremea acceea foarte puternic, era dificil de învăţat şi utilizat. În versiunile următoare, limbajul XLM a
fost înlocuit de Visual Basic for Application (VBA).
VBA este un mediu de programare care pune la dispoziţie un limbaj complet pentru dezvoltarea
aplicaţiilor în cadrul programelor din pachetul Microsoft Office, folosind un model de programare
orientat spre obiecte şi dirijat de evenimente.
1.1 Generalităţi legate de macrocomenzi
Un macro (sau o macro-comandă) reprezintă un grup de acţiuni sau operaţii. Acestea sunt
memorate de Excel local (în fişierul în care lucrăm) sau global (în fişierul Personal Macro
Workbook), pentru a fi utilizate şi în alte fişiere.
Vom folosi macro-comenzi pentru acele secvenţe de acţiuni pe care le efectuăm în mod repetat.(de
exemplu: formatarea unor celule, paginarea foilor, introducerea unor date, etc.)
Macro-comenzile se execută automat când apăsăm combinaţia de taste asociată, rulăm macro-ul din
lista de macro-comenzi sau apăsăm butonul asociat acestuia.
Acţiunile pe care le conţine un macro sunt codificate într-un limbaj de programare Visual Basic for
Application. Acest cod este creat în foaia pentru module sub forma unei subrutine ( SUB ) care
efectuează acţiunile înregistrate.
Pentru a crea un macro se folosesc 2 metode:
- înregistrare
- introducerea instrucţiunilor.
Pentru a modifica o macrocomanda înregistrată sau pentru a scrie o macrocomandă proprie sunt
necesare cunoştiinţe minimale de Visual Basic.
Intrarea în mediul Visual Basic se poate face utilizând comanda Visual Basic aflată în fila
Developer sau, mai rapid, folosind combinaţia de taste ALT+F11.
1.2 Editorul VBA
Afişarea filei Developer
În Excel 2007-2010, fila Developer nu este afişată implicit. Pentru a afişa fila, veţi proceda în felul
următor:
1. File (butonul Excel Office) / Excel Options
2. În fereastra Excel Options, eticheta Popular, alegeţi opţiunea Show Developer Tab in the
Ribbon.
Activarea VBE
În Excel 2007-2010, editorul Visual Basic (VBE) poate fi activat astfel din fila Developer / Visual
Basic sau cu ajutorul combinaţiei de taste Alt + F11. În plus, dacă doriţi să vizualizaţi codul unei
foi, daţi clic dreapta pe numele foii şi din meniul apărut alegeţi comanda View Code.
Fereastra VBE
Fereastra editorului Visual Basic are următoarele elemente componente:
 Bara de titlu ce conţine titlul ferestrei (ex. Microsoft Visual Basic – Book1)
 Bara de meniuri
 Barele de instrumente; pe bara de instrumente Standard se găsesc, printre altele, butoanele
(revenire la Microsoft Excel), (salvare a fişierului înclusiv a codului VBA), (rulare
procedură sau formă), (oprire procedură), (oprire procedură blocată), (mod design),
(afişare Project Explorer), (afişare Property Windows), (afişare Object Browser).
5
 Fereastra Project Explorer afişată de obicei în stânga, în care se observă structura
arborescentă a fiecărui fişier Excel deschis. Dacă fereastra Project Explorer nu e vizibilă, poate fi
afişată din View / Project Explorer, butonul de pe bara de instrumente sau Ctrl+R. Fereastra
Project Explorer poate fi închisă cu X – ul din colţul dreapta sus al ferestrei sale, sau prin clic
dreapta pe fereastră şi din meniul apărut, comanda Hide.
 Fereastra Code Window este zona din suprafaţa de lucru ce conţine cod VBA. Pentru
fiecare element din fereastra Project Explorer, codul aferent se obţine prin dublu clic. În cazul în
care nu aţi scris cod, fereastra este goală.
 Fereastra Immediate e foarte utilă pentru testarea şi depanarea anumitor secţiuni de cod.
Această fereastră poate fi vizibilă sau nu. Pentru afişarea ferestrei, utilizaţi comanda View /
Immediate Window sau Ctrl+G, iar pentru a o închide, folosiţi butonul X al ferestrei sau clic
dreapta / hide. În această fereastră se poate executa cod VBA fără crearea macro-urilor. Orice
comenzi scrieţi în această fereastră, vor dispărea când închideţi fişierul.

Adăugarea unui modul VBA


În cazul în care doriţi adăugarea unui modul nou VBA fişierului în care lucraţi, veţi proceda astfel:
1. Selectaţi numele fişierului din fereastra Project Explorer
2. Clic dreapta / Insert / Module
Obs: Când înregistraţi un macro, Excel-ul va insera automat codul VBA într-un modul.

Eliminarea unui modul VBA


În cazul în care doriţi ştergerea unui modul dintr-un fişier,
1. Selectaţi numele modulului din fereastra Project Explorer
2. Clic dreapta / Remove Module ...
3. Veţi fi întrebaţi dacă doriţi exportul modului înainte de ştergerea din acest fişier. Dacă
doriţi păstrarea codului, procedaţi după indicaţiile paragrafului următor.
Obs: nu puteţi elimina module asociate fişierului (ThisWorkbook) sau foilor (Sheet1, etc.).

6
Exportul şi importul obiectelor VBA
Salvarea obiectelor sau codului VBA în fişiere separate de fişierul curent poartă numele de export.
Folosirea acestor obiecte în alte fişiere presupune importul acestora.
Exportul unui obiect sau modul Excel se face astfel:
1. Selectaţi obiectul din fereastra Project Explorer
2. Clic dreapta / Export File
3. În fereastra Export File precizaţi calea şi numele fişierului.

Importul unui obiect sau modul Excel se face similar:


1. Selectaţi numele fişierului curent din fereastra Project Explorer
2. Clic dreapta / Import File
3. În fereastra Import File precizaţi calea şi numele fişierului.

1.3 Înregistrarea unei macro-comenzi


O macro-comandă lucrează ca un casetofon: l-am pornit şi înregistrează acţiunile pe care le
“traduce” în limbaj VBA.
Pentru a crea macrocomenzi parcurgeţi următorii paşi:
Pas1: Alegem comanda Record Macro din fila View / Macro sau din fila Developer sau de
pe bara de stare (butonul ).
Pas2: Apare fereastra următoare unde completăm numele macro-comenzii (fără spaţii),
alegem o combinaţie de taste (shortcut key) pentru execuţia rapidă a macro-ului, alegem locul de
stocare a macro-comenzii (în fişierul curent – This Workbook, într-un fişier nou – New Workbook
sau global, pentru accesul din orice fişier Excel - Personal Macro Workbook ). Opţional, putem
scrie o scurtă descriere a acţiunii macro-comenzii.
Pas3: Dacă dorim ca înregistrarea să se efectueze folosind adrese relative alegem opţiunea
Relative Reference din fila Developer sau View / Macros.
Pas 4: Se parcurg toate comenzile care trebuiesc înregistrate.
Ex. Page Layout / Page Setup / Margins : Top :2, Bottom :2, Left : 2, Right : 2 ; Page Layout / Page
Setup / Header şi introduceţi numele utilizatorului şi data în stânga; Page Layout / Page Setup /
Footer şi introduceţi numărul paginii curente în dreapta.
7
Pas 5: Se opreşte înregistrarea apăsând butonul Stop Recording de pe bara de stare, din fila
Developer sau View.

Exemplu: Crearea unei macrocomenzi cu numele Date firmă.


- Nume: Date_firma
- Combinaţia de taste: Ctrl + y.
- Localizare: This Workbook
- Descriere: Introducere date firma
- Alegem Relative Reference pentru ca datele să fie scrise începând cu celula activă
- Acţiuni:
- scriem datele firmei în celula curentă: Infotim ETA2U Training Center
- enter
- introducem adresa: Str. C. Brediceanu, nr. 8
- Stop înregistrare
În urma înregistrării unei macro-comenzi, programul Excel generează o secvenţă de program VBA,
de exemplu:

1.4 Execuţia unei macrocomenzi


Un macro poate fi executat astfel:
- din fila View / Macros / View Macro sau Developer / Macros ajungem în fereastra Macro

8
- se selectează macro-ul dorit din lista Macro Name.
- se apasă butonul Run
Obs. Mai rapid se poate executa o macro-comandă cu combinaţia de taste asociate.
1.5 Modificarea unei macrocomenzi
Modificarea unei macro-comenzi presupune intervenţia în succesiunea comenzilor înregistrare cu
ajutorul editorului Visual Basic.
Pas 1: Din fila View / Macros / View Macro sau Developer / Macros ajungem în fereastra
Macro
Pas 2: Selectăm numele macrocomenzii.
Pas 3: Apăsăm butonul Edit şi va apărea fereastra următoare :

Pas 4: Modificăm acţiunile înregistrate.


De exemplu, adăugăm la adresă localitatea Timişoara:

Pas 5: Închidem fereastra de editare.


1.6 Ştergerea unei macro-comenzi
Pas 1: Din fila View / Macros / View Macro sau Developer / Macros ajungem în fereastra
Macro
Pas 2: Selectăm numele macrocomenzii.
9
Pas 3: Delete.

1.7 Lucrul cu macro-comenzi globale


Până în acest moment am lucrat cu macro-comenzi păstrate local, în fişierul în care lucrăm. Dacă
dorim să creăm macro-comenzi care să poată fi utilizate din orice fişier Excel, atunci acestea le vom
crea global, în fişierul [Link] salvat de Excel în C:\Documents and Settings \ numele Dvs de
utilizator \ Application Data \ Microsoft \ Excel \ XLSTART.
Exemplu: Crearea unei macrocomenzi cu numele Date firmă global.
- Nume: Date_firma_global
- Combinaţia de taste: Ctrl + w.
- Localizare: Personal Macro Workbook
- Descriere: Introducere datele firmei în orice fisier Excel.
- Alegem Relative Reference pentru ca datele să fie scrise începând cu celula activă
- Acţiuni:
- scriem datele firmei în celula curentă: Infotim ETA2U Training Center
- enter
- introducem adresa: Str. C. Brediceanu, nr. 8
- enter
- scriem Telefon: 0256-277644, 0256-221372
- Stop înregistrare
Pentru a modifica sau şterge un macro global, parcurgem următorii paşi:
Pas 1: Afişăm fişierul [Link]: alegem View / Unhide şi din fereastra Unhide ,
selectâm fişierul [Link] şi OK.

Pas 2: În fişierul [Link] alegem fila View / Macros / View Macro sau Developer /
Macros şi ajungem în fereastra Macro.
Pas 3: Edităm sau ştergem macro-comanda.
Pas 4: Salvăm fişierul [Link].
Pas 5: Ascundem fişierul [Link]: alegem View / Hide.

1.8 Salvarea fişierelor ce conţin macro-comenzi

În Excel 2007-2010 fişierele obişnuite se deosebesc de cele ce conţin macro-comenzi. Astfel, dacă
doriţi să salvaţi un fişier fără macro-comenzi, folosiţi salvarea ca Excel Workbook (File (butonul
Office) / Save As / Excel Workbook), extensia fiind .xlsx. În cazul în care doriţi să salvaţi macro-
comenzile create, folosiţi salvarea ca Excel Macro-Enabled Workbook (File (butonul Office) /

10
Save As / Excel Macro-Enabled Workbook), extensia fiind .xlsm. Acesta este o element nou
introdus în Excel 2007.
1.9 Deschiderea unor fişiere care conţin macrocomenzi
La deschiderea unui fişier ce conţine macro-uri în Excel 2007-2010, va apare bara Security
Warning cu butonul Options, imediat sub banda din partea de sus a ferestrei.

Implicit, macro-urile sunt dezactivate, iar pentru a le activa daţi clic pe butonul Options şi Enable
this content din fereastra Microsoft Office Secutiry Options.

1.10 Introducerea unui buton asociat macro pe bara de instrumente


Macro-urile folosite des şi păstrate în fişierul Personal Macro Workbook pot fi rulate cu ajutorul
butoanelor de pe bara de comenzi rapide (Quick Access Toolbar).
Pentru a introduce un buton pe bara de comenzi rapide parcurgeţi următorii paşi:
1 Clic pe săgeata de la sfârşitul barei de comenzi rapide şi alegeţi opţiunea More
Commands.

11
2 Va apare fereastra Excel Options, alegem opţiunea Macros din lista Choose commands
from. Imediat, în listă vor fi afişate toate macro-urile disponibile,
selectăm macro-ul dorit şi clic pe Add. Numele macro-ului va fi afişat în lista din dreapta ferestrei
ce conţine toate elementele afişate în bara de access rapid.

3 Dacă dorim, putem modifica pictograma macro-ului. Selectăm macro-ul din lista
Customize Quick Access Toolbar şi clic pe Modify. Va apare fereastra Modify Button, de unde
alegem pictograma dorită.

1.11 Încrederea în fişiere ce conţin macro-comenzi


Pentru protecţia datelor Dvs, programul Excel vă cere activarea macro-comenzilor de fiecare dată
când deschideţi un fişier de conţine macro-uri.
Dacă lucraţi frecvent cu fişiere ce conţine macro-uri, acest lucru devine deranjant. Există două
alternative simple ce permit eliminarea necesităţii de a activa macro-urile la deschiderea fişierelor.
Prima alternativă presupune declararea unor directoare ca fiind “sigure”. Astfel, puteţi deschide
orice fişier din aceste directoare, macro-urile fiind activate automat.
A doua alternativă implică “încrederea” în autorul fişierului ce conţine macro-uri.
a) Directoare “de încredere”

12
Pentru a stabili că un director este de “încredere” parcurgeţi următorii paşi:
Pas 1: File (Butonul Excel Office) / Excel Options / Trust Center / Trust Center
Settings / Trusted Locations / Add New Location
Pas 2: În fereastra Microsoft Office Trusted Location clic pe Browse şi alegeţi directorul
pentru care doriţi să stabiliţi siguranţa:

Pas 3: Bifaţi opţiunea Subfolders of this location are also trusted, dacă doriţi ca şi
fişierele din subdirectoare să devină sigure. OK.
Pas 4: OK. Veţi observa în fereastra Trust Center calea şi numele directorului selectat.

Obs: În fereastra Trust Center / Trusted Location aveţi şi butoanele Remove şi Modify pentru a
elimina sau modifica directoarele “sigure” de pe calculatorul Dvs.
Specificarea unor locaţii (directoare) de “încredere” este utilă în cazul în care păstraţi fişierele cu
macro-uri în anumite directoare şi în cazul în care primiţi astfel de fişiere de la colegi.
b) “Încrederea” în autorul fişierului

În cazul în care Dvs. creaţi fişiere ce conţin macro-uri ce trebuie păstrate în locaţii arbitrare, vă
puteţi desemna Dvs. ca fiind “de încredere”.
Stabilirea încrederii în fişiere ce conţin macro-uri:
Pas 1: Deschideţi fişierul ce conţine macro-uri şi care nu se află într-un director de
încredere.

13
Pas 2: File (Butonul Excel Office) / Prepare / Add a Digital Signature. În fereastra ce
apare daţi clic pe Ok.
Pas 3: Apare fereastra Get a Digital ID în care selectaţi Create your own digital ID

Pas 4: În fereastra Create your own digital ID completaţi datele Dvs.

Pas 5: În fereastra următoare daţi CANCEL. NU daţi clic pe Sign /Go /collect $200 !!!

Important: Veţi semna digital doar codurile VBA din fişier, nu şi fişierul în sine. Folosirea
comenzii Prepare a butonului Excel Office e o cale uşoară către crearea unei identităţi digitale, dar
dacă veţi semna digital documentele, împiedicaţi orice modificare a conţinutului acestora. Dacă
semnaţi digital codurile VBA din fişiere, doar macro-comenzile sunt semnate şi oricine poate face
modificări în conţinutul fişierelor Excel.
Pas 6: Intraţi în editorul Visual Basic (Developer / Visual Basic) şi de aici alegeţi Tools /
Digital Signature. În fereastra ce apare observaţi că proiectul VBA curent nu este semnat
14
Pas 7: Alegeţi Choose şi din fereastra Select Certificate selectaţi ID-ul digital al Dvs.

Pas 8: După ce daţi ok, veţi observa că proiectul curent apare semnat de Dvs.

Pas 9: Reveniţi la Excel, salvaţi şi închideţi fişierul semnat digital într-o locaţie care nu e în
lista directoarelor sigure.
Pas 10: Deschideţi fişierul anterior. Clic pe butonul Options de pe bara Security. Va apare
fereastra următoare care vă indică faptul că documentele sunt semnate de un autor (Dvs. în acest
caz), dar pe care încă nu aţi stabilit dacă e de încredere. Alegeţi opţiunea Trust all documents
from this publisher pentru ca pe viitor toate documentele semnate de Dvs. să fie aibă macro-urile
active.
15
Obs: O dată ce v-aţi creat o identitate digitală, puteţi semna proiectele VBA urmând paşii 6-8.

Puteţi vizualiza sau modifica lista de autori de “încredere” astfel: File (Butonul Excel Office) /
Excel Options / Trust Center / Trust Center Settings / Trusted Publisher.

În cele prezentate se poate remarca faptul că aveţi la dispoziţie două soluţii de a desemna fişierele
Dvs, ca fiind de încredere. Dacă creaţi astfel de fişiere în special pentru ca Dvs. să le utilizaţi,
varianta a doua cu semnătura digitală pe proiectele VBA este cea mai flexibilă soluţie. Dacă, însă,
creaţi fişiere cu macro-comenzi pentru a fi utilizate în comun de mai mulţi utilizatori, varianta cu o
locaţie “sigură” este cea mai bună soluţie. Dacă veţi crea fişiere ce conţin macro-comenzi pentru o
largă audienţă, atunci soluţia indicată este achiziţionarea ueni semnături digitale autentice şi
semnarea documentelor.
16
2. Lucrul cu fişiere şi foi de calcul
2.1Elemente de bază de VBA pentru Excel
Limbajul VBA se bazează pe lucrul cu obiecte. Pentru a le utiliza, iată câteva noţiuni elementare de
lucru cu limbajul:
 cod: toate acţiunile pe care le executaţi sunt scrise în cod VBA. Codul VBA scris sau
înregistrat (cu ajutorul macro-urilor) este stocat în module VBA.
 modul: modulele VBA sunt stocate în foi Excel. Pentru a vizualiza sau modifica module
VBA, folosiţi editorul Visual Basic (VBE) fie din fila Developer, fie cu ajutorul combinaţiei de
taste Alt+F11. Un modul conţine una sau mai multe proceduri.
 Procedura: o procedura este o unitate de cod care efectuează anumite acţiuni. În VBA
sunt două tipuri de proceduri: subrutine (Sub) şi funcţii (Function).
o Subrutina: conţine mai multe instrucţiuni care se execută. Toate macro-urile sunt
codificate sub forma unei subrutine. Un asfel de exemplu este următorul:
Sub InserareFoaieNoua()
Sheets("Sheet1").Select
[Link]
End Sub
o Funcţia: e similară cu subrutina, dar returnează o valoare. Poate fi apelată dintr-o
subrutină sau o altă funcţie, sau poate fi utilizată direct în formule din foile de calcul Excel.
Function spor(salariu As Integer)
' sporul este de 20% din salariu
spor = salariu * 1.2
End Function
 Obiect: în limbajul VBA se lucrează cu obiecte ale aplicaţiei Excel (în cazul nostru).
Exemple de obiecte: worksheet, workbook, application, range, cell, chart. În Excel sunt mai mult de
100 de clase de obiecte ce pot fi utilizate. Aceste clase de obiecte sunt aranjate într-o ierarhie.
 Colecţii: obiecte de acelaşi tip formează o colecţie. De exemplu, colecţia Worksheets
conţine toate foile de lucru dintr-un fişier.

 Ierarhia obiectelor: Unele obiecte pot conţine alte obiecte (adică sunt containere pentru
acestea). De exemplu, obiectul Application desemnează aplicaţia Excel şi conţine alte obiecte
precum Workbook (fişierul Excel), ActiveCell (celula activă), ActiveChart (graficul activ) etc.
Obiectul Workbook conţine la rândul lui alte obiecte, precum Worksheet (foi de lucru) şi Chart
(grafice). Obiectul Worksheet conţine multe obiecte, cum ar fi Range (domeniu), PivotTable (tabele
pivot), etc. Şi lista poate continua.
O astfel de organizare a acestor obiecte se numeşte ierarhia de obiecte Excel. Aveţi mai jos o mică
porţiune această ierarhie (întreaga ierarhie o puteţi vizualiza prin căutarea în help-ul VBA a
cuvintelor Excel Object Model Map).
Ierarhia obiectelor Excel:
Application ( reprezintă mediul de lucru EXCEL)
Workbooks (mulţimea fişierelor de lucru)
ThisWorkbook (fişierul de lucru în care se execută operaţia curentă)
Sheets (mulţimea tuturor foilor din fişierul de lucru)
WorkSheets (mulţimea foilor de calcul din fişierul de lucru)
Charts (mulţimea foilor de grafic)
Range (celula sau domeniul/domeniile de celule apelat folosind nume sau referinţe de
tip A1)
Cells (celula sau domeniul de celule apelat folosind referinţe de tip R1C1)
17
Când vă referiţi la un obiect conţinut în alt obiect, veţi specifica poziţia acestuia în ierarhia de
obiecte folosind punctul (“.”) ca separator între container şi membru.
De exemplu, referirea la fişierul [Link] se face astfel:
Application. Workbooks("[Link]")
Vă referiţi astfel la fişierul [Link] din colecţia Workbooks. Această colecţie este conţinută în
obiectul Application.
Dacă doriţi să vă referiţi la foaia Sheet1 din fişierul [Link], veţi proceda astfel:
[Link]("[Link]").Worksheets("Sheet1")
Mai mult, dacă doriţi să ajungeţi în celula A1 din foaia Sheet1 din fişierul [Link], scrieţi
următorul cod:
[Link]("[Link]").Worksheets("Sheet1").Range("A1")
 Obiecte active: în cazul în care omiteţi să faceţi referire la un obiect, Excel-ul foloseşte
obiectele active, ca substitut (dacă e posibil). Astfel, dacă fişierul Book1 este fişierul activ, o
variantă simplificată de a scrie în celula A1 din foaia Sheet 1 este următoarea:
Worksheets("Sheet1").Range("A1")
Mai mult, dacă foaia Sheet1 este foaia activă, puteţi simplifica şi mai mult scrierea:
Range("A1")
Obs: dacă foaia Sheet2 este foaia activă (în aceasta sunteţi poziţionaţi), atunci referirea se face la
celula A1 din foaia Sheet2.
Ierarhia obiectelor active Excel:
Application ( reprezintă mediul de lucru EXCEL)
ActiveWorkbook (fişierul de lucru activ)
ActiveSheet (foaia de lucru activă)
ActiveChart (foaia de grafic activă)
ActiveCell (celula activă)
Selection (obiectul selectat)
 Proprietăţi ale obiectelor: Obiectele au proprietăţi (le puteţi gândi ca setări). De exemplu,
un obiect de tip domeniu (Range) are proprietăţi ca valoare (Value) sau nume (Name), un obiect de
tip grafic (Chart) are proprietăţi ca tip grafic (Type) etc. Cu ajutorul VBA puteţi determina şi
modifica aceste proprietăţi.
De exemplu, scriem valoarea 1 în celula A1 din foaia Sheet1 a fişierului curent.
Worksheets("Sheet1").Range("A1").Value = 1
 Metode ale obiectelor: Obiectele au pe lângă proprietăţi şi metode. Metodele sunt acţiuni
care pot fi efectuate de obiecte. De exemplu, o metodă a obiectului Range este ClearContents, ceea
ce determină golirea conţinutului celulelor din domeniu.
Astfel, dacă doriţi golirea conţinutului celulelor A1:B2 din foaia Sheet1 a fişierului activ, scrieţi
următorul cod:
Worksheets("Sheet1").Range("A1:B2").ClearContents
 Variabile VBA: puteţi crea variabile VBA care să conţină anumite valori. De exemplu, în
variabila impozit doriţi să păstraţi procentul aferent acestuia, valoare care se găseşte în celula C5
din sheet1 a fişierului curent:
impozit = Worksheets("Sheet1").Range("A1").Value
 Instrucţiuni VBA: în limbajul VBA, există şi instrucţiuni specifice de programare:
instrucţiuni de decizie, de ciclare etc.
 Evenimente: unele obiecte răspund la anumite evenimente (clic de mouse, apăsarea unei
taste, trecere la o foaie nouă, modificarea valorii unei celule, etc).

2.2Lucrul cu fişiere Excel din VBA

18
Lucrul cu fişiere Excel din VBA presupune folosirea obiectelor ThisWorkbook, ActiveWorkbook
din a celor din colecţia Workbooks. Toate operaţiunile cu fişiere înseamnă folosirea metodelor şi
proprietăţilor acestor obiecte.
Crearea unui fişier nou
Comanda de crearea a unui fişier nou este:
[Link]
Exemplu: în fereastra Immediate scrieţi comanda de creare a unui fişier nou.
Numărul de fişiere deschise
Proprietatea care afişează numărul fişierelor deschise este:
[Link]
Exemplu: în fereastra Immediate afişaţi numărul de fişiere deschise scriind comanda ?
[Link]. Count este o proprietate a obiectului Workbook, iar pentru afişarea ei, în
fereastra Immediate, se scrie simbolul “?” înaintea comenzii.
Închiderea tuturor fişierelor deschise
[Link]
Referirea la un anumit fişier

a) Folosind numărul fişierului


Toate fişierele deschise în Excel sunt păstrate într-o listă. Dacă dorim să accesăm primul fişier
Excel, comanda este Workbooks(1), pentru al doilea fişier, comanda este Workbooks(2), etc.
Exemplu: afişaţi în fereastra Immediate numele fişierelor Excel deschise (folosiţi comanda ?
Workbooks(nr_fisier).Name ).

b) Folosind numele fişierului


Un alt mod de referire la un fişier din VBA cel în care folosim direct numel fişierului:
Workbooks(“[Link]”).
Exemplu: închideţi fişierul [Link] din fereastra Immediate. (tastaţi comanda
Workbooks(“[Link]”).Close)
Exmplu: activaţi un anumit fişier din fereastra Immediate. tastaţi comanda
Workbooks(“[Link]”).Activate)

c) Utilizând fişierul activ


Dacă nu există pericol de confuzie, puteţi folosi pentru referirea unui fişier, obiectul
ActiveWorkbook ce indică fişierul activ.
Exemplu: afişaţi în fereastra Immediate numele fişierului Excel activ (folosiţi comanda ?
[Link] ).
d) Utilizând fişierul curent
Pentru a folosi fişierul curent de lucru se foloseşte obiectul ThisWorkbook.
Exemplu: afişaţi în fereastra Immediate numele fişierului Excel curent (folosiţi comanda ?
[Link] ).
Salvarea unui fişier

a) Salvarea cu comanda Save:


Workbooks(“[Link]”).Save
b) Salvarea cu comanda Save As:
Workbooks(“[Link]”).SaveAs(“C:\[Link]”)
După cum se observă, salvarea presupune referirea la fişierul pe care doriţi să-l salvaţi şi utilizarea
comenzii Save pentru salvarea cu acelaşi nume sau a comenzii SaveAs. În cazul comenzii SaveAs
veţi specifica între ghilimele calea şi numele fişierului. Dacă nu specificaţi calea, fişierul va fi salvat
în directorul curent de lucru.
19
Deschiderea unui fişier
Comanda de deschidere a unui fişier e similară cu salvarea acestuia. Vom preciza doar numele
fişierului atunci când acesta se găseşte în directorul curent, sau toată calea şi numele fişierului,
atunci când acesta este în alt director.
[Link](“[Link]”)
sau
[Link](“C:\[Link]”)

Exerciţii:
- Creaţi trei fişiere ([Link])
- Afişaţi numărul fişierelor deschise ([Link])
- Afişaţi numele fiecărui fişier (folosiţi referirea cu ajutorul numărului fişierului, a numelui
sau a celui activ)
- Închideţi fişierul activ ([Link])
- Afişaţi numărul fişierelor deschise ([Link])
- Afişaţi numele fiecărui fişier (folosiţi referirea cu ajutorul numărului fişierului, a numelui
sau a celui activ)
- Activaţi primul fişier creat
- Salvaţi fişierul cu comanda Save ([Link])
- Salvaţi celălalt fişier cu comanda Save As ([Link](“C:\[Link]”) )
- Închideţi toate fişierele ([Link])
- Deschideţi cele două fişiere salvate

2.3Lucrul cu foi Excel din VBA

Pentru a folosi foi de calcul Excel în VBA, vom utiliza metode şi proprietăţi ale obiectului
ActiveWorksheet sau a celor din colecţia Worksheets. Similar, pentru a folosi foi de grafic Excel
în VBA, vom utiliza obiectul ActiveChart sau din a celor din colecţia Charts. Pentru a folosi foi
de calcul sau grafic avem la dispoziţie obiectul ActiveSheet sau colecţia Sheets. Toate aceste
obiecte au metode şi proprietăţi comune, cum ar fi:
 Metode: inserarea, copierea, mutarea, ştergerea sau tipărirea foilor;
 Proprietăţi: numărul foilor dintr-un fişier, vizibilitatea unei foi, întreruperile de pagină
orizontale sau verticale.

Referirea la o anumită foaie


a) Folosind numărul foii

Lista foilor unui fişier poate fi folosită pentru accesarea acesteia. Astfel, dacă dorim să accesăm
prima foaie de calcul, comanda este Worksheets(1), pentru a doua Worksheets(2), etc. Similar se
procedează şi pentru foile de grafic folosind Charts(1), Charts(2) etc. sau pentru foi de orice tip,
cu Sheets(1), Sheets(2) etc.
Exemplu: afişaţi în fereastra Immediate numele foilor Excel din fişierul curent (folosiţi comenzile ?
Worksheets(nr_foaie).Name, ?Sheets(nr_foaie).Name şi ?Charts(nr_foaie).Name ).
b) Folosind numele foii

Un alt mod de referire la un fişier din VBA cel în care folosim direct numele foii:
Worksheets(“Sheet1”), Charts(“Grafic2”) sau Sheets(“Sheet4”).
Exemplu: activaţi foaia Grafic3 din fereastra Immediate. (tastaţi comanda Charts
(“Grafic3”).Activate)

20
Exmplu: activaţi un anumit fişier din fereastra Immediate. tastaţi comanda
Workbooks(“[Link]”).Activate)
c) Folosind foaia activă

Referirea la foaia activă se face cu ajutorul obiectulelor ActiveSheet (foaia de calcul sau grafic
activă)sau ActiveChart (foaia de grafic activă).
Exemplu: afişaţi în fereastra Immediate numele foii active (folosiţi comanda ?[Link]).
Inserarea unei noi foi de calcul
Metoda Add a colecţiilor Worksheets, Charts sau Sheets conduce la introducerea unei noi foi de
calcul sau grafic. Foaia nou creată devine foaia activă.
Sintaxa:
[Link](Before, After, Count, Type)
unde:
foaie – o variabilă ce reprezintă o foaie (ex. sheets, worksheets sau charts)
before – un obiect ce reprezintă foaia înaintea căreia va fi inserată noua foaie (argument opţional)
after – un obiect ce reprezintă foaia după căreia va fi inserată noua foaie (argument opţional)
count – numărul de foi inserate (argument opţional)
type – specifică tipul foilor inserate xlWorksheet (pentru foi de calcul), xlChart (pentru foi de
grafic); valoarea implicită este xlWorksheet (argument opţional)
Valoarea returnată: un obiect de tip worksheet sau chart ce desemnează noua foaie.
Exemple:
1) Inseraţi o nouă foaie de calcul:
[Link]
2) Inserarea unei noi foi de calcul înaintea foii Sheet3:
[Link] before:=sheets("Sheet3")
sau
[Link] before:=sheets("Sheet3"), type:= xlWorksheet
3) Inserarea unei noi foi de grafic după foaia Sheet1:
[Link] after:=sheets("Sheet1"), type:= xlChart
sau
[Link] after:=sheets("Sheet1")
4) Inserarea a două foi de calcul la sfârşit:
[Link] after:=sheets([Link]), type:= xlWorksheet
sau
[Link] after:=sheets([Link])
Redenumirea unei foi
Schimbarea numelui unei foi presupune stabilirea unei valori pentru proprietatea Name a obiectului
respectiv:
[Link] = nume_foaie
unde:
foaie – un obiect de tip foaie de calcul sau grafic în Excel
nume_foaie – noul nume pe care dorim să-l dăm foii, scris între ghilimele
Exemplu:
1) Modificaţi numele primei foi în Informatii:
Worksheets(1).Name=”Informatii”
2) Modificaţi foii Chart1 în Evolutie cheltuieli:
Sheets(“Chart1”).Name=” Evolutie cheltuieli”
Ştergerea unei foi
Ştergerea unei foi se face prin apelarea metodei Delete a obiectului respectiv:
[Link]
unde:
21
foaie – un obiect de tip foaie de calcul sau grafic în Excel
Dacă pe foaie sunt informaţii, va apare o fereastră care vă va cere confirmarea ştergerii.
Exemplu: Ştergeţi foaia cu numele Informatii:
Sheets(“Informatii”).Delete

Ascunderea/afişarea unei foi


Ascunderea/afişarea unei foi presupune folosirea proprietăţii Visible a obiectului respectiv. Putem
verifica starea acestei proprietăţi, sau o putem modifica. Dacă stabilim valoarea True a proprietăţii
visible, foaia va fi afişată, în timp ce valoarea False determină ascunderea foii.
[Link] = boolean
unde:
foaie – un obiect de tip foaie de calcul sau grafic în Excel
boolean – valoarea True sau False
Exemple:
1) Foaia Evolutie cheltuieli este afişată?
?Sheets(“Evolutie cheltuieli”).Visible
2) Ascundeţi foaia Evolutie cheltuieli:
Sheets(“Evolutie cheltuieli”).Visible = False
3) Verificaţi faptul că foaia Evolutie cheltuieli este ascunsă:
?Sheets(“Evolutie cheltuieli”).Visible
4) Afişaţi foaia Evolutie cheltuieli:
Sheets(“Evolutie cheltuieli”).Visible = True

Copierea sau mutarea unei foi


Pentru copierea sau mutarea foilor se folosesc metodele Copy, respectiv Move.
Sintaxa:
[Link](Before, After)
[Link](Before, After)
unde:
foaie – o variabilă ce reprezintă o foaie (ex. sheets, worksheets sau charts)
before – un obiect ce reprezintă foaia înaintea căreia va fi inserată noua foaie (argument opţional)
after – un obiect ce reprezintă foaia după căreia va fi inserată noua foaie (argument opţional)
Când folosiţi funcţia Copy sau Move, veţi folosi doar unul din argumentele before sau after, în caz
contrar, Excel-ul va genera o eroare. Dacă nu specificaţi nici before, nici after, Excel va crea un
fişier nou ce conţine foaia copiată sau mutată.

Exemple:
1) Copiaţi foaia Evolutie cheltuieli la începutul foilor:
Sheets(“Evolutie cheltuieli”).Copy Before:= Sheets(1)
2) Mutaţi foaia Sheet2 la sfarsitul foilor:
Sheets(“Sheet2”).Move after:=Sheets([Link])
3) Copiaţi foaia Evolutie cheltuieli după foaia Sheet2:
Sheets(“Evolutie cheltuieli”).Copy After:= Sheets(“Sheet2”)
4) Mutaţi foaia Evolutie cheltuieli într-un fişier nou:
Sheets(“Evolutie cheltuieli”).Move
5) Copiaţi foaia Sheet3 din fişierul curent în fişierul Book2, la început:
Sheets(“Sheet3”).Copy Before:= Workbooks(“Book2”).Sheets(1)
6) Mutaţi foaia Sheet1 din Book 2 în fişierul Book1, după foaia Sheet3:
Workbooks(“Book2”).Sheets(“Sheet1”).Copy After:= Workbooks(“Book1”).Sheets
(“Sheet3”)

22
Vizualizarea unei foi înainte de tipărire
Pentru a vizualiza o foaie înainte de tipărire se foloseşte metoda PrintPreview a obiectelor de tip
foi.
Sintaxa:
[Link](EnableChanges)
unde:
foaie – o variabilă ce reprezintă o foaie (ex. sheets, worksheets sau charts)
EnableChanges – True dacă doriţi ca marginile şi alte setări de pagină să poată fi efectuate,
sau False în caz contrar. Valoarea implicită este True. (argument opţional)
Exemplu: Vizualizaţi foaia Sheet2 înainte de tipărire astfel încât utilizatorul să aibă posibilitatea de
a modifica marginile paginii:
Sheets(“sheet2”).PrintPreview
Tipărirea unei foi
Tipărirea unei foi se realizează cu ajutorul metodei PrintOut a obiectelor de tip foi Excel.
Sintaxa:
[Link](From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate,
PrToFileName, IgnorePrintAreas)
unde:
foaie – o variabilă ce reprezintă o foaie (ex. sheets, worksheets sau charts)
from – numărul de pagină de la care porneşte tipărirea; dacă acest argument este omis, tipărirea
porneşte de la prima pagină (argument opţional)
to – ultima pagină care se listează; dacă acest argument este omis, tipărirea se opreşte la ultima
pagină (argument opţional)
copies – numărul de exemplare tipărite; dacă argumentul e omis, se tipăreşte un exemplar
(argument opţional)
preview – True dacă dorim afişarea ferestrei PrintPreview înainte de tipărire sau False dacă vrem să
trecem direct la tipărire (argument opţional)
ActivePrinter – stabileşte numele imprimantei la care se face listarea; dacă argumentul nu e
precizat, tipărirea se face la imprimanta implicită (argument opţional)
PrintToFile – True dacă dorim tipărirea în fişier, False în caz contrar. Dacă PrToFileName nu e
precizat, va apare o fereastră ce va cere utilizatorului numele fişierului. Valoarea implicită este
False. (argument opţional)
Collate – True dacă dorim tipărirea în colaţionarea multiplelor exemplare. (argument opţional)
PrToFileName – dacă PrintToFile e True, cu ajutorul acestui argument putem preciza numele
fişierului în care facem tipărirea.
IgnorePrintAreas – True pentru a ignora selecţia din PrintArea şi a tipări întegul obiect.
Exemple:
1) Tipăriţi foaia Sheet1 la imprimanta implicită:
Sheets(“Sheet1”).PrintOut
2) Tipăriţi paginile 2-4 din foaia Sheet2, în 2 exemplare colaţionate, la imprimanta implicită:
Sheets(“Sheet2”).PrintOut from:=2, to:=4, copies:=2, collate:=true

2.4Lucrul cu domenii
Multe operaţii pe care le veţi efectua din VBA au la bază lucrul cu anumite celule sau domenii din
foile de calcul. O celulă sau domeniu înseamnă în VBA un obiect Range. Obiectul Range face parte
din obiectele conţinute în obiectul Worksheet (foaie de lucru).
Referirea la un obiect Range în VBA se poate face mai multe moduri:
 proprietatea Range a unui obiect Worksheet sau Range
23
 proprietatea Cells a unui obiect Worksheet sau Range
 proprietatea Offset a unui obiect Range
 proprietăţile Rows şi Columns a unui obiect Worksheet sau Range
 folosind celula activă (ActiveCell)
Adresarea unui domeniu cu ajutorul obiectului Range
Sintaxa:
[Link](cell1, cell2) unde:
obiect – un obiect de tip Worksheet; dacă nu se specifică, va fi folosit obiectul ActiveSheet
cell1 – numele domeniului. Exemple: ”A1”, ”C2:D4”, ”C:F”, ”2:12” sau un nume definit în Excel.
(argument obligatoriu)
cell2 – celula din conlţul stânga sus sau dreapta jos a domeniului. (argument opţional)
Exemple:
1) Introduceţi în celula A1 din foaia Sheet1, valoarea 10.5:
Worksheets(“Sheet1”).Range(“A1”).Value = 10.5
2) Introduceţi în domeniul A3:C3 din foaia Sheet1, valoarea 100:
Worksheets("Sheet1").Range("A3","C3").Value = 100
sau
Worksheets("Sheet1").Range("A3:C3").Value = 100
3) Introduceţi în celula D3 din foaia Sheet1, formula de însumare a celulelor [Link]
Worksheets("Sheet1").Range("D3").Formula = "=sum(A3:C3)"
4) Denumiţi celulele B4:C5 cu numele date. Cu autorul VBA scrieţi în domeniul date
valoarea 250:
Worksheets("Sheet1").Range("date").Value = 250
5) Introduceţi în celulele A5,A7,A9,C6,D8, valoarea 10:
Worksheets("Sheet1").Range("A5,A7,A9,C6,D8") = 10
6) Introduceţi în celula activă valoarea 5:
[Link] = 5
sau
[Link]("A1") = 5
Obs: Când folosim obiectul Range pentru celula activă, domeniul este considerat relativ faţă
de această celulă, poziţia A1 desemnând celula activă.
7) Introduceţi în celula din dreapta celulei active valoarea 20:
[Link]("B1") = 20
8) Introduceţi în celula din dreapta şi un rând mai jos faţă de celula activă valoarea 8:
[Link]("B2") = 8
9) Coloanele corespunzătoare domeniului "A2:C4"formataţi-le cu un font de culoare roşie.
Range("A2:C4").[Link]=RGB(255,0,0)
10) Rândurile corespunzătoare domeniului "A2:C4"formataţi-le cu un font de culoare verde.
Range("A2:C4").[Link]=RGB(0,255,0)
11) Coloanele 2 şi 3 din domeniul "B2:F20" formataţi-le cu o culoare albastră pentru fundal.
Range("B2:F20").Columns("B:C").[Link]=RGB(0,0,255)
12) Rândurile 4 şi 5 din domeniul "B2:F20" formataţi-le cu o culoare galbenă pentru fundal.
Range("B2:F20").Rows("4:5").[Link]=RGB(255,255,0)
13) Regiunea curentă, în care se găseşte celula C3 va fi formatată cu o culoare roz.
Range("C3").[Link]=RGB(255,0,255)
14) În domeniul B3:F20 întroduceţi în subdomeniul format din rândurile 3- 4, coloanele 3-4
(relativ la domeniu iniţial), valoarea 222.
Range("B3:F20").Range("C3:D4").Value=222
Adresarea unui domeniu cu ajutorul proprietăţii Cells

24
O altă modalitatea de a adresa celule este cea folosind proprietatea Cells a obiectelor Worksheet sau
Range. Rezultatul returnat de proprietatea Cells este un obiect de tip Range.
Sintaxa:
[Link](rowIndex, columnIndex)
[Link](cellIndex)
[Link]
unde:
obiect – un obiect de tip Worksheet sau Range; dacă nu se specifică, va fi folosit obiectul
ActiveSheet
rowIndex – numărul rândului
colIndex – numărul coloanei
cellIndex – numărul celulei (prima celulă este A1, a doua celulă B1, etc)
Obs: dacă nu se precizează nici un argument pentru proprietatea Cells, instrucţiunea va returna toate
celulele de pe foaie.
Exemple:
1) Introduceţi în celula D7 din foaia Sheet1, valoarea 2:
Worksheets(“Sheet1”).Cells(7,4) = 2
2) Introduceţi în celula G1 din foaia Sheet1, valoarea 19:
Worksheets(“Sheet1”).Cells(7) = 19
sau
Worksheets(“Sheet1”).Cells(1,7) = 19
3) Introduceţi în celula cu numărul 16385 (celula A2) din foaia Sheet1, valoarea 1000:
Worksheets("Sheet1").Cells(16385) = 1000
4) Formataţi celulele de pe foaia Sheet1 cu un font de dimensiune 14:
Worksheets("Sheet1").[Link] = 14
5) Goliţi de conţinut toate celulele de pe foaia activă:
[Link]
6) Introduceţi în celula activă valoarea 5:
ActiveCell = 5
sau
[Link](1,1) = 5
Obs: Când folosim proprietatea Cells a celulei active, aceasta este considerată ca fiind în
colţul stânga sus a domeniului folosit, poziţia (1,1) desemnând celula activă.
7) Introduceţi în celula din dreapta celulei active valoarea 20:
[Link](1,2) = 20
8) Introduceţi în celula din dreapta şi un rând mai jos faţă de celula activă valoarea 8:
[Link](2,2) = 8
9) Introduceţi în celula cu numărul 7 din domeniul A1:C6 valoarea 90:
Range("A1:C6").Cells(7) = 90
Obs: pozitia 7 în domeniul A1:C6, format din 3 coloane şi 6 rânduri este dat de celula A3.
10) Introduceţi în celula cu numărul 20 din domeniul A1:C6 valoarea 100:
Range("A1:C6").Cells(20) = 100
Obs: pozitia 20 în domeniul A1:C6, format 3 coloane x 6 rânduri = 18 celule, se găseşte în
afara domeniului, dar Excel va număra în continuare câte 3 coloane pe rând, astfel încât
poziţia 20 ajunge în celula B7.
Adresarea unui domeniu cu ajutorul proprietăţii Offset
Proprietatea Offset a obiectului Range returnează un obiect de tip Range. Spre deosebire de
celelalte două variante de adresare, această proprietate este doar a obiectului Range.
Proprietatea Offset are două argumente care corespund poziţiei relative faţă de colţul stânga sus a
obiectului de tip Range.
25
Sintaxa:
[Link](rowOffset, columnOffset)
unde:
obiect – un obiect de tip Range
rowOffset – numărul rândului, relativ la colţul stânga sus a obiectului Range
colOffset – numărul coloanei, relativ la colţul stânga sus a obiectului Range
Exemple:
1) Introduceţi în celula activă valoarea 10:
[Link] = 10
sau
[Link](0,0) = 10
Obs: poziţia (0,0) corespunde celulei active, sau colţului din stânga sus a unui domeniu
format dn mai multe rânduri sau coloane.
2) Introduceţi în celula de deasupra şi din stânga celulei active valoarea 1:
[Link](-1,-1)= 1
Obs: poziţia (-1,-1) corespunde celulei aflată un rând deasupra şi o coloană mai în stânga
celulei active, dar, dacă celula activă se află pe primul rând, sau pe prima coloană a foii de
calcul, o astfel de adresare va genera o eroare, deoarece Excel nu se poate deplasa în rânduri
sau coloane inexistente.
3) Translataţi cu 1 coloană şi două rânduri domeniul A2:D8 şi introduceţi valoarea 50:
Range("A2:D8").Offset(2,1) = 50
Adresarea unui domeniu cu ajutorul proprietăţilor Rows şi Columns
Proprietăţile Rows şi Columns a obiectelor de tip Worksheet sau Range returnează un obiect de tip
Range.
Sintaxa:
[Link](rowIndex)
[Link](columnIndex)
unde:
obiect – un obiect de tip Worksheet sau Range; dacă nu se specifică, va fi folosit obiectul
ActiveSheet
rowIndex – numărul rândului
colIndex – numele coloanei
Exemple:
1) Stabiliţi ca rândul al 3-lea să aibă dimensiunea fontului de 14:
Rows(3).[Link] = 14
2) Ştergeţi rândul 5:
Rows(5).Delete
3) Formataţi coloana C astfel încât să aibă dimensiunea fontului de 10:
Columns("C").[Link] = 10
4) Ştergeţi coloana E:
Columns("E").Delete

2.5Formule
Mai toate formulele conţin adrese de celule. Referinţa la aceste celule poate fi făcută utilizând
adrese relative (ex. A1), absolute ($A$1), mixte – rând absolut (A$1), coloană absolută ($A1).

26
Notaţia R1C1

În mod obişnuit, Excel-ul foloseşte notaţia A1, adică fiecare celulă e identificată cu ajutorul literei
corespunzătoare coloanei şi a numărului corespunzător rândului. Pe lângă această notaţie, Excel
foloseşte şi notaţia R1C1, unde R – rândul şi C – coloana. Astfel, R1C1 înseamnă $A$1, R2C1 e
totuna cu $A$2, iar R3C7 este $G$3.
Puteţi modifica modul de afişare, astfel încât să se folosească notaţia R1C1 din butonul Excel /
Excel Options / Formulas şi bifaţi opţiunea R1C1 reference style. Veţi observa numerotarea cu
numere a coloanelor, precum şi modificarea în noua notaţie a adreselor celulelor.
Acest mod de adresare a celulelor este deosebit de util pentru adrese absolute. În cazul folosirii
adreselor relative, se folosesc paranteze pentru a preciza numărul de rânduri sau coloane relativ la
poziţia actuală. Astfel, R[-1]C[2] înseamnă celula aflată deasupra cu un rând (observaţi -1 după R)
şi două coloane mai în dreapta (observaţi numărul 2 de după C).
Obs: Atunci când nu se precizează nici un număr după R sau C, înseamnă că nu se modifică rândul
sau coloana.
De exemplu, dacă sunteţi în C2 (R2C3), următoarele formule au acelaşi efect:

Notaţia A1(standard) Notaţia R1C1


=A1+1 =R[-1]C[-2]+1
=C1+1 =R[-1]C+1
=B2+1 =RC[-1]+1
=$A$1+1 =R1C1+1
=$A1+1 =R[-1]C1+1
=A$1+1 =R1C[-2]+1
=SUM(A1:A10) =SUM(R[-1]C[-2]:
R[8]C[-2])
=SUM($A$1: $A$10) =SUM(R1C1:R10C1)

Folosirea notaţiei R1C1 în formule din VBA


Obiectul Range are proprietatea FormulaR1C1 ce se utilizează în calcule ce folosesc notaţia R1C1.
Sintaxa:
obiect.FormulaR1C1
unde:
obiect – un obiect de tip Range
Proprietatea FormulaR1C1 stabileşte sau returnează formula utilizând notaţia R1C1.
Exemplu: În tabelul următor, folosiţi formule în notaţia R1C1 pentru a calcula Valoare, Valoare
TVA, Valoare cu TVA şi Totalul pentru valoare, valoare TVA şi valoare cu TVA.

Secvenţa de comenzi este următoarea:


a) Calcul Valoare
Range("D4:D6").FormulaR1C1="=RC[-2]*RC[-1]"
b) Calcul Valoare TVA

27
Range("E4:E6").FormulaR1C1="=RC[-1]*R3C5"
c) Calcul Valoare cu TVA
Range("F4:F6").FormulaR1C1="=RC[-2]+RC[-1]"
d) Calcul Total pentru Valoare, Valoare TVA şi Valoare cu TVA
Range("D7:F7").FormulaR1C1="=R[-3]C+R[-2]C+R[-1]C"
sau
Range("D7:F7").FormulaR1C1="=sum(R[-3]C:R[-1]C)"

28
3. Instrucţiuni VBA

3.1Variabile şi constante. Tipuri de date

Deseori în programe este necesară memorarea diverselor valori folosite în efectuarea calculelor.
Limbajul VBA foloseşte variabile şi constante pentru stocarea temporară a valorilor folosite în
timpul execuţiei programelor.
Variabila  un loc în memoria RAM rezervat pentru memorarea unei valori. Orice variabilă are un
nume (prin care se face referire la valoarea pe care o conţine variabila) şi un tip de dată (care
determină felul datei pe care variabila o poate stoca).
Obs. Valoarea memorată într-o variabilă poate fi modificată pe parcursul execuţiei programului.
Reguli (în folosirea variabilelor)
 să înceapă cu o literă
 să nu conţină . sau caractere speciale
 să fie unice
 să nu se folosească cuvinte rezervate

Constantele = sunt valori care nu se modifică în timpul execuţiei programului.

Tipuri de date

Variabilele şi constantele se caracterizează prin nume şi tip. Tipul identifica felul datelor care pot fi
memorate şi dimesiunea acestora (nr. de biţi).

Tip Domeniu
Byte 0 şi 255
Boolean True sau False
Integer între -32.768 şi 37.767
Long între -[Link] şi [Link]
Single între -3.402823E38 şi –1.401298E-45 (pentru valori negative);
între 1.401298E-45 şi 3.402823E38 (pentru valori pozitive)
Double între -1,79769313486232E308 şi -4,94065645841247E-324
(negative val pentru valori negative); între 4,94065645841247E-
324 şi 1,79769313486232E308 (pentru valori pozitive)
Currency între -[Link].477,5808 şi [Link].477,5807
Decimal +/–[Link].[Link].950.335 fără zecimale; +/–
7.9228162514264337593543950335 cu 28 de zecimale după
virgulă
Date Între [Link]. 100 şi [Link]. 9999
Object Orice referinţă la un obiect
String Între 0 şi 2 miliarde de caractere.
(lungime variabilă)
String Între 0 şi 65.400 caractere
(lungime fixă)
Variant Orice valoare numerică din domeniul Double. Poate avea valori
(pentru numere) speciale, pecum Empty, Error, Nothing sau Null
Variant Între 0 şi 2 miliarde de caractere
(pentru numere)

29
Declararea variabilelor

Declararea unei variabile se poate face explicit prin folosirea instrucţiunii Dim.
Sintaxa:
Dim nume_variabila as TipDată
Exemple:
Dim dobanda As Double
Dim FinalProiect as Boolean
Dim DataInceput As Date
Dim varsta as Byte
Dim cantitate as Integer
Dim numprod As String
Dim nume As String * 30

Obs: variabila nume e declarată ca un şir de 30 de caractere (lungime fixă), iar variabila numprod e
declarată ca un şir de caractere variabil.

Obs. Declararea unei variabile se poate face şi implicit prin utilizarea variabilei în program. Totuşi,
acest mod nu e recomandat, deoarece poate conduce uşor la erori sau confuzii în program.
Pentru a forţa declararea tuturor variabilelor utilizate, scrieţi în prima instrucţiune a modulelor VBA
următoarea instrucţiune:
Option Explicit
Când e prezentă această instrucţiune, VBA va da un mesaj de eroare ce indică faptul că variabilele
nu sunt declarate.

Instrucţiunea de atribuire

Instrucţiunea de atribuire se foloseşte pentru a atribui unei variabile valoarea unei expresii. VBA
utilizează semnul egal (=) pentru atribuire. Exemple:
Sintaxa
variabila = expresie

Exemple: Pentru variabilele declarate mai sus, folosiţi următoarele instrucţiuni de atribuire.
dobanda = 0.12
FinalProiect = False
DataInceput = #5/21/2009#
varsta = 27
cantitate = 500
numprod = "Calculator"
nume = "Ion Popescu"

Declararea constantelor

O constantă se declară cu ajutorul sintagmei Const.


Sintaxa:
Const nume_constanta as TipData = valoare_constanta
Exemple:
Const DataStart As Date = #1/8/2009#
Const OraStart As Date= #[Link]#
Const trimestre as Integer = 4
30
Const dobanda = .125, perioade= 12
Const titlu as String = "Budget"
Obs: În cazul celui de-al patrulea exemplu, declararea constantelor dobanda şi perioada s-a făcut
fără precizarea tipului de dată. VBA va determina tipul de dată din valoarea constantei.

Variabile de tip obiect

O variabilă de tip obiect se foloseşte pentru declararea şi utilizarea obiectelor de tip Range,
Worksheet etc. Aceste variabile se declară cu Dim, iar atribuirea se face cu ajutorul sintagmei Set.
Exemplu:
Dim domeniu As Range
Set domeniu = Range("A1:C5")

Tablouri (Array-uri)

Un tablou este un grup de elemente de acelaşi tip şi cu acelaşi nume. Pentru a vă referi la un anumit
element din tablou, se foloseşte numele tabloului şi indicele acestuia.
Sintaxa:

Exemplu: Declaraţi un tablou cu numele luni de 12 şiruri de caractere şi reţineţi numele lunilor în
acesta.
Dim luni (1 To 12) as String
luni(1) = ”ianuarie”
luni(2) = ”februarie”
luni(3) = ”martie”
luni(4) = ”aprilie”
luni(5) = ”mai”
luni(6) = ”iunie”
luni(7) = ”iulie”
luni(8) = ”august”
luni(9) = ”septembrie”
luni(10) = ”octombrie”
luni(11) = ”noiembrie”
luni(12) = ”decembrie”
3.2 Funcţii cu interfaţa cu utilizatorul

Prelucrarea informaţiilor (date de intrare) de la utilizator şi afişarea rezultatelor (date de ieşire) sunt
operaţii care apar frecvent în programe. In VBA aceste operaţii se pot face cu ajutorul unor funcţii
speciale încorporate InputBox(), MsgBox() şi instrucţiunea MsgBox.
a) Funcţia InputBox

Permite introducerea de la tastatura a unor date izolate, prin intermediul unei casete de dialog.
Informaţia introdusă în caseta de dialog este memorată în variabila specificată în stânga semnului
egal.
Sintaxa:
variabila = InputBox(Prompt, Titlu)

Dacă se apasă OK, funcţia returnează valoarea tastată în caseta de dialog.

31
Exemplu. Să se introducă numele unei persoane de la tastatură folosind funcţia InputBox.
Dim nume As String
nume = InputBox("Introduceti" & Chr(13) & "numele persoanei", "Introducere date")

b) Instrucţiunea MsgBox

Permite afişarea unui mesaj, într-o casetă de dialog, utilizatorul putând alege un buton din cele
afişate.
Sintaxa:
MsgBox prompt, [Butoane ], [ Titlu ]
unde:
prompt - textul afişat în casetă
butoane - suma valorilor care specifică numărul şi tipul butoanelor afişate, şi tipul icoanei.
titlu - titlul casetei
Tabel cu valorile butoanelor

Constante Valoare Elemente afişate, acţiune


VbOkOnly 0 Buton OK
VbOkCancel 1 Butoane OK şi Cancel
VbAbortRetryIgnore 2 Butoane Abort, Retry,
Ignore
VbYesNoCancel 3 Butoane Yes, No, Cancel
VbYesNo 4 Butoane Yes, No
VbRetryCancel 5 Butoane Retry, Cancel
VbCritical 16 Icoana X
VbQuestion 32 Icoana ?
VbExclamation 48 Icoana !
VbInformation 64 Icoana I
VbDefaultButton1 0 Primul buton este selectat
implicit
VbDefaultButton2 256 Al doilea buton este
selectat implicit
VbDefaultButton3 512 Al treilea buton este
selectat implicit
VbDefaultButton4 768 Al patrulea buton este
selectat implicit

Exemplu. Să se afişeze anul calendaristic cu ajutorul instrucţiunii MsgBox. Data curentă se obţine
din data sistemului.
MsgBox "Anul curent " & Year(Now)
32
Obs:
- Funcţia NOW reprezintă data şi ora curentă
- Funcţia YEAR extrage anul dintr-o dată
- & permite concatenarea unor şiruri
c) Funcţia MsgBox()

Permite în plus şi returnarea unei valori întregi a unei variabile, valoare care depinde de tipul
butonului selectat de utilizator.
Sintaxa
Rasp = MsgBox (Prompt, [Butoane ], [ Titlu ])
Diferenţa – parametrii se scriu între paranteze, iar răspunsul furnizat de butonul ales este implicat
într-o structură alternativă.
Valorile returnate de funcţia MsgBox

Constante Valoare Descriere


VbOk 1 S-a ales Ok
VbCancel 2 S-a ales Cancel
VbAbort 3 S-a ales Abort
VbRetry 4 S-a ales Retry
VbIgnore 5 S-a ales Ignore
VbYes 6 S-a ales Yes
VbNo 7 S-a ales No

EXEMPLU. Să se afişeze o casetă de dialog care sa permită alegerea but. OK sau Cancel. Dacă s-a
apăsat OK se afişează o casetă se dialog care afişează alegerea făcută.
Dim raspuns As Integer
raspuns = MsgBox("Apasati un buton", vbOKCancel)
MsgBox raspuns

Dacă aţi apăsat Ok, rezultatul este:

33
3.3 Utilizarea funcţiilor VBA
În VBA există un număr mare de funcţii implementate, care pot fi folosite în cod. În continuare vor
fi tratate cele mai importante funcţii, tabelul complet al acestora fiind în anexa Funcţii VBA. Apelul
acestor funcţii se face cu sintaxa:
vba.nume_functie
sau, direct,
nume_functie
obiectul vba fiind implicit.
Funcţii de dată
Funcţiile Date, Time şi Now - returnează data curentă a sistemului, ora curentă a sistemului şi
respectiv data şi ora curentă a sistemului.
Sintaxa:
[Link]
[Link]
[Link]
Exemplu: Introduceţi în celula A1 data curentă, iar în B1 data şi ora curentă, iar în C1 ora curentă:
Range(“A1”).Value = [Link]
Range(“B1”).Value = [Link]
Range(“C1”).Value = [Link]
Funcţiile DateSerial şi TimeSerial - returnează data pentru anul, luna şi ziua specificate şi
respectiv ora pentru ora, minutele şi secundele precizate.
Sintaxa:
[Link](year, month, day)
[Link](hour, minute, second)
unde:
year – anul, exprimat ca număr întreg
month – luna, exprimată ca număr întreg
day – ziua, exprimată ca număr întreg
hour – ora, exprimat ca număr întreg
minute – minutele, exprimate ca număr întreg
second – secundele, exprimate ca număr întreg
Exemplu: Introduceţi în celula A1 data de 20.05.2009, iar în B1 ora [Link]
Range(“A1”) = [Link](2009, 5, 20)
Range(“B1”) = [Link](16, 40, 18)

Funcţiile DateValue şi TimeValue – convertesc un şir de caractere în dată, respectiv oră.


Sintaxa:
[Link](string)
[Link](string)
unde:

34
string – şir de caractere ce reprezintă o dată calendaristică
Exemplu: Introduceţi în celula A1 data de 20.05.2009, iar în B1 ora [Link]
Range(“A1”) = [Link]("01/06/2009")
Range(“B1”) = [Link]("12:35")
Funcţiile Day, Month, Year – returnează ziua, luna sau anul din data precizată.
Sintaxa:
[Link](data)
[Link](data)
[Link](data)
unde:
data – data calendaristică, exprimată ca număr, obiect de tip Date sau şir de caractere
Exemplu: Introduceţi în celulele A1, B1, C1 introduceţi ziua, luna şi anul pentru data de
25.08.2003:
Range(“A1”) = [Link]("25/08/2003")
Range(“B1”) = [Link]("25/08/2003")
Range(“C1”) = [Link]("25/08/2003")
Funcţii de text
Funcţiile UCase şi LCase – returnează textul dintre paranteze în majuscule şi respectiv minuscule.
Sintaxa:
[Link](string)
[Link](string)
unde:
string – şir de caractere
Exemplu: În celula B6 e scris textul IOnEscu. Transformaţi textul în majuscule. Scrieţi în celula C6
textul cu minuscule
Range("B6") = [Link](Range("B6"))
Range("C6") = [Link](Range("B6"))

Funcţiile Left, Right şi Mid – returnează porţiuni dintr-un text. Left returnează caractere din
stânga şirului de caractere, Right returnează caractere din dreapta şirului, iar Mid din mijloc.
[Link](string, number)
[Link](string, number)
[Link](string, start, lenght)
unde:
string – şir de caractere
number – număr de caractere extrase
start – numărul caracterului de unde începem extragerea
lenght – numărul de caractere extrase

Exemplu: În celula A1 e scris codul Mo101LCD. Din acest cod, în celula B1extrageţi primele 2
caractere, ce reprezintă tipul produsului, în C1 – ultimele 3 caractere ce reprezintă subtipul
produsului, iar în D1 numărul ce reprezintă lotul din care face parte produsul.
Range("B1")= [Link](Range("A1"), 2)
Range("C1")= [Link](Range("A1"), 3)
Range("D1")= [Link](Range("A1"), 3,3)

Funcţia Str – converteşte un număr în text .


Sintaxa:
35
[Link](number)
unde:
number – numărul ce trebuie convertit
Exemplu: [Link] (123) returnează textul 123.
Funcţia Val – converteşte un text în număr.
Sintaxa:
[Link](string)
unde:
string – şir de caractere ce reprezintă un număr
Exemplu: [Link]("123") returnează numărul 123.
Funcţia Format – returnează Variant(String) ce conţine expresia formatată corespunzător
Sintaxa:
Format(expresie [, format [, prima_zi_din_saptamana[, prima_sapt_din_an]]])
unde:
expresie – orice expresie validă
format – formatul ce trebuie aplicat (argument opţional)
prima_zi_din_saptamana – o constantă ce specifică prima zi din săptămână; variantele disponibile
sunt în tabelul de mai jos (argument opţional)
prima_sapt_din_an – o constantă ce precizează care se consideră prima zi din săptămână; variantele
disponibile sunt în tabelul de mai jos (argument opţional)
Argumentul prima_zi_din_saptamana poate avea următoarele valori:

Constanta Valoare Descriere


vbUseSystem 0 Foloseşte setările
sistemului
VbSunday 1 Duminica (implicit)
vbMonday 2 Luni
vbTuesday 3 Marţi
vbWednesday 4 Miercuri
vbThursday 5 Joi
vbFriday 6 Vineri
vbSaturday 7 Sâmbătă

Argumentul prima_sapt_din_an poate avea următoarele valori:


Constanta Valoare Descriere
vbUseSystem 0 Foloseşte setările sistemului
vbFirstJan1 1 Prima saptămână e considerată cea în care
e 1 Ianuarie (valoare implicită)
vbFirstFourDays 2 Prima saptămână e considerată cea în care
sunt cel puţin patru zile din noul an.
vbFirstFullWeek 3 Prima saptămână e considerată cea în care
toate zilele sunt din noul an.

Observaţii:
- Pentru a formata numere folosiţi formate numerice predefinite, sau creaţi propriile formate.
- Pentru a formata data calendaristică sau ora, folosiţi formate de dată/oră predefinite, sau
creaţi propriile formate
36
-Pentru a formata data calendaristică sau ora disponibile ca număr serial, folosiţi formate de
dată/oră predefinite, sau formate numerice
- Pentru a formata texte, creaţi propriile formate
Formate predefinite pentru dată/oră:

Nume format Descriere


General Date Afişează data şi / sau ora. De ex. 12/04/2009 [Link]
Long Date Afişează data în formatul lung corespunzător setărilor sistemului. De ex. 13 iunie
2009
Medium Date Afişează data folosind varianta mijlocie, funcţie de limba stabilită pentru sistem.
De ex. 13-iun-2009
Short Date Afişează data în formatul scurt corespunzător setărilor sistemului. 15/04/2009
Long Time Afişează ora în formatul lung corespunzător setărilor sistemului. De ex. [Link]
Medium Afişează ora în formatul mediu de 12 ore (ore şi minute) şi indicatorul AM/PM
Time corespunzător. De ex. 11:57 PM.
Short Time Afişează ora folosind formatul de 24 ore (ore şi minute). De ex. 14:30.
Formate numerice predefinite:
Nume format Descriere
General Number Afişează numărul fără separator de mii.
Currency Afişează numărul cu separator de mii, dacă e cazul. Afişează două
zecimale după virgulă. Afişează simbolul monetar funcţie de setările
locale ale sistemului
Fixed Afişează cel puţin o cifră în stânga virgulei şi două zecimale .
Standard Afişează numărul cu separator de mii, cel puţin o cifră înaintea virgulei şi
două zecimale.
Percent Înmulţeşte numărul cu 100 şi afişează semnul % în dreapta. Afişează două
zecimale.
Scientific Utilizează notaţiile ştiinţifice.
Yes/No Afişează No dacă numărul e 0 şi Yes în caz contrar.
True/False Afişează False dacă numărul e 0 şi True în caz contrar.
On/Off Afişează Off dacă numărul e 0 şi On în caz contrar.
În tabelele următoare aveţi la dispoziţie codurile de fotmat pentru a vă crea propriile formatări:
- Date calendaristice: d – codul pentru ziua, m –codul pentru lună, y – codul pentru an
Pentru a afişa Utilizaţi acest cod
Luni sub forma 1–12 m
Luni sub forma 01–12 mm
Luni sub forma Ian–Dec mmm
Luni sub forma Ianuarie–Decembrie mmmm
Luni sub forma primei litere a lunii mmmmm
Zile sub forma 1–31 d
Zile sub forma 01–31 dd
Zile sub forma D–S ddd
Zile sub forma Duminică–Sâmbătă dddd
Ani sub forma 00–99 yy
Ani sub forma 1900–9999 Yyyy
Trimestrul sub forma unui număr între 1 şi 4 q
Timp: h – codul pentru oră, m –codul pentru minut, s – codul pentru secundă
37
Pentru a afişa Utilizaţi acest cod
Ore sub forma 0–23 H
Ore sub forma 00–23 hh
Minute sub forma 0–59 m
Minute sub forma 00–59 mm
Secunde sub forma 0–59 s
Secunde sub forma 00–59 ss
Numere : Pentru a stabili formatul numerelor cu zecimale, includeți într-o secțiune
următoarele argumente formale pentru cifre. Dacă un număr are mai multe cifre la dreapta
separatorului zecimal decât argumente formale în formatul respectiv, numărul se rotunjește la atâtea
zecimale câte argumente formale există. Dacă există mai multe cifre la stânga separatorului zecimal
decât există argumente formale, se afișează cifrele suplimentare. Dacă formatul conține numai
semne de număr (#) la stânga separatorului zecimal, numerele mai mici decât unu încep cu un
separator zecimal.
o # afişează numai cifrele semnificative şi nu afişează zerouri nesemnificative.
o 0 (zero) afişează zerourile nesemnificative, dacă un număr are mai puţine cifre decât
numărul de zerouri existente în format.
o ? adaugă spaţii pentru zerouri nesemnificative în oricare parte a separatorului zecimal,
astfel încât separatorul zecimal să se alinieze.
o % determină înmulţirea numărului cu 100 şi afişarea simbolului %
Pentru a afișa atât textul cât și numerele într-o celulă, încadrați caracterele textului în ghilimele ("
"). Includeți caracterele într-o secțiune corespunzătoare de coduri format. De exemplu, tastați
formatul 0,00 LEI" Surplus";0,00 LEI" Lipsă" pentru a afișa o sumă pozitivă ca „25,74 LEI
Surplus” și o sumă negativă ca „125,74 LEI Lipsă”.
Pentru a afişa Utilizaţi acest cod
1234,59 sub forma 1234,6 ####,#
8,9 sub forma 8,900 #,000
0,631 sub forma 0,6 0,#
44,398, 102,65 şi 2,8 cu ???,???
zecimale aliniate
12000 sub forma 12.000 #.###
Texte :
o > formatează textul cu majuscule
o < formatează textul cu minuscule
Exemple:
1) Afişaţi data şi ora curentă cu următoarele formate:
Range("A1") = [Link](Date,"Long Date", vbMonday)
Range("A2") = [Link](Date,"Short Date")
Range("A3") = [Link](Time,"Medium Time")
Range("A4") = [Link](Time,"Short Time")
Range("A5") = [Link](Date,"dddd, mmm d yyyy")
Range("A6") = [Link](Time,"h:m")
Range("A7") = "Trim " & [Link](Date,"q, mmm-yy")
Range("B1") = [Link](12345.678,"standard")
Range("B2") = [Link](12345.678,"fixed")
Range("B3") = [Link](12345.678,"currency")
Range("B3") = [Link](0.234,"percent")
Range("B4") = [Link](12345.678," #.###")
38
Range("C1") = [Link]("Gigel"," >")
Range("C2") = [Link]("Gigel"," <")

Funcţii pentru culori

Funcţia RGB returnează un număr ce reprezintă codul de culoare determinat prin combinaţia de
culori între roşu, verde şi albastru.
Sintaxa:
[Link](roşu, verde, albastru)
unde:
roşu – un număr între 0 şi 255 ce reprezintă componenta roşie din culoare
verde – un număr între 0 şi 255 ce reprezintă componenta verde din culoare
albastru – un număr între 0 şi 255 ce reprezintă componenta albastră din culoare

Obs. In tabelul următor sunt câteva combinaţii standard de culori:

Culoare Roşu Verde Albastru


Negru 0 0 0
Albastru 0 0 255
Verde 0 255 0
Azuriu 0 255 255
Roşu 255 0 0
Purpuriu 255 0 255
Galben 255 255 0
Alb 255 255 255
Maro 153 51 0
Indigo 51 51 153
Gri 80% 51 51 51

Exemplu: Stabiliţi ca fundal pentru domeniul A1:C2 culoarea purpuriu.


Range("A1:C2").[Link]=RGB (255,0,255)

Utilizarea funcţiilor din foile de calcul Excel

În VBA avem posibilitatea de a apela la funcţiile disponibile în foile de lucru Excel cu ajutorul
proprietăţii WorksheetFunction a obiectului Application.
Sintaxa:
[Link].nume_functieExcel

Exemplu: În celulele B10, B11 şi B12 trebuie să introducem suma, media şi respectiv numărul de
celule ce conţin date numerice din domeniul B1:B9.
Range(“B10”)= [Link](Range("B1:B9"))
Range(“B11”)= [Link](Range("B1:B9"))
Range(“B12”)= [Link](Range("B1:B9"))

3.4 Instrucţiuni VBA


Instrucţiunea WITH

Dacă se doreşte setarea mai multor proprietăţi care se referă la acelaşi obiect, pentru a uşura accesul
la proprietăţile acestuia, se utilizează instrucţiunea WITH cu următoarea sintaxă:
WITH nume_obiect
39
...
END WITH
Exemplu. Să se formateze domeniul A3:C10 astfel încât tipul literelor să fie Times New Roman,
îngroşat, cu dimensiunea de 14, culoare roşie.

Sub TestWith()
With Range("A3:C10").Font
.Name = "Times New Roman"
.FontStyle = "Bold"
.Size = 14
.Color=RGB(255,0,0)
End With
End Sub
Structuri de control ale execuţiei programului
a) Structuri de decizie
Procedurile Visual Basic pot testa condiţii şi funcţie de rezultatele testului, să efectueze operaţii
diferite.
Instrucţiunea IF
Instrucţiunea If verifică o condiţie şi determină executarea anumitor instrucţiuni, dacă acesta e
adevărată, iar dacă e falsă, se vor executa alte instrucţiuni.
Sintaxa instrucţiunilor If imbricate, ce testează mai multe condiţii este:
IF condiţie1 THEN
[ bloc_instrucţiuni_1]
[ ELSEIF condiţie2 THEN
[ bloc_instrucţiuni_2] ]
...
[ ELSE
[ bloc_instrucţiuni_n] ]
END IF
În acest caz, instrucţiunea se derulează astfel: se testează condiţie1, iar dacă e falsă VBA testează
condiţie2, ş.a.m.d. până când găseşte o condiţie adevărată. In acest moment execută blocul de
instrucţiuni corespunzător şi continuă execuţia programului cu prima instrucţiune după End If.
Instrucţiunea de după clauza Else se execută dacă niciuna din condiţii nu e adevărată.
Exemplu1:Folosiţi funcţia Time pentru a afişa un mesaj de salut, funcţie de ora din zi.
Sub Salut1()
If Time < 0.5 Then MsgBox "Buna dimineata"
End Sub
40
sau
Sub Salut1a()
If Time < 0.5 Then
MsgBox " Buna dimineata"
End If
End Sub

Sub Salut2()
If Time < 0.5 Then MsgBox " Buna dimineata "
If Time >= 0.5 Then MsgBox "Buna ziua"
End Sub

Sub Salut3()
If Time < 0.5 Then MsgBox " Buna dimineata "
If Time >= 0.5 And Time < 0.75 Then MsgBox " Buna ziua "
If Time >= 0.75 Then MsgBox " Buna seara "
End Sub

Exemplu2:Verificare apăsare buton Ok sau Cancel în fereastra MsgBox.


Sub Ex_MsgBox()
Dim raspuns As Integer
raspuns = MsgBox("Apasati un buton", vbOKCancel)
If raspuns = 1 Then
MsgBox "S-a apasat OK"
Else
MsgBox "S-a apasat Cancel"
End If
End Sub
Exemplu3:Verificati introducerea pretului la materiale in foaia Preturi, cu ajutorul unei proceduri.
Sub IntroducerePreturi()
Dim pret_min, pret_max, rasp As Integer
pret_min = 10
pret_max = 20
rasp = InputBox("Introduceti pretul materialelor", "Caramida")
If rasp < pret_min Or rasp > pret_max Then
MsgBox ("Ati introdus un pret eronat!")
Else
Worksheets("Preturi").Range("B2").Value = rasp
End If
End Sub

Exemplu4. Să se creeze o subrutină care să permită introducerea de la tastatură a cantităţii şi


preţurilor depinzând de ziua din săptămână. Datele vor fi salvate într-un tabel din foaia de calcul cu
numele „Magazin”. De la tastatură se introduce ziua apoi se introduce cantitatea şi preţul pentru
ziua respectivă.

41
Sub Exemplu_If()
Dim ziua As String, cant, pret As Variant, I As Integer
ziua = InputBox("Introduceti ziua saptamanii", "Ziua")
If UCase$(ziua) = "LUNI" Then
I=4
ElseIf UCase$(ziua) = "MARTI" Then
I=5
ElseIf UCase$(ziua) = "MIERCURI" Then
I=6
ElseIf UCase$(ziua) = "JOI" Then
I=7
Else
I=8
End If
cant = InputBox("Cantitatea", "Introducere date")
pret = InputBox("Pretul", "Introducere date")
With Sheets("Magazin")
.Cells(I, 2).Value = cant
.Cells(I, 3).Value = pret
End With
End Sub
Exemplu5. Să se creeze o subrutină care să afişeze discount-ul funcţie de cantitatea introdusă.
Limitele de discount sunt următoarele:
Cantitate Discount
< 25 0.1
25-50 0.15
50-75 0.2
>75 0.25
Sub Discount()
Dim cantitate As Variant
Dim discount As Double
cantitate = InputBox("Introduceti cantitatea: ")
If cantitate = "" Then Exit Sub
If cantitate >= 0 And cantitate < 25 Then
discount = 0.1
ElseIf cantitate < 50 Then
discount = 0.15
ElseIf cantitate < 75 Then
discount = 0.2
Else
discount = 0.25
End If
42
MsgBox "Discount: " & discount
End Sub
Instrucţiunea SELECT
Este o alternativă a structurii If şi se utilizează atunci când se execută diferite blocuri de instrucţiuni
ce verifică de valoarea unei singure expresii.
Sintaxa:
Select Case expresie
Case lista_expresii_1
bloc_instr1
[ Case lista_expresii_2
[ bloc_instr_2] ]

[ Case Else
[ bloc_instr_n] ]
End Select
Exemplu1. Să se utilizeze instrucţiunea Select pentru exemplul cu zilele din săptamână, cantitate,
preţ.
Sub Exemplu_Case()
Dim ziua As String, I As Integer, cant, pret As Variant
ziua = InputBox("Introduceti ziua saptamanii", "Ziua")
Select Case UCase$(ziua)
Case "LUNI": I = 4
Case "MARTI": I = 5
Case "MIERCURI": I = 6
Case "JOI": I = 7
Case Else: I = 8
End Select
cant = InputBox("Cantitatea", "Introducere date")
pret = InputBox("Pretul", "Introducere date")
With Sheets("Magazin")
.Cells(I, 2).Value = cant
.Cells(I, 3).Value = pret
End With
End Sub
Exemplu2. Să se utilizeze instrucţiunea Select pentru exemplul cu discount-ul.
Sub Discount2()
Dim cantitate As Variant
Dim discount As Double
cantitate = InputBox("Introduceti cantitatea: ")
Select Case cantitate
Case ""
Exit Sub
Case 0 To 24
discount = 0.1
Case 25 To 49
discount = 0.15
Case 50 To 74
discount = 0.2
43
Case Is >= 75
discount = 0.25
End Select
MsgBox "Discount: " & discount
End Sub
b) Structuri repetitive
Instrucţiunea For Each
Instrucţiunea For Each este deosebit de utilă în parcurgerea colecţiilor de obiecte, în special atunci
când nu ştim câte obiecte conţine.
Sintaxa:
For Each element In colectie
instructiuni
[Exit For]
[instructiuni]
Next [element]
Exemplu1. Afişaţi cu ajutorul unei casete MsgBox numele foilor de calcul.
Sub AfisareNume()
Dim foaie as Worksheet
For Each foaie In [Link]
MsgBox [Link]
Next foaie
End Sub
Exemplu2. Verificaţi dacă preturile din domeniul B4:B7 sunt in intervalul 30-50 lei. Cele care sunt
in acest interval afişaţi-le îngroşat, cu o culoare roşie pe fundal.

Sub Verificare()
Dim celula As Range
For Each celula In Range("B4:B7")
If [Link] > 30 And [Link] < 50 Then
[Link] = "Bold"
[Link] = RGB(255, 0, 0)
End If
Next celula
End Sub
Exemplu3. Protejaţi cu parola aaa toate celulele marcate din foile de calcul.
Sub protejare()
Dim mySheet As Worksheet
For Each mySheet In Worksheets
[Link] "aaa", True, True, True
Next mySheet
End Sub
44
Exemplu4. Eliminaţi protejarea cu parola aaa pentru toate celulele din foile de calcul.
Sub eliminare_protejare()
Dim mySheet As Worksheet
For Each mySheet In Worksheets
[Link] "aaa"
Next mySheet
End Sub

Instrucţiunea For

Instrucţiunea For se foloseşte atunci când dorim repetarea unor operaţii de un anumit număr de ori.
Sintaxa:
For contor = start To sfarsit [Step pas]
[instructiuni]
[Exit For]
[instructiuni]
Next [contor]
Instrucţiunea for se execută astfel:
- Se iniţializează contor pe valoarea start;
- Se execută instrucţiunile (dacă se ajunge la instrucţiunea exit for se părăseşte forţat ciclul).
- Se trece la noua valoare a contorului folosind pasul (dacă este precizat) şi se reia execuţia
de la pasul anterior.

Exemplu1. Calculaţi suma numerelor între 1 şi 10 şi afişaţi-o.


Sub Suma1() Sub Suma2()
Dim suma As Double sau Dim suma As Double
Dim contor As Integer Dim contor As Integer
suma = 0 suma = 0
For contor = 1 To 10 For contor = 10 To 1 step -1
suma = suma + contor suma = suma + contor
Next contor Next contor
MsgBox suma MsgBox suma
End Sub End Sub

Exemplu2. Transformaţi exemplul anterior de protejare a foilor astfel încât să folosiţi funcţia for.
Sub Protejare2()
Dim foaie As Worksheet
Dim i As Integer
For i = 1 to [Link]
Set foaie = Worksheets(i)
[Link] "aaa", True, True, True
Next i
End Sub
Exemplu3. Comparaţi domeniile denumite Nou şi Vechi şi afişaţi valorile diferite cu un font de
culoare roşie pe fundal galben.

45
Sub Comparare()
Dim i As Integer
Calculate
For i = 1 To Range("Nou").[Link]
If Range("Nou").Cells(i) <> Range("Vechi").Cells(i) Then
Range("Nou").Cells(i).[Link] = rgbYellow
Range ("Nou").Cells(i).[Link]=rgbRed
End If
Next i
End Sub

Exemplu4. Ştergeţi rândurile 2,4,6,8 şi 10 din foaia curentă.


Sub StergeRanduri()
Dim rand As Long
For rand = 10 To 2 Step -2
Rows(rand).Delete
Next rand
End Sub

Inainte de ştergere, foaia arată astfel iar după ştergere, avem

Obs: Am folosit ştergerea rândurilor pornind de jos în sus, cu un pas negativ


pentru for. Aceasta este varianta corectă de ştergere a rândurilor. Încercaţi
procedura de mai jos, unde parcurgerea este de sus în jos şi observaţi diferenţa (de
exemplu, când rândul 2 este şters, rândul 3 devine noul rând 2, iar rândul 5 devine
rândul 4, etc.)
Sub StergeRanduri2()
Dim rand As Long
For rand = 2 To 10 Step 2
Rows(rand).Delete
Next rand
End Sub
Inainte de ştergere, foaia arată astfel iar după ştergere, avem

46
Exemplu5. Păstraţi într-un tablou vânzările zilnice, iar în alt tablou zilele săptămânii. Afişaţi
începând din celula activă ziua din săptămână şi vândută.
Sub ExempluTablou()
Dim vanzari(1 To 5) As Currency
Dim n As Integer
Dim ziua(1 To 5) As String
vanzari(1) = 1100
vanzari(2) = 2100
vanzari(3) = 1400
vanzari(4) = 1500
vanzari(5) = 1250
ziua(1) = "luni"
ziua(2) = "marti"
ziua(3) = "miercuri"
ziua(4) = "joi"
ziua(5) = "vineri"
For n = 1 To 5
[Link] = "Vanzari in " & "ziua de " & ziua(n) & " au fost de " & vanzari(n) & "
mii lei"
[Link](1, 0).Activate
Next
End Sub
Exemplu6. Scrieţi informaţii 1000 de rânduri. Folosiţi proprietăţile ScreenUpdating şi StatusBar ale
obiectului Application, utile atunci când se procesează multe informaţii.
Sub scriere_date()
[Link] = False
Dim n As Integer
For n = 1 To 1000
[Link] = n
[Link](1, 0).Activate
[Link] = "scrie randul " & n
Next
[Link] = ""
[Link] = True
End Sub
Instrucţiunea DO WHILE
Instrucţiunea Do While se foloseşte atunci când dorim repetarea unor operaţii atât timp cât o
anumită condiţie e adevărată.
47
Sintaxa1 (condiţia e testată la începutul ciclării):
Do [While conditie]
[instructiuni]
[Exit Do]
[instructiuni]
Loop
Sintaxa2 (condiţia e testată la sfârşitul ciclării):
Do
[instructiuni]
[Exit Do]
[instructiuni]
Loop [While conditie]

Obs: Diferenţa între cele două sintaxe e dată de locul în care se testează condiţia.

Exemplu: Introduceţi toate zilele lunii curente începând din celula curentă şi continuând în jos, pe
coloană folosind Do While.
Sub IntroduceData1()
' Do While, cu test la început
Dim data As Date
' în variabila data pastram data curenta
data = DateSerial(Year(Date), Month(Date), 1)
Do While Month(data) = Month(Date)
ActiveCell = data
data = data + 1
[Link](1, 0).Activate
Loop
End Sub
sau
Sub IntroduceData2()
' Do While, cu test la sfarsit
Dim data As Date
data = DateSerial(Year(Date), Month(Date), 1)
Do
ActiveCell = data
data= data + 1
[Link](1, 0).Activate
Loop While Month(data) = Month(Date)
End Sub

Instrucţiunea DO UNTIL

Instrucţiunea Do Until se foloseşte atunci când dorim repetarea unor operaţii până când condiţia
devine falsă.
Sintaxa1 (condiţia e testată la începutul ciclării):
Do [Until conditie]
[instructiuni]
[Exit Do]
[instructiuni]
Loop

48
Sintaxa2 (condiţia e testată la sfârşitul ciclării):
Do
[instructiuni]
[Exit Do]
[instructiuni]
Loop [Until conditie]

Exemplu: Introduceţi toate zilele lunii curente începând din celula curentă şi continuând în jos, pe
coloană folosind Do Until.
Sub IntroduceData3()
' Do Until, cu test la început
Dim data As Date
data = DateSerial(Year(Date), Month(Date), 1)
Do Until Month(data) <> Month(Date)
ActiveCell = data
data = data + 1
[Link](1, 0).Activate
Loop
End Sub

Sub IntroduceData4()
' Do Until, cu test la sfârşit
Dim data As Date
data = DateSerial(Year(Date), Month(Date), 1)
Do
ActiveCell = data
data = data + 1
[Link](1, 0).Activate
Loop Until Month(data) <> Month(Date)
End Sub

Exemplu: Protejaţi celulele marcate din toate foile cu parola aaa.


Sub ProtejareFoi()
Dim foaie As Worksheet
Dim i As Integer
i=1
Do Until i > [Link]
Set foaie = Worksheets(i)
[Link] "aaa", True, True, True
i=i+1
Loop
End Sub

3.5 Proceduri

O procedură este compusă dintr-o serie de instrucţiuni VBA şi se găseşte într-un modul VBA. Un
modul poate conţine oricâte proceduri.
O procedură poate avea argumente, folosite de instrucţiunile din componenţa acesteia.
Sintaxa:
Sub nume_procedura ([lista_argumente])

49
[instrucţiuni] [Exit Sub]
[instrucţiuni]
End Sub
unde:
nume_procedura – numele procedurii
lista_argumente – lista de variabile, aflată între paranteze şi despărţite prin virgulă
instrucţiuni – instrucţiuni VBA
Exit Sub – instrucţiune care forţează terminarea imediată a procedurii şi ieşirea din ea
End Sub – sfârşitul procedurii

Sunt mai multe modalităţi de a apela o procedură: fie din editorul Visual Basic cu ajutorul comenzii
Run (sau F5), fie din fereastra de macro-uri a programului Excel, fie cu ajutorul unui buton sau
forme din foile de lucru Excel sau dintr-o altă procedură VBA.

Apelul unei proceduri din altă procedură

O procedură poate fi apelată din altă procedură în următoarele moduri:


- prin scrierea numelui procedurii şi a argumentelor sale, dacă acestea există.
- prin folosirea cuvântului Call urmat de numele procedurii şi argumente
- prin folosirea metodei Run a obiectului Application – variantă utilă în special atunci când
numele procedurii se află într-o variabilă (eventualele argumente ale procedurii se scriu ca
argumente ale metodei Run)

Exemplu 1: Apelaţi procedura AfisareInformatii din procedura Salutari.


Sub Salutari()
Dim informatia As String
informatia = "Salut"
'AfisareInformatii (informatia)
' sau
'Call AfisareInformatii(informatia)
' sau
[Link] "AfisareInformatii", informatia
End Sub

Sub AfisareInformatii(mesaj)
Dim butoane as Integer
butoane = vbOKOnly + vbInformation
MsgBox Prompt:=mesaj, Buttons:=butoane
End Sub

Exemplu 2: Apelaţi procedura Weekend sau Zile_lucratoare funcţie de ziua din săptămână.
Sub principala()
Dim procedura As String
Select Case Weekday(Now)
Case 1, 7: procedura = "Weekend"
Case Else: procedura = "Zile_lucratoare"
End Select
[Link] procedura
End Sub
50
Sub Weekend()
MsgBox "E weekend"
End Sub

Sub Zile_lucratoare()
MsgBox "Azi e o zi lucratoare"
End Sub

Apelul prin valoare şi prin referinţă


Argumentele unei proceduri pot fi transmise în două moduri:
- prin referinţă – ceea ce înseamnă că procedura apelată primeşte originalul variabilei, iar
modificările făcute în procedura apelată se râsfrâng şi în procedura apelantă, variabila fiind
aceeaşi. (aceasta este varianta implicită)
- prin valoare – ceea ce înseamnă că procedura apelată primeşte o copie a variabilei
originale, iar modificările copiei nu afectează originalul; aşadar, în procedura apelantă,
variabila rămâne aceeaşi. Pentru a efectua apelul prin valoare precizaţi cuvântul cheie ByVal
înaintea argumentului din definiţia procedurii.
Exemplu 1: Efectuaţi apelul prin referinţă a funcţiei calculează şi afişaţi rezultatul.
Sub principal1()
Dim x As Integer
x = 10
Call calculeaza1(x)
MsgBox x
End Sub
Sub calculeaza1(a)
a = a * 10
End Sub
Exemplu 2: Efectuaţi apelul prin valoare a funcţiei calculează şi afişaţi rezultatul.
Sub principala2()
Dim x As Integer
x = 10
Call calculeaza2(x)
MsgBox x
End Sub

Sub calculeaza2(ByVal a)
a = a * 10
End Sub
3.6 Funcţii
O funcţie e similară unei proceduri în VBA, dar spre deosebire de procedură, funcţia returnează o
valoare. O funcţie este compusă dintr-o serie de instrucţiuni VBA, o instrucţiune obligatorie fiind
cea de asignare a unei valori numelui funcţiei. O funcţie, la fel ca şi o procedură poate avea
argumente, apelate prin valoare sau referinţă. Spre deosebire de o procedură, o funcţie poate fi
utilizată în calcule direct din Excel.
Sintaxa:

51
Function nume_functie ([lista_argumente]) [As tip]
[instrucţiuni]
[nume_functie = expresie]
[Exit Function]
[instrucţiuni]
[nume_functie = expresie]
End Function
unde:
nume_functie – numele functiei
lista_argumente – lista de variabile, aflată între paranteze şi despărţite prin virgulă
tip – tipul de dată returnat de funcţie
instrucţiuni – instrucţiuni VBA
expresie – valoarea returnată de funcţie
Exit Function – instrucţiune care forţează terminarea imediată a funcţiei şi ieşirea din ea
End Function – sfârşitul funcţiei
Exemplu1: Scrieţi o funcţie care returnează data da ieri.
Function Ieri() As Date
Ieri = Now - 1
End Function
Exemplu2: Scrieţi o funcţie care calculează comisionul funcţie de valoarea vânzării. Scrieţi o
procedură care cere de la utilizator valoarea vânzării, apelează funcţia de comision şi afişează
valoarea vânzării şi a comisionului aferent. La final procedura va întreba dacă mai sunt vânzări, şi
în caz afirmativ, se reia calculul.
Function Comision(vanzari)
' nivelul comisionului
Const Nivel1 = 0.05
Const Nivel2 = 0.10
Const Nivel3 = 0.125
Const Nivel4 = 0.15
' calculeaza comisionul aferent vanzarilor
Select Case vanzari
Case 0 To 999.99: Comision = vanzari * Nivel1
Case 1000 To 19999.99: Comision = vanzari * Nivel2
Case 20000 To 39999.99: Comision = vanzari * Nivel3
Case Is >= 40000: Comision = vanzari * Nivel4
End Select
End Function
Sub CalculComision()
Dim vanzari As Long
Dim mesaj As String, rasp As String
' utilizatorul precizează valoarea vânzării
vanzari = Val(InputBox("Introduceti vanzarea:", "Calculator comision vanzari"))
' se construieşte mesajul de răspuns
mesaj = "Valoarea vanzarilor:" & vbTab & Format(vanzari, "$#,##0.00")
mesaj = mesaj & vbCrLf & "Comision:" & vbTab
mesaj = mesaj & Format(Comision(vanzari), "$#,##0.00")
mesaj = mesaj & vbCrLf & vbCrLf & "Urmatoarea vanzare?"
' se afişează mesajul şi utilizatorul e întrebat dacă trece la următoarea vânzare.
52
rasp = MsgBox(mesaj, vbYesNo, "Calculator comision vanzari")
If rasp = vbYes Then CalculComision
End Sub
Exemplu3: Pentru tabelul următor, scrieţi o funcţie prima ce calculează nivelul primelor conform
grilei afişate. Apelaţi funcţia prima din Excel.

Function prima(functie, localitate, salariu) As Double


If functie = "Contabil" And localitate = "Arad" Then prima = salariu * 0.05
If functie = "Manager" Then prima = salariu * 0.07
If (functie = "Contabil" Or functie = "Agent comercial") _
And localitate = "Timisoara" Then prima = salariu * 0.03
End Function
Apelul funcţiei din Excel poate fi făcut direct din celulă, prin formula =prima(D3,E3,F33) sau
eticheta Formulas / Insert Function.

53
Din fereastra Insert Function alegem categoria User Defined şi selectăm funcţia creată. Va apare
fereastra în care putem preciza valorile argumentelor, similar cu orice altă funcţie Excel.

54
4. Utilizarea controalelor tip formular în foile de calcul
Un formular este un document cu o structură şi un format standard ce face mai uşoară introducerea,
organizarea şi editarea informaţiilor. Formularele create în Excel conţin controale. Acestea sunt
obiecte care afişează informaţii, cu ajutorul cărora se pot introduce informaţii, efectua acţiuni sau
selecţii. Controalele cele mai des utilizate sunt casetele de text, listele, butoanele de opţiune sau de
acţiune. Controalele pot rula macro-comenzi sau pot răspunde la evenimente cum ar fi clic-ul de
mouse.
În Excel tipuri de formulare care se pot crea cu Microsoft Excel: formulare de date, foi de calcul ce
conţin controale de tip formular sau ActiveX, formulare de tip VBA UserForms.
4.1 Formularele de date
Un formular de date e de multe ori o cale comodă de a introduce date într-un tabel Excel. Programul
Excel poate crea automat un formular pe un tabel, formular ce conţine toate etichetele de coloane şi
câte o căsuţă de text pentru introducerea informaţiilor. Dacă în tabel există formule, acestea vor fi
calculate automat pe formular. Pentru operaţiile de introducere, ştergere, căutare sau editare,
formularul pune la dispoziţie butoane de acţiune.
Pentru afişarea formularului, se foloseşte butonul Form. Acesta nu este inclus în interfaţa standard,
dar poate fi adăugat barei de instrumente Quick Access.
Exemplu1: Folosiţi formularul de date pentru a introduce informaţii în tabelul produse.

Exemplu2: Creaţi un macro care să afişeze formularul de date.


Sub Macro1()
' Macro1 Macro
Sheets("produse").Range("A1").Select
[Link]
End Sub
4.2 Foi de calcul ce conţin controale de tip Form şi ActiveX

55
O foaie de calcul este un tip special de formular ce permite introducerea şi vizualizarea datelor sub
formă de grilă. Pentru o flexibilitate crescută, pe foile de calcul se pot introduce controale care să
fie legate de celulele foilor Excel şi care nu necesită cod VBA de lucru cu acestea.
Excel are două tipuri de controale care se pot folosi: controale de tip Form şi controale ActiveX.
Acestea sunt disponibile din fila Developer, butonul Insert.

Aici veţi găsi controale tip etichete, casete de text, casete de grupare, butoane de acţiune, casete de
validare, butoane opţiune, casete listă, casete tip liste derulante, bare de defilare, butoane de
incrementare /decrementare.
Controalele enumerate mai sus pot fi utilizate pentru introducerea sau gestionarea datelor şi se leagă
de o celulă. În cadrul unei formule pot apărea referinţe la celula de legătură, pentru a căuta
informaţii sau a face calcule pe baza acestora.
Pentru a utiliza un anumit tip de control, acesta se selectează, se execută clic dreapta şi din meniul
contextual al obiectului, se alege opţiunea Format Control.

4.3 Controale de tip Form


Controalele de tip Form sunt controale originale, compatibile cu versiunile mai vechi de Excel,
începând cu Excel 5. Aceste controale sunt utile pentru interacţiunea uşoară cu celulele foilor de
calcul, fără folosirea codului VBA.
Obs: Aceste controale nu pot fi folosite pe formulare de tip Userform.
Contro Denumire Acţiune
l
Label Introduce un text care va fi utilizat pentru a denumi
Etichetă alte controale.
Group Box Se utilizează pentru a grupa butoanele de opţiune
Casetă de grupare astfel încât doar unul să fie selectat la un moment dat.
Button Lansează în execuţie o macro-comandă
Buton
CheckBox Produce o valoare TRUE sau FALSE dacă aceasta
Casetă de validare este selectată, respectiv deselectală.
Option Button Dacă este utilizat în cadrul unui grup, selectarea unui
Buton de opţiune buton returnează numărul butonului din cadrul
grupului.
List Box Returnează numărul obiectului selectat din listă
Casetă listă
Combo Box Combină o casetă listă cu una de editare.
Casetă listă derulantă
Scroll Bar O bară de derulare extensibilă, care permite limite
Bară de editare minime, maxime şi modificări incrementate

56
Spinner Un contor care permite limite minime, maxime şi
Buton de incrementare/ modificări incrementale
decrementare

Caracteristici specifice controalelor

Proprietǎţile controalelor se stabilesc cu ajutorul casetei Format Control.


 Controlul Label - permite scrierea de texte explicative pe formulare. Modificarea textului
se face cu click în interiorul etichetei, se şterge textul existent şi se tasteazǎ textul dorit. Rubrica
Protection permite inhibarea posibilitǎţii de modificare a controlului atunci cand foaia e protejata.
 Controlul Group Box - permite gruparea unor controale. Se poate modifica Textul afişat
ca titlu de grup – click cu butonul din dreapta pe control şi se alege Edit Text. Pentru terminare se
face click în orice celulǎ.
 Controlul Button – Este conceput pentru a declanşa execuţia unei acţiuni atunci cand se
apasǎ cu mose-ul. Acţiunea care se ececutǎ este memoratǎ într-o macrocomandǎ. Legǎtura între
buton şi macrocomandǎ se face cu Assign Macro. Rubricile din pagina Font permit alegerea
fontului, dimensiunii caracterelor, etc.
 Controlul Check Box – caseta Fotmat Control conţine opţiuni pentru stabilirea celulei în
care se memoreazǎ alegerea fǎcutǎ de utilizator- rubrica Cell Link . Se completeazǎ cu adresa
celulei (ex. $A$7).
- Dacǎ utilizatorul bifeazǎ => în celulǎ se memoreazǎ valoarea TRUE.
- Dacǎ utilizatorul nu bifeazǎ => în celulǎ se memoreazǎ valoarea FALSE.

 Controlul Option Button – funcţioneazǎ asemǎnǎtor cu caseta de validare. Rubrica Cell


Link se completeazǎ cu adresa celulei în care se memoreazǎ opţiunea aleasǎ de utilizator.
- Dacǎ utilizatorul bifeazǎ => în celula de legǎturǎ se memoreazǎ valoarea 1.
- Dacǎ utilizatorul nu bifeazǎ => în celulǎ se memoreazǎ valoarea 0.
Butoanele de opţiuni pot apǎrea singulare sau grupate . Gruparea se face utilizand controlul
container Group Box. Dacǎ apar în grup doar unul poate fi ales de cǎtre utilizator. In rubrica Cell
Link se specificǎ celula care memoreazǎ numǎrul butonului ales din cadrul grupului (1 dacǎ s-a
selectat primul buton, 2 pentru al doilea, etc.).
57
 Controlul List Box – Permite alegerea dintr-o listǎ. Rubrici:
- Input range – se specificǎ sursa datelor din listǎ (ex. Coloana cu denumirea
produselor).
- Cell Link – se specificǎ celula de legǎtura => celula în care se memoreazǎ
numǎrul elementului din listǎ care a fost ales.

 Controlul Combo Box – Permite alegerea dintr-o listǎ. Rubrici:


- Input range – se specificǎ sursa datelor din listǎ .
- Cell Link – se specificǎ celula de legǎtura => celula în care se memoreazǎ
numǎrul elementului din listǎ care a fost ales.
- Drop Down Lines - nr. elem din listǎ care apar la deschiderea listei.
58
 Controlul Spinner – Permite incrementarea/decrementarea unor valori. Rubrici:
- Current value – se specificǎ valoarea curentă
- Minimum value – se specificǎ valoarea minimă
- Maximum value – se specificǎ valoarea maximă
- Incremental change – se specifică valoarea de incrementare / decrementare
- Cell Link – se specificǎ celula de legǎtura => celula în care se afişează rezultatul.

 Controlul Scroll – Permite mărirea/micşorarea unor valori. Rubrici:


- Current value – se specificǎ valoarea curentă
- Minimum value – se specificǎ valoarea minimă
- Maximum value – se specificǎ valoarea maximă
- Incremental change – se specifică valoarea de incrementare / decrementare la clic
pe săgeţi
- Page change – se specifică valoarea de incrementare / decrementare la clic bara de
derulare
- Cell Link – se specificǎ celula de legǎtura => celula în care se afişează rezultatul.
59
Următoarele controale nu se mai pot folosi în Excel 2007-2010: TextField , Combo List-
Edit, - Combo Drop – Down list, - Run Dialog.
Exemplu 1: În fişierul Salariaţi avem un tabel cu datele acestora: marca salariat, prenume, nume,
data angajării, funcţia, locaţia şi salariul. Creaţi o casetă de căutare care se conţină o listă derulantă
din care utilizatorul să selecteze marca angajatului şi, corespunzător, să se afişeze imediat numele şi
prenumele, locaţia şi salariul:
Tabelul angajaţi Caseta de căutare

Obs: Caseta de derulare introduce în celula legată indexul elementului selectat (de ex. 5). Pentru a
determina numele şi prenumele, locaţia sau salariul se foloseşte funcţia index. Astfel, dacă celula
legată de caseta de derulare este J2, tabelul salariaţi se află în domeniul A2:G38 şi coloana de salarii
este a 7-a, funcţia index ce determină salariul angajatului selectat este:
=INDEX($A$2:$G$38,$J$2,7).
Exemplu 2: Folosiţi controalele scroll şi spin pentru a realiza următorul calculator de credite:

Exemplu 3: Creaţi un calculator de credite pentru maşina, ca în imaginea de mai jos. Aveţi un tabel
cu tipul maşinii şi preţul corespunzător, pe care în folosiţi în cadrul calculatorului pentru selectarea
tipului maşinii. Adăugaţi o casetă de validare cu reducerea aplicată, un control de tip scroll pentru
valoarea reducerii, precum şi un control spin pentru numărul de ani.
60
Exemplu 4: Folosiţi controale de tip scroll pentru a modifica valoarea intensităţii culorilor roşu,
verde şi albastru din exemplul următor. Introduceţi un buton de acţiune care să coloreze fundalul
unui domeniu cu nuanţa obţinută din cele trei culori de bază.

Codul corespunzător la clic pe butonul de acţiune este:


Sub Button1_Click()
Range("G3:H5").[Link] = RGB(Range("C3"), Range("c4"), Range("C5"))
End Sub
4.4 Controale de tip ActiveX
Controalele ActiveX pot fi folosite în foile de calcul sau formulare UserForms (nu şi pe foi de
grafic), cu sau fără cod VBA. Aceste controale se folosesc atunci când aveţi nevoie de maximă
flexibilitate în lucrul cu acestea. Controalele ActiveX au mai multe proprietăţi astfel încât să puteţi
customiza modul de afişare, fontul sau alte caracteristici. De asemenea, puteţi controla
evenimentele ce apar în lucrul cu aceste controale (selectarea unui element din listă, clic pe un
buton, etc) şi scrie macro-comenzi ce răspund evenimentelor apărute.
Observaţie: Computerul pe care lucraţi conţine controale ActiveX instalate de Excel sau alte
programe, cum ar fi Calendar Control, Microsoft Date and Time Picker sau Windows Media Player.
Dar nu toate controalele ActiveX pot fi utilizate direct pe foile de lucru. Unele dintre acestea pot fi
folosite doar pe formulare VBA UserForms. Dacă încercaţi să utilizaţi un astfel de control ActiveX
pe o foaie, va apare mesajul de eroare "Cannot insert object."
Controalele ActiveX
Contro Denumire Acţiune
l
CheckBox Validează sau nu o opţiune. Puteţi selecta mai multe
Casetă de validare casete de validare de pe o foaie de calcul sau dintr-un
grup. O casetă de validare poate avea una din
următoarele stări: selectată, deselectată, mixtă.
TextBox Permite introducerea/editarea textelor într-o căsuţă legată
Casetă de text de o celulă.
Button Lansează în execuţie o macro-comandă
Buton de comandă

61
Option Button Dacă este utilizat în cadrul unui grup, selectarea unui
Buton de opţiune buton returnează numărul butonului din cadrul
Label Introduce un text care va fi utilizat pentru a denumi alte
Etichetă controale.
Frame control Se utilizează pentru a grupa controale. Dacă sunt grupate
Casetă de grupare butoanele de acţiune, atunci selecţia unuia determină
deselectarea celorlalte.
List Box Afişează o listă ce conţine unul sau mai multe elemente
Casetă listă care pot fi selectate. Sunt trei tipuri de astfel de liste: liste
ce permit o singură selecţie, liste ce permit selecţii multiple
(cu clic de mouse pe fiecare element) sau liste ce permit
selecţii extinse (clic de mouse sau combinaţii de shift sau
crtl şi clic) .
Combo Box Combină o casetă listă cu una de editare. O listă derulantă
Casetă listă derulantă permite utilizatorului fie selectarea unui element din listă,
fie tastarea informaţiilor în casetă. Controlul afişează
valoarea în caseta de editare, indiferent de modul în care a
fost introdusă.
Scroll Bar O bară de derulare extensibilă, care permite limite minime,
Bară de editare maxime şi modificări incrementate.
Spin button Un contor care permite limite minime, maxime şi
Buton de incrementare/ modificări incrementale.
decrementare
Toggle Indică starea, cum ar fi da/nu sau on/off. Butonul alternează
Buton între stările de activat sau dezactivat, atunci când e apăsat.
Image Introduce o imagine bitmap, jpg sau gif.
Imagine
More controls Afişează o listă de controale adiţionale ActiveX disponibile
Mai multe controale pe calculatorul dvs.

Tot pe formular pot fi introduse şi obiecte grafice (SmartArt graphics, Shapes sau WordArt) cărora
li se pot asocia comenzi.

Caracteristici specifice controalelor

Controalele ActiveX au proprietăţi similare controalelor Form, acestea stabilindu-se cu ajutorul


casetei Properties.

Formulare UsersForm

Pentru o maximă flexibilitate, puteţi crea formulare UserForm pe care să includeţi controale
ActiveX. Aceste formulare sunt disponibile din editorul Visual Basic şi se crează astfel:
- Pentru fişierul în care doriţi să introduceţi formulare, comutaţi în editorul Visual Basic şi din
meniul Insert alegeţi opţiunea UserForm.
- Scrieţi o procedură de afişare a formularului
- Introduceţi controalele ActiveX pe formular folosind bara de instrumente Toolbox
- Stabiliţi proprietăţile controalelor ActiveX
- Scrieţi proceduri ce tratează evenimentele asociate controalelor

62
Descrierea controalelor standard
a) Caseta de text (Textbox)
Controlul casetă cu text TEXTBOX este folosit pentru a afişa informaţiile introduse de utilizator în
momentul execuţiei sau al proiectării.
Proprietatea Name
Proprietatea Name stabileşte numele controlului.
Proprietatea Text
Această proprietate stabileşte sau returnează textul conţinut în caseta de text.
Exemplu: Afişaţi conţinutul casetei de text cu numele txt:
Msgbox [Link]
Proprietăţile BackColor şi ForeColor
Proprietatea BackColor stabileşte culoarea de fundal a controlului, în timp ce proprietatea
ForeColor stabileşte culoarea textului afişat.
Proprietatea Font
Într-o casetă de text, textul afişat nu poate folosi decât o singură familie de litere, adică poate avea
un singur stil tipografic. Caracteristicile acestea sunt gestionate de proprietatea Font.
Aceste caracteristici ale fontului pot fi stabilite prin cod astfel:
a) .[Link] – stilul fontului;
Exemplu: [Link] = ”TimesNewRoman”
b) .[Link] – este o proprietate booleană ce stabileşte dacă textul este scris îngroşat;
Exemplu: [Link]=True – scrie îngroşat
c) .[Link] – este o proprietate booleană ce stabileşte dacă textul este scris înclinat;
Exemplu: [Link]=False – nu scrie înclinat

63
d) .[Link] – este o proprietate cu valori întregi ce stabileşte dimensiunea textului;
Exemplu: [Link]=14 – textul este scris cu caractere de dimensiune 14
e) .[Link] – este o propietate booleană ce stabileşte dacă textul este subliniat.
Exemplu: [Link]=True – textul este scris subliniat
Valoarea implicită a proprietăţilor cu valori booleene este False.

Proprietatea Wordrap
Dacă textul depăşeşte limitele controlului, şi proprietata Wordrap e True, textul poate trece pe linia
următoare. Dacă este False, textul va fi scris pe un singur rând.
Proprietatea Multiline
Dacă textul depăşeşte limitele controlului, i se poate permite acestuia să sară automat pe următoarea
linie atribuind proprietăţii Multiline valoarea True.
Dacă proprietatea Multiline este True atunci este activată şi proprietatea Alignment ce permite
alinierea textului.
Are valori implicite, dar şi constante şi anume:
a) fmTextAlignLeft =1 – text aliniat la stânga (valoare implicită)
b) fmTextAlignCenter =2 – text aliniat la dreapta
c) fmTextAlignright =3 – text centrat

Proprietatea MaxLength
Proprietatea MaxLength (de tip întreg) stabileşte numărul maxim de caractere care poate fi
introdus într-o casetă de text.
Valoarea implicită a acestei proprietăţi este 0, ceea ce înseamnă că numărul caracterelor care poate
fi introdus este nelimitat, pentru orice altă valoare introdusă determină numărul maxim de caractere.
Dacă se depăşeşte această valoare nu se semnalează eroare, dar textul apare trunchiat.
Proprietatea ScrollBars
Dintre proprietăţile care controlează aspectul casetei de text în întregime este şi proprietatea
ScrollBars. Această proprietate este de tip întreg şi stabileşte dacă cutia de text formată cu mai
multe linii este prevăzută cu bară de defilare. Se folosesc constante sau valori numerice pentru a
stabili valoarea proprietăţii:
a) fmScrollBarsNone =0 – cutia nu are bare de defilare;
b) fmScrollBarsHorizontal=1 – cutia are bară de defilare orizontală;
c) fmScrollBarsVertical =2 – cutia are bară de defilare verticală;
d) fmScrollBarsBoth =3 – are bară de defilare şi verticală şi orizontală.

Proprietatea Locked
Casetele de text permit modificări ale conţinutului. Există posibilitatea blocării unei casete de text
în sensul interzicerii modificărilor de la tastatură. Această proprietate este Locked de tip boolean şi
implicit valoarea False permiţând modificarea. Dacă este True nu este permisă aşadar interacţiunea
cu utilizatorul în momentul execuţiei (în cazul unui control aflat direct pe foaia de calcul,
proprietatea Locked este similară proprietăţii Locked a celulelor).
Proprietatea PasswordChar
Proprietatea PasswordChar ne ajută la realizarea casetelor text cu parolă. O casetă text cu parolă
care permite utilizatorului să introducă în ea o anumită parolă ce vafi însă afişată pe ecran sub
formă de caractere de înlocuire cum ar fi asteriscurile (*). Valoarea implicită a acestei proprietăţi
este şirul vid, iar în această situaţie caracterele se vor afişa aşa cum sunt introduse. Modificând
această proprietate, caracterele tastate (proprietatea Text) sunt ascunse. În general, în aplicaţiile
Windows pentru astfel de situaţii se foloseşte *.
Proprietatea AutoSize
Proprietatea AutoSize specifică dacă controlul se redimensionează automat pe orizontală sau nu.
64
Dacă se alege varianta True, atunci controlul se redimensionează automat în aşa fel, încât va fi
afişat întregul text specificat în proprietatea Caption.
Dacă se alege varianta False (valoare implicită), atunci dimensiunea controlului rămâne constantă,
astfel încât textul din proprietatea Caption poate fi trunchiat.
Evenimente utile:
- Change – este evenimentul implicit şi se declanşează la fiecare modificare a valorii căsuţei de text
(Obs: dacă introduceţi date, acesta se va declanşa la fiecare literă)
- AfterUpdate – eveniment ce apare după actualizarea căsuţei de text, când focusul a fost pierdut

b) Etichete

Controalele etichetă LABEL sunt utilizate pentru a afişa text şi nu pot fi modificate de utilizator.
Sunt folosite de obicei pentru:
- a eticheta controalele care nu au propriile proprietăţi Caption;
- a afişa informaţii ca răspuns la diverse acţiuni
Textul afişat de etichete poate fi specificat atât în perioada de elaborare a proiectului, dar şi în
execuţie prin proprietatea Caption. Proprietăţile unei etichete sunt asemănătoare cu proprietăţile
unei casete de text.

c) Butoane de comandă

Butoanele de comandă sunt controalele cele mai des folosite în proiectele Visual Basic. Scopul
folosirii lor este lansarea în execuţie a diferitelor acţiuni (pornirea, oprirea sau terminarea unui
proces).
Utilizarea este posibilă în momentul selectării butonului. Dacă se execută un clic de mouse
deasupra butonului, se declanşează evenimentul Click corespunzător şi se execută operaţiile
corespunzătoare acestui eveniment. Butonul poate fi selectat folosind tastatura, dar şi caracterul
subliniat din numele butonului (litera cheie) şi tasta Alt. Butonul este selectat şi se declanşează
evenimentul Click (controlul poate deveni control curent apăsînd tasta TAB). O altă metodă este
focalizarea prin program folosind metoda SetFocus.

Proprietatea Caption
Proprietatea Caption stabileşte textul afişat de buton.

Proprietatea Accelerator
Această proprietate stabileşte litera care poate fi folosită în combinaţie cu tasta Alt pentru a apăsa
butonul. Dacă litera există în textul afişat de buton, aceasta va fi subliniată.

Proprietăţile BackColor şi ForeColor


Proprietatea BackColor stabileşte culoarea de fundal a controlului, în timp ce proprietatea
ForeColor stabileşte culoarea textului afişat.

Proprietatea Default
Această proprietate de tip boolean stabileşte dacă butonul de comandă este buton implicit al
formularului, adică este activat prin apăsarea tastei ENTER chiar dacă alt buton are focusul.
Pe un formular numai un singur buton poate fi buton implicit. Valoarea implicită a acestei
proprietăţi este FALSE, adică butonul respectiv nu este cel implicit.

Proprietatea Cancel

65
Opusul proprietăţii Default e proprietatea Cancel. Aceasta stabileşte dacă butonul de comandă este
butonul de anulare al formei. Dacă are valoarea TRUE, procedura eveniment asociată butonului
poate fi apelată doar apăsând tasta Esc (indiferent de locaţia actuală a focusului).
Valoarea implicită a acestei proprietăţi este FALSE, iar pe un formular un singur buton poate să
joace rolul butonului de anulare.
Proprietatea Picture
Proprietatea Picture permite afişarea unei imagini butonului de comandă.
Procedurile eveniment specifice butoanelor de comandă sunt: BeforeDragOver,
BeforeDropOrPaste, Click, DblClick, Enter, Error, Exit, KeyDown, KeyUp, MouseDown,
MouseMove.
d) Butoane de opţiune
Butonul OptionButton desemnează un control care poate avea (de cele mai multe ori) două stări:
selectat sau neselectat.
Aceste controale se folosesc pentru opţiuni care se exclud reciproc; se utilizează de obicei grupuri
de butoane din care utilizatorul poate alege unul. Gruparea se realizează desenând butoanele de
opţiune în interiorul unui control de tip container (Frame sau GroupBox) sau sunt desenate direct pe
formular (care joacă rolul unui container implicit).
Din fiecare grup de butoane de opţiune utilizatorul poate selecta numai un singur buton, restul din
grup devin automat deselectate.
Un buton de opţiune poate fi selectat la momentul execuţiei în mai multe feluri: pric click pe el,
folosind tasta TAB pentru selectarea unui buton din grup sau cu ajutorul unei taste de comandă
rapidă.
Proprietatea Caption
Proprietatea Caption stabileşte textul afişat lângă buton.

Proprietatea Accelerator
Această proprietate stabileşte litera care poate fi folosită în combinaţie cu tasta Alt pentru a apăsa
butonul. Dacă litera există în textul afişat de buton, aceasta va fi subliniată.

Proprietăţile BackColor şi ForeColor


Proprietatea BackColor stabileşte culoarea de fundal a controlului, în timp ce proprietatea
ForeColor stabileşte culoarea textului afişat.

Proprietăţile Value
Această proprietate de tip boolean determină dacă opţiunea reprezentată de buton este selectată sau
nu. Dacă se alege valoarea TRUE butonul respectiv este selectat, iar celelalte butoane din acelaşi
container sunt deselectate. Dacă se alege valoarea FALSE butonul nu este selectat (valoare
implicită).

Proprietăţile Alignment şi TextAlign


Proprietatea Alignment stabileşte alinierea imaginii faţă de textul butonului. Valoarea 0 –
fmAlignmentLeft stabileşte ca imaginea să fie în stânga, iar 1- fmAlignmentRight aliniază imaginea
în dreapta.

Proprietatea TextAlign stabileşte alinierea textului: 1 – fmTextAlignLeft stabileşte ca textul să fie


aliniat în stânga, 2 – fmTextAlignCenter stabileşte ca textul să fie aliniat la centru, iar 3-
fmTextAlignRight aliniază textul în dreapta.

66
Evenimentul implicit este Click.
e) Caseta de validare
Casetele de validare (CHECK BOX) sunt folosite în aplicaţii pentru a oferi utilizatorului opţiuni
multiple din care acesta poate alege. Deoarece casetele de validare sunt independente unele de altele
utilizatorul poate selecta oricâte casete la un moment dat.
Controlul are (de cele mai multe ori) două stări: selectat sau neselectat. Controlul are proprietăţi
similare butonului de opţiune.

f) Bare de derulare orizontală şi verticală

Barele de derulare ScrollBar constituie o metodă uşoară de navigare printr-o listă lungă de
elemente sau printr-o cantitate mare de informaţii, derulând fie pe verticală, fie pe orizontală
controlul.

Proprietăţile Min şi Max


Proprietăţile Min şi Max permit stabilirea sau citirea valorii minime, respectiv maxime care se poate
reprezenta pe bara de defilare. Stabilesc aşadar domeniul de variaţie al butonului glisant.
Astfel:
a) stabilirea maxime şi minime
[Link]=valoare
[Link]=valoare
b) citirea valorii maxime şi minime
valoare=[Link]
valoare=[Link]
Implicit valoarea Min este 0, iar Max este 32767. Min şi Max sunt valori întregi deci pot lua valori
între (-32768, 32767).

Proprietatea Value
Această prorpietate (de tip întreg) permite citirea sau stabilirea prin program a poziţiei actuale a
butonului glisant. Poate lua valori în intervalul (Min,Max). Implicit are valoarea 0.

Proprietatea SmallChange
Proprietatea Small Change (de tip întreg) stabileşte deplasarea butonului glisant când se execută clic
pe unul din butoanele cu săgeţi.

Proprietatea LargeChange
Proprietatea Large Change (de tip întreg) stabileşte deplasarea butonului glisant când se execută clic
pe o porţiune a barei de derulare, între butonul glisant şi butonul cu săgeată.

Evenimentele asociate acestui control:


1) CHANGE – se declanşează când proprietatea Value se modifică (fie prin folosirea
mouse-ului, fie prin cod)
2) SCROLL – se declanşează atunci când poziţia butonului de glisare se modifică prin
tragere (nu cu clic pe butoanele săgeţi)
După ce apare evenimentul Scroll, se declanşează automat şi evenimentul Change.

g) Controlul spin
Controlul SpinButton este folosit pentru a incrementa/decrementa valori. De obicei acest control
este folosit împreună cu o casetă de text sau etichetă care afişează valoarea. Proprietăţile importante

67
ale controlului sunt Min, Max, Value şi SmallChange, similare aceloraţi proprietăţi ale barei de
derulare ScrollBar.

h) Caseta cu listă
O casetă cu listă (List Box) afişează o listă cu elementele din care utilizatorul selectează unul sau
mai multe. Elementele sunt şiruri de caractere.
Proprietăţile BackColor şi ForeColor
Proprietatea BackColor stabileşte culoarea de fundal a controlului, în timp ce proprietatea
ForeColor stabileşte culoarea textului afişat.
Proprietatea Value
Această proprietate returnează valoarea selectată din listă, în cazul în care lista este cu selecţie
simplă.
Proprietatea ListStyle
Această proprietate se referă la stilul listei şi are următoarele valori: 0 - fmListStylePlain – valoarea
implicită, în zona alocată controlului apar doar elementele şi 1- fmListStyleOption - în stânga
fiecărui element apare o un buton de opţiuni sau o căsuţă de validare.
Proprietatea ListCount
Această proprietate determină în execuţie numărul de elemente al controlului.
Proprietatea ColumnCount
Proprietatea se referă la numărul de coloane afişate de control. Valoarea implicită este 1.
Proprietatea BoundColumn
Proprietatea stabileşte care din coloanele afişate este folosită pentru a returna valori. Valoarea
implicită este 1.

Proprietatea ColumnHeads
Dacă e true, proprietatea afişează antetele de coloană. Această proprietate e utilă atunci când datele
din coloane provin din domenii Excel.

Proprietatea MultiSelect
Proprietatea MultiSelect se referă la posibilitatea de selectare simultană a mai multor elemente şi la
modalitatea de selectare. Valorile posibile sunt:
0 – fmMultiSelectSingle (valoare implicită) se selectează un singur element;
1 – fmMultiSelectMulti utilizatorul poate selecta mai multe elemente (clic pe fiecare
element, iar pentru a deselecta clic pe elementul selectat);
2 – fmMultiSelectExtended selecţie multiplă extinsă (SHIFT, respectiv CTRL)

Proprietatea List
Dacă informaţiile necesare listei sunt sub formă de tablou, atunci acestea pot fi încărcate direct în
control cu ajutorul proprietăţii List:
Dim localitati(1 To 3) As String
localitati(1) = "Timisoara"
localitati(2) = "Arad"
localitati(3) = "Resita"
68
[Link] = localitati
În perioada de execuţie poate fi utilizată pentru citirea elemntelor listei:
listă.list(i)
(i – numărul elementului din listă - indexul)

Proprietatea RowSource
Atunci când informaţiile necesare completării listei sunt în domenii din foile de calcul Excel,
deosebit de utilă e proprietatea Rowsource care determină încărcarea listei:
[Link] = "Salariat!A2:G38"

Proprietatea ListIndex
Această proprietate (de tip întreg) permite citirea indicelui elementului selectat. Dacă nu a fost
selectat nici un element, atunci Listindex=-1. De exemplu: i=listă.listindex permite citirea indicelui
selectat, iar listă.listindex=i determină selectarea elemntului de pe poziţia i. Proprietata ListIndex
nu poate fi folosită pentru liste cu selecţie multiplă.
În execuţie se poate folosi pentru selectarea unui element.

Proprietatea Selected
Această proprietate reţine un tabel cu valori true/false şi testează dacă elementul al i-lea din listă a
fost selectat:
listă.selected(i)
Metodele acestui control:

Metoda AddItem
Cu ajutorul aceste metode se adaugă un elemnt la un control ListBox sau ComboBox:
[Link] Item, Index
unde Item este un şir de caractere ce reprezintă elemntul listei, iar Index este opţional pentru a
specifica poziţia în control. Implicit, valoarea lui Index porneşte de la 0.

Metoda Clear
Această metodă şterge toate elementele din control:
[Link]

Metoda RemoveItem
Metoda şterge un element specificat din listă:
[Link] Index
unde Index este poziţia elementului ce va fi şters din listă.

i) Caseta combinată
Controlul casetă combinată (Combo Box) integrează facilităţile unei casete de text cu cele ale unei
casete cu listă. Acest control permite utilizatorului să selecteze un element fie introducând text în
caseta combinată, fie selectându-l din listă.
O casetă combinată se potriveşte mai bine când există o listă de opţiuni sugerate, iar caseta cu lista
atunci când alternativele trebuie limitate la cele din listă. Casetele combinate economisesc din
spaţiul formularului, lista e derulată doar când se dă clic pe butonul de deschidere.
Proprietăţile sunt asemănătoare cu cele de la caseta cu listă.

Proprietatea Style
Proprietatea Style poate lua următoarele valori:
a) 0 – fmStyleDropDownCombo - listă combinată derulantă (stilul implicit) – permite
introducerea de date

69
b) 2 – fmStyleDropDownList listă derulantă (nu se permite introducerea datelor)

Proprietatea Text
Proprietatea Text ajută la obţinerea valorii elementului selectat; este corespunzătoare textului din
zona de editare a controlului la momentul execuţiei.

Proprietatea ListIndex
Proprietatea Listindex determină poziţia în listă a elementului selectat. Dacă nu a fost selectat nici
un element, valoarea e -1.
Apare la acest control evenimentul DropDown în momentul în care utilizatorul efectuează un click
pe butonul .

j) Controlul Image

Acest control îl puteţi folosi pentru a afişa o imagine grafică pe formular – de exemplu imaginea cu
logo-ul firmei. Imaginea grafică va fi păstrată în fişierul Excel, astfel încât, atunci când veţi distribui
fişierul altor persoane, imaginea să fie disponibilă.

Proprietatea Picture
Această proprietate stabileşte fişierul de tip imagine ce se va încărca în control.

Proprietatea PictureSizeMode
Proprietatea stabileşte modul de afişare a imaginii în control. Valorile posibile sunt:
a) 0- fmPictureSizeModeClip – “taie” imaginea din fişier la dimeniunea controlului
b) 1- fmPictureSizeModeStretch – redimensionează imaginea la dimensiunile controlului
c) 2- fmPictureSizeModeZoom – redimensionează imaginea la dimensiunile controlului, cu
păstrarea proporţiilor imaginii originale

k) Butoane Toggle
Controalele de tip ToggleButton are două stări: apăsat sau ridicat. Trecerea între aceste două stări se
face prin clic. Proprietatea Value a butonului poate fi True, dacă butonul a fost apăsat sau False ,
dacă butonul a fost ridicat. Acest buton e similar conceputul de selectare a unei căsuţe de validare
Checkbox.

l) Controlul MultiPage
Un control MultiPage permite crearea casetelor cu mai multe pagini (similare casetei FormatCells).
Contolul funcţionează ca şi container pentru alte controale. Implicit controlul are două pagini, dar
cu clic dreapta se pot insera, şterge paginile. Controlul ajută la organizarea mai bună a datelor pe
care utilizatorul trebuie să le introducă. Fiecare pagină a controlului este un obiect de tip Page.

m) Controlul TabStrip
Acest control seamănă ca aspect cu controlul MultiPage, dar, spre deosebire de acesta, nu
acţionează ca şi container pentru controale. Controlul este o colecţie de obiecte de tip Tab.
Un control MultiPage permite crearea casetelor cu mai multe pagini (similare casetei FormatCells).
Implicit controlul are două pagini, dar cu clic dreapta se pot insera, şterge paginile. Controlul ajută
la organizarea mai bună a datelor pe care utilizatorul trebuie să le introducă. Fiecare pagină a
controlului este un obiect de tip Page.

70
n) Controlul RefEdit
Acest control e folosit pentru a selecta domenii dintr-o foaie de calcul. Proprietatea Value
returnează ca String selecţia făcută.

Alte proprietăţi şi metode comune controalelor:


- proprietatea Enable: are valoarea True (valoare implicită) dacă e activ şi False dacă e inactiv
- proprietatea Visible: are valoarea True (valoare implicită) dacă e vizibil şi False dacă e ascuns
- proprietatea Locked: are valoarea False (valoare implicită) dacă poate fi folosit şi True în caz
contrar (e read-only)
- proprietatea TabStrop: are valoarea True (valoare implicită) dacă se poate ajunge la control
folosind tasta Tab şi False în caz contrar
- proprietatea TabIndex: valoarea acestuia reprezintă poziţia în ordinea de parcurgere a
controalelor cu ajutorul tastei Tab
- metoda SetFocus: această metodă poate fi apelată pentru orice control şi determină ca acel
control să primească focusul.

Metode şi proprietăţi utile ale formularului


- proprietatea Caption: stabileşte textul afişat de formular.
- proprietatea BackColor: stabileşte culoarea de fundal a controlului
- proprietatea ForeColor: stabileşte culoarea textului afişat
- proprietatea Picture: stabileşte fişierul de tip imagine ce se va încărca în control.
- proprietatea ShowModal: stabileşte dacă execuţia programului va aştepta finalizarea lucrului cu
fomularul sau nu; implicit valoarea e True, adică utilizatorul trebuie să lucreze cu formularul şi apoi
să efectueze alte operaţii; valoarea False înseamnă că utilizatorul poate folosi formularul şi poate
efectua alte operaţii cu Excel fără a-l închide.
- metoda Show: determină afişarea unui formular (de exemplu: [Link] )

Închiderea formularului se realizează cu ajutorul metodei Unload a obiectului VBA. De exemplu:


Private Sub Iesire_Click()
Unload Me
End Sub
Obs:Obiectul Me reprezintă formularul curent
Evenimente importante la nivel de formular:
- Initialize : evenimentul apare înainte de afişarea formei.
- Terminate: evenimentul apare la ieşirea de pe formular (cu butoanele Ok sau Cancel)
- Click: evenimentul se declanşează la clic pe formular, în afara controalelor

Evenimente importante la nivel de fişier:


- Activate: se declanşează atunci când un fişier e activat
- BeforeClose: se declanşează înainte de închiderea fişierului
- BeforePrint: apare înainte de a tipări informaţii din fişier
- BeforeSave: apare înainte a salva fişierul

71
- Deactivate: apare atunci când fişierul nu mai e activ
- NewSheet: se declanşează la crearea unei noi foi de calcul
- Open: se declanşează la deschiderea fişierului
- SheetActivate: apare la activarea unei foi
- SheetChange: apare la modificarea oricărei celule din fişier
- SheetDeactivate: apare atunci când o foaie pierde activarea
- SheetPivotTableUpdate: apare imediat după comanda de actualizare a tabelului pivot
- SheetSelectionChange: apare la selectarea unei celule sau a unui domeniu de pe orice foaie din
fişier
Evenimente importante la nivel de foaie de lucru:
- Activate: se declanşează atunci când o foaie e activată
- Calculate: apare atunci când datele de pe foaie se recalculează
- Change: apare la modificarea oricărei celule de pe foaie
- Deactivate: apare atunci când fişierul nu mai e activ
- NewSheet: se declanşează la crearea unei noi foi de calcul
- Open: se declanşează la deschiderea fişierului
- PivotTableUpdate: apare imediat după comanda de actualizare a tabelului pivot de pe foaia de
lucru
- SelectionChange: apare la selectarea unei celule sau a unui domeniu
Aplicaţie practică:
1) Creaţi fişierul Formulare [Link]
2) Introduceţi în prima foaie butoanele Introduceţi sesizarea şi Şterge sesizarea, ca în
imaginea următoare:

3) La clic pe butonul Introduceti sesizarea va apărea formularul Sesizare, ce conţine


următoarele elemente:

4) La clic pe butonul Stergeti sesizarea va apărea formularul Sterge sesizarea, ce conţine


următoarele elemente:

72
5) Iniţializaţi formularul Sesizare cu următoarele valori:
- în casetele de text pentru zi, luna, an introduceţi ziua, luna şi anul corespunzătoare
datei curente;
- blocaţi casetele de text zi, luna, an
- scoateţi casetele de text zi, luna, an din lista de parcurgere a tab-urilor
- în lista cu tipul incidentelor adăugaţi elementele: Memorii incompatibile, HDD
defect, Placa de baza defecta, placa video defecta; stabiliţi ca prima valoare afişată de
listă să fie Memorii incompatibile
- opţiunea Reparare este implicită
- la durata stabiliţi pentru incrementare minimul la 0, maximul la 600, iar pasul de
incrementare la 5
6) Pe formularul Sesizare stabiliţi ca orice modificare a butonului de incrementare să se
reflecte în durată
7) Pe formularul Sesizare efectuaţi următoarele operaţii la clic pe butonul Inserare:
- Scrieţi un ciclu care să oblige utilizatorii să introducă o numele celui de a rezolvat
incidentul; (în caz că nu se introduce nimic în caseta de text cu numele celui ce a
rezolvat incidentul, programul afişează un mesaj şi cursorul revine în caseta de text)
- Completaţi tabelul din foaia Sheet 1 cu datele introduse de utilizator pe formular;
- Reiniţializaţi valorile controalelor de pe formular astfel încât să poată fi introduse şi
alte sesizări
8) În procedura de terminare a formularului Sesizare reiniţializaţi valorile controalelor asfel
încât să valorile lor să fie cele iniţiale.
9) Butonul Anulare de pe formularul Sesizare să determină închiderea ferestrei.
Rezultatul în fişierul Excel va fi similar cu exemplul următor:

10) Iniţializaţi formularul Şterge sesizarea astfel încât valoarea controlului să fie şirul vid.
11) Pe formularul Şterge sesizarea, la clic pe butonul Şterge se şterge rândul aferent celulei
selectate.
12) La clic pe butonul Anulare de pe formularul Şterge sesizarea se va închide fereastra.

Rezultatul în fişierul Excel va fi similar cu exemplul următor, după ştergerea sesizărilor 4 şi 2:

73
5. Tabele
Un tabel Excel e un obiect nou în versiunea 2007. Tabelul e în fapt o listă cu funcţionalităţi
avansate cum ar fi: calculele, totalizările, sortările sau filtrările. Un tabel Excel e creat fie dintr-un
domeniul Excel, fie dintr-o sursă externă. Un tabel este un obiect de tip ListObject, iar toate
tabelele dintr-un fişier se găsesc în colecţia ListObjects.

5.1 Crearea unui tabel din VBA

Un tabel nou se crează cu ajutorul metodei Add a unui obiect de tip ListObjects.
Sintaxa:
[Link](tip_sursa, sursa, sursa_legata, antet, destinatie)
unde:
tip_sursa – indică tipul datelor sursă pentru tabel. Poate avea una din următoarele valori: 0
(xlSrcExternal) – sursă externă de date (site Microsoft Windows SharePoint Services), 1
(xlSrcRange) – domeniu, 2 (xlSrcXml) – XML, 3 (xlSrcQuery) – query (argument opţional)
sursa – dacă tip_sursă e xlSrcRange, atunci sursa e un obiect de tip range ce specifică domeniul;
sursa_legata – valoarea booleană ce precizează dacă sursa externă va fi legată sau nu de tabel.
(argument opţional)
antet – o constantă ce precizează dacă datele au linie de antet sau nu. Dacă datele sursă nu au antet,
Excel va genera automat o linie de antet. Valorile posibile sunt 0 (XlGuess) – Excel determină dacă
tabelul are antet, 1 (xlYes) – datele nu sunt sortate, 2 (xlNo) – datele vor fi sortate (valoare
implicită).
destinatie – on obiect de tip Range ce precizează o singură celulă destinaţie – colţul stânga sus al
viitorului tabel. (argument opţional)
Exemplu:
[Link](xlSrcRange, Range("$A$1:$D$10"), False, xlGuess).Name = "tab"

5.2 Obţinerea informaţiilor dintr-un tabel

Obiectul tabel, de tip ListObject are câteva proprietăţi şi metode utile:


- proprietatea ListColumns returnează o colecţie de tip ListColumns ce reprezintă toate coloanele
tabelului
- proprietatea ListRows returnează o colecţie de tip ListRows ce reprezintă toate rândurile tabelului
- proprietatea DataBodyRange returnează un obiect de tip Range cu toate datele tabelului,
excluzând linia de antet
- proprietatea HeaderRowRange returnează un obiect de tip Range cu antetul tabelului
- proprietatea InsertRowRange returnează un obiect de tip Range cu rândurile inserate (dacă
există)
- proprietatea ShowTotals de tip boolean afişează sau ascunde rândul de total al tabelului
74
- proprietatea Range returnează un obiect de tip Range cu toate datele tabelului
- proprietatea Name returnează sau stabileşte numele tabelului
- proprietatea ShowAutoFilter , de tip boolean, afişează sau ascunde săgeţile filtrului tabelului
- proprietatea TotalRowRange returnează un obiect de tip Range cu rândul de total
- proprietatea AutoFilter permite filtrarea datelor tabelului
- proprietatea Sort permite sortarea datelor tabelului
- proprietatea TableStype stabileşte stilul aplicat tabelului
- metoda Delete şterge obiectul de tip tabel (inclusiv datele acestuia)
Numărul de rânduri dintr-un tabel poate fi aflat cu ajutorul proprietăţii Count a obiectului
ListRows, iar numărul de coloane cu aceeaşi proprietate a obiectului ListColumns.
Exemplu: Afişaţi numărul de rânduri şi coloane a tabelului din prima foaie. Scrieţi în celula M1
adresa rândului de antet a tabelului, iar în M2 adresa datelor tabelului, excluzând rândul de antet.
Ascundeţi săgeţile corespunzătoare filtrului.
Dim tabel As ListObject
Set tabel = Worksheets(1).ListObjects(1)
MsgBox “Tabelul are: ” & [Link] & ” randuri”
MsgBox “Tabelul are: ” & [Link] & ” coloane”
Range("M1").Value = [Link]
Range("M2").Value = [Link]
[Link] = False
5.3 Inserarea unui rând
De multe ori lucrul cu tabele presupune introducerea de noi informaţii. Acest lucru înseamnă
introducerea de noi rânduri în tabel.
Un rând nou se introduce cu ajutorul metodei Add a obiectului ListRows.
Sintaxa:
[Link](pozitie)
unde
randuri - un obiect de tip ListRows
pozitie – un număr întreg ce precizează unde va fi inserat noul rând; dacă nu e precizat, rândul va fi
inserat la sfârşit
Exemplul următor inserează un rând nou pe a doua poziţie:
[Link](1).[Link](2)
Exemplu: În prima foaie din fişier există un tabel ca cel de mai jos. Scrieţi procedura VBA de
inserare a unui rând nou la sfârşit. Completaţi acest rând cu următoarele date: (01/01/2009,
imprimanta, Danemarca, 200).
Private Sub IntroducereDate()
Dim tabel As ListObject
Dim rand As ListRow
Dim r As Range
Set tabel = Worksheets(1).ListObjects(1)
[Link]
Set rand =
[Link]([Link])
Set r = [Link]
r(1) = "01/01/2009"
r(2) = "imprimanta"
r(3) = "Danemarca"
r(4) = "200"
End Sub

75
5.4 Inserarea unei coloane cu valori calculate

O coloană se inserează similar cu un rând, folosind metoda Add a obiectului ListColumns.


Sintaxa:
[Link](pozitie)
unde
coloane- un obiect de tip ListColumns

pozitie – un număr întreg ce indică unde va fi inserată noua coloană; dacă nu e precizată, coloana va
fi inserată la sfârşit
Exemplul următor inserează o coloană nouă pe a treia poziţie:
[Link](1).[Link](3)

Exemplu: În tabelul următor introduceţi la sfârşit o coloană cu titlul TVA, în care calculaţi tva-ul ca
19% din Vanzari.
Private Sub ColoanaTVA()
Dim tabel As ListObject
Dim col_tva, col_vanzari As ListColumn
Dim r As Range
Dim formula As String
Set tabel = [Link](1)
[Link]
Set col_tva =
[Link]([Link])
Set col_vanzari
=[Link]( [Link] - 1)
Set r = col_tva.Range
formula = "=" & [Link] & "[[#This Row],["
& col_vanzari.Name & "]]*19% "
r(1).Value = "TVA"
r(2).FormulaR1C1 = formula
End Sub
5.5 Totalizarea datelor
Avem posibilitatea de a afişa la finalul tabelului un rând de total şi de a afişa pe acesta suma (media,
minimul, maximul, numărul) datelor de pe coloane. Pentru acest lucru trebuie să efectuăm
următoarele:
- afişare rând total: cu ajutorul proprietăţii ShowTotals a tabelului
- afişarea totalului pe coloane: pentru fiecare coloană pe care dorim să efectuăm totalizări, apelăm la
proprietatea TotalsCalculation a unui obiect de tip ListColumn. Proprietatea poate avea una din
următoarele valori:

Nume Valoare Descriere


xlTotalsCalculationNone 0 Nu face nici un calcul
xlTotalsCalculationSum 1 Suma
xlTotalsCalculationAverage 2 Media
xlTotalsCalculationCount 3 Numără celulele nevide.
xlTotalsCalculationCountNums 4 Numără celulele numerice
xlTotalsCalculationMin 5 Minimul
76
xlTotalsCalculationMax 6 Maximul
xlTotalsCalculationStdDev 7 Deviaţia standard
xlTotalsCalculationVar 8 Varianţa
xlTotalsCalculationCustom 9 Efectuează un total
particularizat

Exemplu: În tabelul din exemplul anterior afişaţi rândul de total şi afişaţi suma valorilor pe
coloanele Vanzari şi TVA:

Private Sub RandTotal()


Dim tabel As ListObject
Set tabel = [Link](1)
[Link] = True
[Link](4).TotalsCalculation = xlTotalsCalculationSum
[Link](5).TotalsCalculation = xlTotalsCalculationSum
End Sub

5.6 Modificarea informaţiilor din tabel

Pentru a modifica informaţii din tabel, datele de pe rânduri sau coloane trebuie accesate. Acestea
vor fi reţinute în obiecte de tip Range, care sunt ulterior parcurse pentru testarea şi modificarea
datelor.
Ştergerea rândurilor sau coloanelor se realizează cu ajutorul metodei Delete a obiectelor ListRow
sau ListColumn, iar aplicarea unui stil tabelului implică apelarea proprietăţii TableStyle a obiectului
de tip ListObject şi precizarea numelui stilului între ghilimele.

Exemplu1: În tabelul din exemplul anterior, dorim să modificăm valoarea vanzărilor la 1000 în data
de 28.04.2006. Pentru acest lucru, reţinem coloanele cu data şi valoare în două obiecte de tip
ListColumn, iar domeniile corespunzătoare acestora le reţinem în obiecte de tip Range. Vom
parcurge domeniul cu date pentru a găsi rândul în care se găseşte valoarea de 28.04.2006 şi în
momentul în care am găsit rândul, vom scrie în coloana cu vânzările, în rândul găsit, valoarea de
1000.

Sub Modifica()
Dim tabel As ListObject
Dim col_data, col_vanzari As ListColumn
Dim r, modif As Range
Dim i As Integer
Set tabel = [Link](1)
Set col_data = [Link](1)
Set col_vanzari = [Link]([Link] - 1)
Set r = col_data.Range
Set modif = col_vanzari.Range
For i = 1 To [Link]
If r(i).Value = "4/28/2006" Then
modif(i).Value = "1000"
End If
Next i
End Sub

77
Exemplu2: Tabelului din exemplele anterioare, aplicaţi-i stilul TableStyleLight10. Ştergeţi coloana
5 şi rândul 3 din tabel.

Sub Modifica2()
Dim tabel As ListObject
Set tabel = [Link](1)
[Link] = "TableStyleLight10"
[Link](5).Delete
[Link](3).Delete
End Sub

6. Grafice
6.1 Crearea unui grafic

Dim grafic As Chart


Set grafic = [Link]
[Link] Source:=Range("'Stoc'!$A$1:$D$5")
[Link] = xlColumnClustered
[Link] = xlRows
Un grafic Excel este o sumă de obiecte, fiecare cu proprietăţile şi metodele sale. Din această cauză,
lucrul cu grafice din VBA poate fi mai dificil şi, din păcate, macro-comenzile nu sunt de ajutor în
Excel 2007-2010.

6.2 Locaţia unui grafic

În Excel, un grafic se află:


 ca obiect pe o foaie de lucru, pe care se pot găsi şi alte grafice
 între-o foaie separată de grafic, ce conţine un singur grafic

Cele mai multe grafice sunt create manual, dar acest lucru este posibil şi cu ajutorul comenzilor
VBA. De asemenea, putem folosi VBA pentru a modifica graficele existente.

Pentru grafice aflate pe o foaie de lucru, pentru a ajunge la obiectul de tip grafic (Chart), ierarhia
este următoarea:
Application
Workbook
Worksheet
ChartObject
Chart
În cazul graficelor aflate pe o foaie separată de grafic, ierarhia de obiecte este:
Application
Workbook
Chart
În primul caz, în care graficul se găseşte pe o foaie de lucru, acesta (obiectul Chart) este identificat
cu ajutorul colecţiei de obiecte de tip grafic ChartObject. În cazul al doilea, în care obiectul este pe
o foaie de grafic, ierarhia este diferită, deoarece nu mai intervine nici obiectul foaie de lucru
(Worksheet) şi nici colecţia de obiecte de tip grafic (ChartObject), ci graficul este identificat direct
după numele foii de tip grafic.

78
Exemplu 1: Modificaţi titlul pentru graficul din foaia Sheet1 în „Vanzari”.
With WorkSheets("Sheet1").ChartObjects(1).Chart
.HasTitle = True
ChartTitle. Text = "Vanzari"
End With

Exemplu 2: Modificaţi titlul pentru graficul din foaia Chart1 de tip grafic.
With Charts("Chart")
.HasTitle = True
ChartTitle. Text = "Vanzari"
End With
6.3 Crearea unui grafic aflat pe o foaie de lucru

În Excel 2007-2010, colecţia ChartObject este un caz special de obiecte de tip Shape. Din acest
motiv, ChartObject este membru al colecţiei Shapes, iar pentru a crea un grafic nou se foloseşte
metoda AddChart a colecţiei Shapes.
[Link]
Metoda AddChart are următoarele argumente:
 Type – tipul graficului. Dacă argumentul este omis, tipul graficului va fi cel implicit –
coloană. Pentru a specifica un anumit tip, se folosesc constantele din enumerarea XlChartType (de
exemplu: xlArea, xlColumnClustered, xl3DColumn, xl3DPie, xl3DPieExploded, xlLine,
xlLineMarkers )
 Left – poziţia din stânga a graficului, în puncte. Dacă parametrul este omis, graficul va fi
centrat orizontal.
 Top – poziţia din partea de sus a graficului, în puncte. Dacă parametrul este omis, graficul
va fi centrat vertical.
 Width – lăţimea graficului, în puncte. Dacă parametrul este omis, dimensiunea va fi 354.
 Height – înălţimea graficului, în puncte. Dacă parametrul este omis, dimensiunea va fi
210.

Exemplu1: Creaţi cu datele din foaia activă un grafic de tip linie.


Sub CreeazaGrafic1()
Dim MyChart As Chart
Set MyChart = [Link](xlLineMarkers).Chart
End Sub

Folosirea metodei AddChart a colecţiei Shapes pentru crearea unui grafic este o variantă nouă,
introdusă în Excel 2007. Pentru a păstra compatibilitatea există şi metoda Add a colecţiei
ChartObject, care, însă, nu permite specificarea tipului graficului la crearea acestuia. În acest caz,
pentru va fi folosită proprietatea ChartType a obiectului de tip grafic, dacă dorim alt tip de grafic,
diferit faţă de cel implicit. În plus, argumentele Left, Top, Wisth, Height trebuie precizate.
Exemplu2: Creaţi cu datele din foaia activă un grafic de tip linie. Folosiţi varianta din versiunile
anterioare de Excel
Sub CreeazaGrafic2()
Dim MyChart As Chart
Dim DataRange As Range
Set DataRange = [Link]("A1:C7")
Set MyChart = [Link](10, 10, 354, 210).Chart
[Link] Source:=DataRange
[Link] = xlColumnClustered
79
End Sub

În acest exemplu am folosit proprietatea ChartType pentru a preciza tipul graficului. Mai mult, am
indicat şi domeniul cu datele sursă pentru grafic cu ajutorul metodei SetSourceData.

6.4 Crearea unui grafic pe o foaie de grafic


Pentru a crea un grafic pe o foaie de tip grafic vom folosi metoda Add a colecţiei Charts.
Argumentele metodei Add sunt:

 Before – precizează înaintea cărei foi va fi introdusă foaia de grafic; argument opţional
 After - precizează după care foaie va fi introdusă foaia de grafic; argument opţional
 Count – indică numărul de foi introduse; argument opţional
 Type – tipul graficului – o constantă din enumerarea XlChartType; argument opţional
Exemplu3: Creaţi cu datele din foaia activă un grafic de tip linie într-o foaie nouă, aflată după foaia
Sheet1.
Sub CreeazaFoaieGrafic1()
[Link] after:=Worksheets("Sheet1")
[Link] = xlLineMarkers
End Sub
Exemplu4: Creaţi cu datele din domeniul A1:C7 din foaia activă un grafic de tip coloană într-o
foaie nouă, aflată după foaia Sheet1.
Sub CreeazaFoaieGrafic()
Dim MyChart As Chart
Dim DataRange As Range
Set DataRange = [Link]("A1:C7")
Set MyChart = [Link](, Worksheets("Sheet1"))
[Link] Source:=DataRange
[Link] = xlColumnClustered
End Sub
6.5 Activarea unui grafic din VBA
Un grafic se activează imediat la clic pe el. Din VBA activarea se face cu ajutorul metodei Activate:
- Pentru graficul Chart1 aflat pe o foaie de lucru:
[Link]("Chart 1").Activate
sau
[Link]("Chart 1").Select
- Pentru graficul Chart1 aflat pe o foaie de grafic:
Sheets("Chart1").Activate
După activare, graficul poate fi referit cu ajutorul proprietăţii ActiveChart.
În VBA, modificarea unui grafic nu necesită activarea sa. Astfel, următoarele două exemple conduc
la acelaşi rezultat:
Sub ModificareTipGrafic1()
[Link]("Chart 1").Activate
[Link] = xlBarClustered
End Sub

Sub ModificareTipGrafic2()
80
[Link]("Chart 1").[Link] = xlBarClustered
End Sub
În primul caz graficul a fost activat şi apoi a fost modificat tipul acestuia în bară, în timp ce în al
doilea caz modificarea s-a efectuată fără a activa graficul.

6.6 Mutarea unui grafic

Transformarea unui grafic din obiect într-o foaie de lucru în foaie de grafic se face cu ajutorul
metodei Location a obiectului de tip Chart. Metoda are două argumente:
 Where – unde va fi mutat graficul; argument necesar; o valoare din enumerarea
xlChartLocation, ce conţine constantele xlLocationAsNewSheet – foaie nouă de tip
grafic, xlLocationAsObject – obiect într-o foaie existentă, xlLocationAutomatic – programul Excel
controlează locaţia graficului
 Name - precizează numele foii de grafic sau numele foii de lucru în care va fi mutat
obiectul; argument opţional, cu excepţia cazului în care argumentul precedent este
xlLocationAsObject
Exemplu1: Mutaţi graficul din Sheet1 într-o foaie de grafic cu numele Gf1.
Sub Grafic1()
Sheets("Sheet1").ChartObjects(1).[Link] xlLocationAsNewSheet, "Gf1"
End Sub
Exemplu2: Mutaţi graficul din foaia de grafic Gf1 în foaia de lucru Sheet1.
Sub Grafic1()
Charts("Gf1").Location xlLocationAsObject, "Sheet1"
End Sub

6.7 Determinarea activării unui grafic


Un prim imbold în a stabili dacă un grafic este activ este verificarea valorii proprietăţii TypeName
pentru obiectul Selection:
TypeName(Selection) = "Chart"

Însă valoarea acestei expresii nu este aproape niciodată True. Dacă utilizatorul a dat clic în grafic,
selecţia poate fi dată de o parte a graficului (ex. o serie de date, titlul graficului, legenda etc).
Varianta corectă de a determina activarea unui grafic este de a determina dacă valoarea lui
ActiveChart este Nothing:
If ActiveChart Is Nothing Then
MsgBox "Selectaţi un grafic."
Exit Sub
Else
MsgBox [Link]
End If

6.8 Ştergerea unui grafic


Pentru a şterge un grafic dintr-o foaie de lucru, trebuie să-i cunoaştem numele sau indexul.
Ştergerea se face cu ajutorul metodei Delete a colecţiei ChartObjects.
Următoarea comandă şterge graficul cu numele Chart1 aflat în foaia activă
[Link]("Chart 1").Delete
sau
[Link]("Chart 1").Delete
81
Pentru a şterge toate graficele de pe o foaie de lucru, folosiţi comanda:
[Link]
sau
[Link]
Pentru a şterge o foaie de grafic trebuie să-i cunoaştem numele sau indexul. Comanda următoare
şterge foaia de grafic cu numele Chart1:
Charts("Chart1").Delete
Ştergerea tuturor foilor de grafic se face cu ajutorul comenzii:
[Link]
Ştergerea foilor de grafic conduce la apariţia, pentru utilizator, a ferestrei următoare:

în care utilizatorul trebuie să confirme ştergerea. Dacă nu doriţi ca utilizatorului să-i apară fereastra
de confirmare, folosiţi următoarea secvenţă de comenzi:
[Link] = False
[Link]("Chart1")..Delete
[Link] = True

6.9 Formatarea graficelor cu ajutorul VBA


Formatarea graficelor direct în Excel, fără VBA, presupune,de obicei, lucrul cu următoarele etichete
specifice:
 Design /Chart Layouts
 Design /Chart Styles
 Layout / Labels
 Layout / Axes
 Layout / Background

Observaţie: Dacă înregistraţi o macro-comandă pentru formatarea graficelor, acestea nu se păstrează


în Excel 2007-2010.
Stabilirea modului de afişare (layout) se face cu ajutorul metodei Apply Layout a unui obiect de tip
Chart. Metoda are două argumente
 Layout – specifică numărul modului de afişare, de la 1 la 10.
 ChartType – specifică tipul graficului, una din valorile enumerării XlChartType; argument
opţional

Exemplu:
[Link] 10
Stabilirea stilului unui grafic se face cu ajutorul proprietăţii ChartStyle a unui obiect de tip Chart.
Proprietatea ia valori între 1 şi 48.

Exemplu:
[Link] = 30

82
Metoda ClearToMatchStyle elimină toate formatările aplicate de utilizator unui grafic. Această
metodă se foloseşte împreună cu ChartStyle pentru a asigura aplicarea standard a stilului indicat.
Metoda SetElement controlează aspectul majorităţii elementelor unui grafic. Metoda are un singur
argument. Valoarea argumentului va fi una din cele 120 constante descriptive ale enumerării
MsoChartElementType.

Exemplu: Stabiliţi ca pentru graficul activ titlul să fie afişat în partea de sus, iar legenda să nu fie
afişată.
[Link] msoElementChartTitleAboveChart
[Link] msoElementLegendNone
Exemplu: Pentru tabelul cu stocurile de produse, afişat mai jos, creaţi în VBA un grafic formatat, ca
cel din imagine.

Sub creaza_grafic()
Dim grafic1 As Chart
' creare grafic
Set grafic1 = [Link]
' datele sursă pentru grafic
[Link] Source:=Range("'Stoc'!$A$1:$A$5,'Stoc'!$E$1:$E$5")
' lăţimea şi înălţimea graficului
[Link] = 400
[Link] = 300
' tipul graficului
[Link] = xlPieExploded
' stilul graficului
[Link] = 26
' stabilirea unei culori ca fundal pentru titlu
[Link] = RGB(220, 230, 242)
' aplicarea unui aspect tridimensional graficului
With [Link]
.Visible = msoTrue
.BevelTopType = msoBevelDivot
.BevelTopDepth = 12
.BevelTopInset = 32
End With
' stabilirea titlului graficului
[Link] = "Situatia stocurilor pe Trimestrul 1"
' rotirea graficului cu 45 de grade
83
[Link] = 45
' eliminarea legendei
[Link]
' afişarea etichetelor de date şi a procentului
[Link] xlDataLabelsShowLabelAndPercent
End Sub

6.10 Parcurgerea tuturor graficelor

În multe cazuri e necesară efectuarea anumitor operaţii pe toate graficele. De exemplu, formatarea
similară a mai multor grafice aflate pe aceeaşi foaie de lucru poate fi efectuată cu ajutorul VBA.
Exemplu1: Pentru toate graficele din foaia activă stabiliţi următoarele proprietăţi:
- tipul graficului – linie cu marcatori
- modul de afişare (layout) – nr. 3
- stilul graficului – nr. 12
- fiecare grafic să aibă titlul afişat deasupra, să nu fie afişată legenda şi nici titlurile de pe axele de
valori şi categorie
- axa valorilor să fie între 0 şi 1000

Sub FormateazaToateGraficele1()
Dim ChtObj As ChartObject
For Each ChtObj In [Link]
With [Link]
.ChartType = xlLineMarkers
.ApplyLayout 3
.ChartStyle = 12
.ClearToMatchStyle
.SetElement msoElementChartTitleAboveChart
.SetElement msoElementLegendNone
.SetElement msoElementPrimaryValueAxisTitleNone
.SetElement msoElementPrimaryCategoryAxisTitleNone
.Axes(xlValue).MinimumScale = 0
.Axes(xlValue).MaximumScale = 1000
End With
Next ChtObj
End Sub

Exemplu2: Rezolvaţi problema de mai sus în varianta în care aplicaţi aceeaşi formatare tuturor
foilor de tip grafic.
Sub FormateazaToateGraficele2()
Dim cht as Chart
For Each cht In [Link]
With cht
.ChartType = xlLineMarkers
.ApplyLayout 3
.ChartStyle = 12
.ClearToMatchStyle
.SetElement msoElementChartTitleAboveChart
.SetElement msoElementLegendNone
.SetElement msoElementPrimaryValueAxisTitleNone
84
.SetElement msoElementPrimaryCategoryAxisTitleNone
' stabilirea valorilor minime şi maxime pentru axa valorilor
.Axes(xlValue).MinimumScale = 0
.Axes(xlValue).MaximumScale = 1000
End With
Next cht
End Sub

Exemplu3: Stabiliţi toate graficele din foaia activă astfel încât acestea să fie de aceeaşi dimensiune,
aranjate pe pe două coloane.

Sub AliniereGrafice()
Dim W As Long, H As Long
Dim TopPosition As Long, LeftPosition As Long
Dim ChtObj As ChartObject
Dim i As Long
W = 300
H = 200
TopPosition = 100
LeftPosition = 20
For i = 1 To [Link]
With [Link](i)
.Width = W
.Height = H
.Left = LeftPosition + ((i - 1) Mod 2) * W
.Top = TopPosition + Int((i - 1) / 2) * H
End With
Next i
End Sub
6.11 Modificarea datelor utilizate de grafic
Exemplele de până acum au folosit proprietatea SourceData pentru a preciza domeniul de valori
folosit pentru grafic.
Datele folosite pentru fiecare serie a graficului sunt determinate de funcţia SERIES. De fiecare dată
când selectaţi într-un grafic o serie de date, formula aceasta apare în bara de formule. Funcţia
SERIES nu poate fi folosită într-o celulă Excel, însă argumentele sale pot fi editate.
Funcţia SERIES are următoarea sintaxă:
=SERIES(series_name, category_labels, values, order, sizes)
Argumentele funcţiei sunt:
 series_name – referinţa la o celulă ce conţine numele seriei, folosit în legendă. Dacă
graficul are o singură serie, numele va fi folosit ca titlu pentru grafic. Numele seriei poate fi
şi un şir de caractere scris între ghilimele. Dacă numele este omis, Excel va crea un nume
implicit – Series 1, Series 2 etc.
 category_labels – referinţa la un domeniu de celule ce conţin etichetele pentru axa
categoriilor. Dacă este omis, Excel va introduce numere întregi începând cu 1. Pentru un
grafic XY, acest argument precizează valorile X. Dacă domeniul este discontinuu, adresele
trebuie separate de virgule şi incluse între paranteze. Etichetele pot fi şi şiruri de texte
separate de virgulă şi incluse între acolade.
 values – referinţa la un domeniu ce conţine valori ale seriei. Pentru un grafic XY, acest
argument indică valorile Y. Dacă domeniul este discontinuu, adresele trebuie separate de

85
virgule şi incluse între paranteze. Valorile pot fi şi constante separate de virgulă şi incluse
între acolade.
 order – un număr întreg ce specifică ordinea de afişare a seriei. Acest argument e relevant
doar dacă pe grafic sunt mai multe serii de date. Intr-un grafic coloană, acest argument
indică ordinea de afişare a coloanelor. Nu pot fi folosite adrese de celule pentru a preciza
valoarea argumentului.
 Sizes – doar pentru grafice bubble chart – referinţa la un domeniu ce conţine valori pentru
dimensiunea bulelor. Dacă domeniul este discontinuu, adresele trebuie separate de virgule şi
incluse între paranteze. Valorile pot fi şi constante separate de virgulă şi incluse între
acolade.
Domeniile folosite de funcţia SERIES sunt totdeauna absolute şi includ numele foii de lucru.
Exemple:
=SERIES(Stoc!$A$2;Stoc!$B$1:$D$1; Stoc!$B$2:$D$2;1)
=SERIES(Stoc!$A$2;Stoc!$B$1:$D$1;{20; 15; 8};2)
=SERIES( , , (Sheet1!$B$2:$B$3,Sheet1!$B$5:$B$7), 1)
=SERIES(Sheet1!$B$1, , [Link]!date_importante,1)
Pentru un obiect de tip Series, proprietatea Values corespunde cu al treilea argument al funcţiei
Series prezentate mai sus, iar proprietatea XValues corespunde cu al doilea argument
Exemplu1: Într-o foaie Excel se află un sondaj de opinie al clienţilor. Datele de la prima întrebare
sunt folosite pentru a crea un grafic direct în Excel. Pentru a fi cât mai interactiv, graficul ar trebui
să reprezinte datele de pe linia selectată de utilizator.

Pentru a verifica dacă utilizatorul a ales alt rând, evenimentul captat este SelectionChange pentru
foaia de lucru în care se află tabelul şi graficul:
Private Sub Worksheet_SelectionChange(ByVal Target As [Link])
Call UpdateChart
End Sub
Codul scris în modul, pentru actualizarea graficului este:
Sub ActualizareGrafic ()
Dim ChtObj As ChartObject
Dim UserRow As Long
Set ChtObj = [Link](1)
'rândul selectat de utilizator este rândul curent
86
UserRow = [Link]
'dacă rândul selectat este mai mic decât 4 sau este gol, atunci graficul va fi ascuns
If UserRow < 4 Or IsEmpty(Cells(UserRow, 1)) Then
[Link] = False
Else
'valorile graficului sunt cele de pe coloanele 2-6 ale rândului curent
[Link](1).Values = _
Range(Cells(UserRow, 2), Cells(UserRow, 6))
'titlul graficului se află în prima celulă a rândului curent
[Link] = Cells(UserRow, 1).Text
[Link] = True
End If
End Sub
Exemplu2: Cu datele din tabelul de mai jos creaţi un grafic coloană care să evidenţieze valorile
peste medie şi sub medie. Valorile sub medie să fie reprezentate cu coloane în jos.

Sub creeaza_si_formateaza_grafic()
Dim grafic As Chart
Dim seria As Series
Dim axaX, axaY As Axis
Dim i As Integer, j As Integer
Dim media, sumaMediilor As Double
Set grafic = [Link]
[Link] Source:=Range("'Stoc'!$A$1:$D$5")
[Link] = xlColumnClustered
[Link] = xlRows
sumaMediilor = 0
For Each seria In [Link]
'calculul mediei pe fiecare serie si adunarea in variabila sumaMediilor
sumaMediilor = sumaMediilor + [Link]([Link])
Next seria
'calculul mediilor tuturor datelor din serii
media = sumaMediilor / [Link]
Set axaX = [Link](xlCategory)
Set axaY = [Link](xlValue)
With axaX
'afisare titlu pentru axa X
.HasTitle = True
87
.[Link] = "Trimestrul 1"
'etichetele axei X sunt scrise in partea de jos a graficului
.TickLabelPosition = xlTickLabelPositionLow
'afisare linii de grila majore pentru axa X
.HasMajorGridlines = True
'formatare axa X cu dimensiune medie si culoare rosie
.[Link] = xlMedium
.[Link] = RGB(255, 0, 0)
End With

With axaY
'afisare titlu pentru axa Y
.HasTitle = True
.[Link] = "Stoc"
'axa X va intersecta axa Y in valoarea media
.CrossesAt = media
'afisare linii de grila majore pentru axa Y
.HasMajorGridlines = True
'valoarea minima indicata pentru scara Y este 0
.MinimumScale = 0
'valoarea maxima indicata pentru scara Y este maximul valorilor domeniului, rotunjit
la
'10
.MaximumScale
[Link]([Link](Range("B2:D5")), -1)
End With
'afisarea si formatarea tilului graficului
[Link] = True
[Link] = "Situatia stocurilor pe trimestrul 1"
[Link] = 16
End Sub

6.12 Exportul unui grafic în format imagine

În multe cazuri e utilă exportarea unui grafic într-un fişier de tip imagine. O variantă este folosirea
capturii de ecran, o altă variantă fiind cea de a scrie un simplu cod VBA.
Metoda Export a obiectului Chart ne ajută să salvăm un grafic într-un fişier imagine. Metoda are
următoarele argumente:
 Filename – numele fişierului de tip String
 FilterName – formatul fişierului; argument opţional
 Interactive – are valoarea True dacă dorim afişarea unei ferestre de dialog pentru salvare şi False
în caz contrar; valoarea implicită este False

Exemplu: Exportaţi graficul activ în fişierul [Link].


[Link] FileName:= "C:\[Link]", FilterName:="GIF"
Fişierele imagine pot fi GIF, JPEG sau PNG.
Observaţie: metoda Export poate eşua în caz că programul Excel nu e instalat cu filtrele de export
grafic.

6.13 Evenimente asociate graficelor


88
În Excel, graficele au următoarele evenimente asociate:
Eveniment Când se declanşează evenimentul
Activate Evenimentul apare atunci când un grafic este activat.
BeforeDoubleClick Apare la dubluclic pe un grafic aflat pe o foaie de lucru. Acest eveniment
apare înainte de acţiunea dubluclic.
BeforeRightClick Apare la clic dreapta pe un grafic aflat pe o foaie de lucru. Acest eveniment
apare înainte de acţiunea clic dreapta.
Calculate Apare atunci când date noi sau modificate sunt afişate pe grafic.
Deactivate Un grafic este deselectat.
DragOver Apare atunci când un domeniu de celule este dus (acţiunea drag) deasupra
unui grafic.

DragPlot Apare atunci când un domeniu de celule este dus şi lăsat prin tragere
(acţiunea drag and drop) deasupra unui grafic.
MouseDown Apare atunci când butonul mouse-ului este apăsat deasupra unui grafic.
MouseMove Apare atunci când un indicatorul mouse-ului este deplasat deasupra unui
grafic.
MouseUp Apare atunci când butonul mouse-ului este eliberat deasupra unui grafic.
Resize Apare atunci când obiectul grafic este redimensionat.
Select Apare atunci când un element al graficului este selectat.
SeriesChange Apare atunci când valorile afişate de grafic se modifică.

Exemplu1: Afişarea unui ChartTip.


Pentru datele din tabelul de mai jos este creat un grafic tip coloană. Pe grafic este desenată o casetă
de text în care vor apare informaţii aflate în celulele foii de lucru, atunci când utilizatorul
deplasează mouse-ul deasupra coloanelor graficului.

Private Sub Chart_MouseMove(ByVal Button As Long, ByVal Shift As Long, _


ByVal × As Long, ByVal Y As Long)
Dim ElementId As Long
Dim arg1 As Long, arg2 As Long
Dim NewText As String
On Error Resume Next

89
[Link] X, Y, ElementId, arg1, arg2
If ElementId = xlSeries Then
NewText = Sheets("Sheet1").Range("Comments").Offset(arg2, arg1)
Else
NewText = ""
End If
[Link](1).[Link] = NewText
End Sub

Această procedură monitorizează toate deplasările mouse-ului deasupra unui grafic. Coordonatele
mouse-ului sunt conţinute în variabilele X şi Y care sunt pasate procedurii prin argumentele sale.
Elementul principal în această procedură este metoda GetChartElement. Dacă valoarea lui
ElementID este xlSeries, atunci indicatorul mouse-ului este deasupra unei serii de date. Variabila
NewText conţine informaţii din anumite celule, informaţii care vor apare ca text în căsuţa de text.

Exemplu2: Derularea datelor unui grafic.


În exemplul următor tabelul are peste 5219 de rânduri cu date culese în 20 de ani pentru două
produse. În fişier sunt definite mai multe nume:
 Start – numele celulei F1
 NrZile – numele celulei F2
 Pas – numele celulei F3
 Date – numele formulei: =OFFSET(Sheet1!$A$1,Start,0,NrZile,1)
 ProdA – numele formulei: =OFFSET(Sheet1!$B$1,Start,0,NrZile,1)
 ProdB – numele formulei: =OFFSET(Sheet1!$C$1,Start,0,NrZile,1)

Formulele de mai sus indică domeniile pentru Data, Produs A şi Produs B între rândul egal cu
valoarea start şi rândul egal cu valoarea nrzile.

Fiecare funcţie SERIES codul scris pentru grafic foloseşte aceste nume:
 seria pentru Produsul A are formula:
=SERIES(Sheet1!$B$1;'grafic_derulat.xlsm'!Date;' grafic_derulat.xlsm'!ProdA;1)
 seria pentru Produsul B are formula:
=SERIES(Sheet1!$C$1; 'grafic_derulat.xlsm'!Date; 'grafic_derulat.xlsm'!ProdB;2)
 valorile de pe axa X au formula:
='grafic_derulat.xlsm'!Date
90
Folosirea numelor permite utilizatorului folosirea unor valori pentru Start şi NrZile şi afişarea
datelor corespunzătoare pe grafic.
Codul VBA care permite derularea graficului este activat cu ajutorul butonului Start/Stop.

Public AnimatieInDerulare As Boolean

Sub AnimateChart()
Dim ValStart As Long, domeniu As Long
If AnimatieInDerulare Then
AnimatieInDerulare = False
End
End If
AnimatieInDerulare = True
ValStart = Range("Start")
For domeniu = ValStart To 5219 - Range("NrZile") Step Range("Pas")
Range("Start") = domeniu
DoEvents
Next domeniu
AnimatieInDerulare = False
End Sub

Procedura AnimateChart foloseşte variabila publică AnimatieInDerulare pentru a vedea dacă


derularea trebuie oprită sau pornită. Derularea rezultă din ciclul în care domeniul valorilor pentru
serii şi valorile axei X sunt modificate (datorită modificării datei de start). Astfel graficul este
actualizat continuu cu o nouă dată de start. Pasul determină în acest caz cât de repede (valoare
mare) va fi derulat graficul.

91
7. Tabele pivot
Tabelele pivot sunt o componentă esenţial în lucrul cu programul Excel. Acestea au apărut în Excel
5 şi de atunci au fost dezvoltate în versiunile următoare. Tabelele pivot reprezintă un element
esenţial în centralizarea datelor.
7.1 Noutăţi aduse tabelelor pivot în Excel 2007-2010
În Excel 2007-2010 au fost aduse următoarele îmbunătăţiri în lucrul cu tabelele pivot:
 Pe un tabel pivot pot fi introduse acum mai multe rânduri şi coloane, mai multe câmpuri
(16000, faţă de 255 în Excel 2003)
 Posibilitatea de a aplica un filtru pe etichete (de ex. afişarea doar a etichetelor ce conţin un
anume cuvânt)
 Posibilitatea de a aplica un filtru valorilor (de ex. afişaţi doar produsele care au vânzări
mai mari de 100000)
 Posibilitatea de a efectua formatare condiţionată pe datele tabelului pivot (de exemplu
afişarea barelor de date)
 Persistenţa formatărilor pentru graficele pivot – acestea îşi păstrează formatările şi după
actualizare (refresh)
 Stiluri – a fost creată o galerie de stiluri pentru a face ca un tabel pivot să arate foarte bine.
Observaţie: tabelele pivot din Excel 2007 nu sunt compatibile cu versiunile anterioare de Excel. În
cazul în care creaţi tabele pivot pentru alţii, folosiţi salvarea în format compatibil versiunii Excel
97-2003.
7.2 Crearea unui tabel pivot cu ajutorul unei macrocomenzi
Exemplu: Într-o foaie de lucru Excel avem un tabel cu datele referitoare la vânzările pe diverse
categorii în mai multe ţări. Tabelul conţine următoarele coloane: Data, Categoria, Tara si Vanzari.

92
Pentru crea un tabel pivot simplu, înregistrăm o macrocomandă cu ajutorul căreia construim un
tabel pivot care va următoarea structură:
 Tara: câmp în zona de pagină (PageField)
 Categoria: câmp în zona de rând (RowField)
 Vanzari: câmp în zona de valori (DataField)
Sub MacroPivot()
[Link]
[Link](SourceType:=xlDatabase, SourceData:= _
"Echipamente!
R1C1:R53C4",Version:=xlPivotTableVersion10).CreatePivotTable _
TableDestination:="Sheet3!R3C1",TableName:="PivotTable1",
DefaultVersion _:=xlPivotTableVersion10
Sheets("Sheet1").Select
Cells(3, 1).Select
With [Link]("PivotTable1").PivotFields("Categoria")
.Orientation = xlRowField
.Position = 1
End With
With [Link]("PivotTable1").PivotFields("Tara")
.Orientation = xlPageField
.Position = 1
End With
[Link]("PivotTable1").AddDataField [Link]( _
"PivotTable1").PivotFields("Vanzari"), "Sum of Vanzari", xlSum
[Link]("PivotTable1").DisplayFieldCaptions = False
End Sub
Dacă executaţi acest macro, va produce probabil o eroare. Observaţi că numele foii de lucru nou
create este Sheet1, iar dacă aceasta există deja, macro-ul va da o eroare.
Examinând codul VBA scris de macrocomandă, se observă câteva elemente utile:
 PivotCaches – colecţia de obiecte PivotCache dintr-un fişier (sursa de datele utilizată de
tabelul pivot se păstrează într-o zonă cache; o dată creată această zonă, şi alte tabele pivot o
pot accesa)
 PivotTables – colecţia de obiecte PivotTable dintr-o foaie de lucru
 PivotFields – colecţia de câmpuri a unui obiect PivotTable
 PivotItems – colecţia de elemente individuale din cadrul unui câmp
 CreatePivotTable – o metodă care creează un tabel pivot folosind datele din cache
 AddDataField – o metodă de a adăuga câmpuri în zona de date (Values) a tabelului pivot
93
7.3 Simplificarea codului scris de macrocomanda
Codul scris de macrocomandă poate fi simplificat astfel încât să fie mai uşor de înţeles şi mai puţin
sensibil la erori:
Sub CreeazaPivot()
Dim PTCache As PivotCache
Dim PT As PivotTable
' creeaza cache
Set PTCache = [Link](SourceType:=xlDatabase, _
SourceData:=Range("A1").CurrentRegion)
'insereaza o noua foaie pentru pivot
[Link]
'creeaza tabelul pivot
Set PT = PTCache. CreatePivotTable (TableDestination :=Active Sheet.
Range("A3"), _
DefaultVersion:=xlPivotTableVersion12)
'alta varianta de a crea tabelul pivot
'Set PT = [Link](PivotCache:=PTCache, _
'TableDestination:=Range("A3"), DefaultVersion:=xlPivotTableVersion12)
'introduce campuri pe pivot
With PT
.PivotFields("Tara").Orientation = xlPageField
.PivotFields("Tara").Position = 1
.PivotFields("Categoria").Orientation = xlRowField
.PivotFields("Categoria").Position = 1
.AddDataField [Link]("Vanzari"), "Total vanzari", xlSum
'dezactiveaza afisarea denumirii campurilor
.DisplayFieldCaptions = False
End With
End Sub
Tabelul pivot rezultat este următorul:

7.4 Zona cache a pivotului (PivotCaches)


Zona cache a pivotului este o zonă tampon (buffer) în care se păstrează datele. Acţionează ca un
canal de comunicaţie între sursa de date şi tabelul pivot. În Excel 2007-2010 se pot crea zone cache
cu ajutorul metodei Create a colecţiei PivotCaches. Această zonă poate fi accesată de mai multe
tabele pivot care folosesc aceeaşi sursă de date. Acest lucru este mai eficient decât forţarea ca
fiecare tabel pivot să aibă propria sursă de date. Crearea unui tabel pivot pe o zonă cache poate fi
efectuată cu ajutorul metodei CreatePivotTable a unui obiectului de tip PivotCache
În exemplul anterior zona cache este creată cu ajutorul metodei Create a colecţiei PivotCaches.
Tabelul pivot este creat cu ajutorul metodei CreatePivotTable a colecţiei PivotCaches. Ultima

94
secţiune de cod foloseşte obiectul PivotTables şi adaugă câmpuri în zona de pagină, de rând şi zona
de date.

7.5 Colecţia PivotTables


O altă variantă de a crea tabele pivot este metoda Add a colecţiei PivotTables. Dacă zona cache este
deja creată şi dorim crearea unui al doilea tabel pivot, codul este următorul:
Sub AdaugaPivot()
Dim PTCache As PivotCache
Dim PT As PivotTable
'accesarea PivotCache-ului existent
Set PTCache = [Link](1)
'adaugarea unui nou pivot, în aceeaşi foaie
Set PT = [Link](PivotCache:=PTCache, _
TableDestination:=Range("D3"))
With PT
.PivotFields("Tara").Orientation = xlRowField
.PivotFields("Tara").Position = 1
.PivotFields("Categoria").Orientation = xlRowField
.PivotFields("Categoria").Position = 2
.AddDataField [Link]("Vanzari"), "Total vanzari", xlSum
'dezactiveaza afisarea denumirii campurilor
.DisplayFieldCaptions = False
End With
End Sub
7.6 Câmpurile tabelului pivot
Antetul unei coloane din tabelul cu datele sursă poartă numele de câmp. Atunci când câmpurile sunt
folosite în tabelul pivot, ele devin obiecte de tip PivotField şi fac parte din colecţia PivotFields a
obiectului PivotTable. Colecţia PivotFields conţine toate câmpurile sursei de date, precum şi
câmpurile calculate, adăugate de utilizator, nu doar câmpurile vizibile pe tabelul pivot. Adăugarea
câmpurilor pe tabelul pivot se poate face prin două metode:
 folosind metoda AddFields a obiectului PivotTable
 folosind metoda PivotFields şi stabilind prin proprietatea Orientation locul de dispunere a
câmpului
Exemplu: Următoarele două rânduri de cod realizează acelaşi lucru şi anume adăugarea câmpului
”Categoria” în zona de rând a tabelului pivot.
[Link](1).AddFields RowFields:=”Categoria”, AddToTable:=True
[Link](1).PivotFields("Categoria").Orientation = xlRowField
Cu ajutorul metodei AddFields pot fi introduse mai multe câmpuri de rând, coloană sau pagină.
Aceste câmpuri înlocuiesc câmpurile existente pe tabelul pivot dacă parametrul AddToTable nu e
stabilit la True. Metoda AddFields nu poate fi folosită pentru a adăuga sau înlocui câmpuri în zona
de date.
Dacă mai multe câmpuri sunt în aceeaşi zonă, proprietatea Position a obiectului PivotField defineşte
ierarhia în care acestea vor apărea.
Exemplu: În codul anterior, câmpul Tara si Categoria erau ambele dispuse în zona de rând, iar
afisarea acestora a fost stabilită cu valorile 1 şi respectiv 2 a proprietăţii Position.
.PivotFields("Tara").Position = 1
.PivotFields("Categoria").Position = 2

95
7.7 Modificarea funcţiei afişate de tabelul pivot
Pentru un tabel pivot creat deja, modificarea funcţiei din zona de date se face cu ajutorul proprietăţii
function a obiectului corespunzător de tip PivotField. Formatarea datelor afişate se poate efectua cu
ajutorul proprietăţii NumberFormat.
Sub ModificaFunctia()
Dim PTCache As PivotCache
Dim PT As PivotTable
'accesarea PivotCache-ului existent
Set PTCache = [Link](1)
'accesarea tabelui pivot existent, caruia dorim sa-i modificam functia
Set PT = [Link]("PivotTable4")
With [Link]("Total vanzari")
.Caption = "Media vanzarilor"
.Function = xlAverage
.NumberFormat = "0.00"
End With
End Sub
Observaţi că am modificat numele câmpului din Total vanzari în Media vanzarilor. Dacă vom
modifica ulterior această funcţie, accesul la acest câmp se va face cu noul nume - Media vanzarilor.
Funcţiile disponibile în tabelul pivot sunt următoarele:
Funcţia Descriere
xlAverage Media
xlCount Numărare
xlCountNums Numărare valori numerice
xlMax Maximum
Minimum
xlProduct Produs
xlStDev Deviaţia standard a unui eşantion
xlStDevP Deviaţia standard a unei populaţii
xlSum Suma
xlUnknown Nu e specificată nici o funcţie
xlVar Variaţia, bazată pe un eşantion
xlVarP Variaţia, bazată pe o populaţie
7.8 Câmpuri calculate
În tabelul pivot se pot introduce câmpuri noi, ca rezultat al unor calcule ce pot implica şi câmpurile
existente. De exemplu, dorim să introducem în tabelul pivot un câmp calculat cu numele Profit iar
formula de calcul este =10%*Vanzari.

96
Codul următor creeaza un tabel pivot pe o foaie nouă şi afişează vânzările totale şi profitul pe
fiecare ţară.
Sub PivotCampuriCalculate()
Dim PTCache As PivotCache
Dim PT As PivotTable
'accesarea PivotCache-ului existent
Set PTCache = [Link](1)
[Link]
'adaugarea unui nou pivot
Set PT = [Link](PivotCache:=PTCache, _
TableDestination:=Range("A3"))
With PT
With .PivotFields("Tara")
.Orientation = xlRowField
.Position = 1
End With
With .PivotFields("Vanzari")
.Orientation = xlDataField
.Position = 1
.NumberFormat = "#,### €"
.Caption = "Total vanzari"
End With
' calculeaza profitul (sterge campul daca acesta exista deja)
On Error Resume Next
.PivotFields("Profit").Delete
On Error GoTo 0
.[Link] Name:="Profit", Formula:="=10%*Vanzari"
' afiseaza profitul
With .PivotFields("Profit")
.Orientation = xlDataField
.Position = 2
.Caption = "Profit 10% din vanzari"
End With
'dezactiveaza afisarea denumirii campurilor
.DisplayFieldCaptions = False
End With
End Sub
Observaţie: O dată ce aţi calculat câmpul Profit, acesta este adăugat în cache şi poate fi folosit şi în
alte tabele pivot. Dacă doriţi să rulaţi de mai multe ori codul de mai sus, trebuie să ne asigurăm că
vom şterge câmpul Profit anterior (în caz contrar va genera o eroare, acesta existând deja) şi apoi îl
vom crea din nou. Instrucţiunea On Error asigură faptul că secvenţa de instrucţiuni va continua în
cazul în care câmpul Profit nu există.
7.9 Elemente ale câmpurilor tabelului pivot
Fiecare obiect de tip PivotField are o colecţie PivotItems asociată. Accesarea se face cu ajutorul
metodei PivotItems a obiectului PivotField. Această colecţie conţine valori unice ale câmpurilor. De
exemplu, câmpul Tara are ca valori unice: Anglia, Belgia, Danemarca, Franta, Germania, Irlanda,

97
Italia, Norvegia, Olanda, Portugalia, Spania. Aceste valori constituie colecţia PivotItems pentru
câmpul Tara.
7.10 Gruparea datelor
Datele pot fi grupate funcţie de elementele câmpurilor. De exemplu vânzările sunt coordonate pe
zone:
Zona 1: Anglia, Irlanda, Norvegia
Zona 2: Franta, Spania, Portugalia
Zona 3: Olanda, Belgia, Danemarca
Zona 4: Germania, Italia
O altă grupare utilă este dată de gruparea după data calendaristică şi afişarea totalului vânzărilor din
fiecare lună. Rezultatul grupării dorim să fie următorul:

În mod obişnuit, în Excel gruparea datelor poate fi efectuată manual, prin selecţia elementelor ce
vor fi grupate şi apelul comenzii Group din meniul rapid. În cazul grupării datelor calendaristice sau
a datelor numerice, comanda Group poate fi apelată direct, fără a mai selecta datele.

Codul VBA scris pentru gruparea datelor este următorul:


Sub GrupareDate()
Dim PTCache As PivotCache
Dim PT As PivotTable
Dim Rng As Range
Dim PF As PivotField
Dim Zona1, Zona2, Zona3, Zona4 As Range
'crearea zona cache noua, pentru a nu afecta celelalte tabele pivot
Set PTCache = [Link](SourceType:=xlDatabase, _
SourceData:=Range("A1").CurrentRegion)
[Link]
'adaugarea unui nou pivot
Set PT = [Link](PivotCache:=PTCache,
TableDestination:=Range("A3"))
'definire cu pivot
With PT
.PivotFields("Data").Orientation = xlRowField
.PivotFields("Tara").Orientation = xlColumnField
.AddDataField .PivotFields("Vanzari"), "Total vanzari", xlSum
'localizarea primei valori din campul Data
Set Rng = .PivotFields("Data").[Link](1, 1)
'gruparea datelor dupa luna
[Link] Start:=True, End:=True, Periods:=Array(False, False, False, False, _
True, False, False)
Set PF = .PivotFields("Tara")
98
Set Zona1 = [Link]([Link]("Anglia").[Link](0, 1), _
[Link]("Irlanda").[Link](0, 1), _
[Link]("Norvegia").[Link](0, 1))
[Link]
With .PivotFields("Tara2").PivotItems("Group1")
.Caption = "Zona 1"
.Position = 1
End With
Set Zona2 = [Link]([Link]("Franta").[Link](0, 1), _
[Link]("Spania").[Link](0, 1), _
[Link]("Portugalia").[Link](0, 1))
[Link]
With .PivotFields("Tara2").PivotItems("Group2")
.Caption = "Zona 2"
.Position = 2
End With
Set Zona3 = [Link]([Link]("Olanda").[Link](0, 1), _
[Link]("Belgia").[Link](0, 1), _
[Link]("Danemarca").[Link](0, 1))
[Link]
With .PivotFields("Tara2").PivotItems("Group3")
.Caption = "Zona 3"
.Position = 3
End With
Set Zona4 = [Link]([Link]("Germania").[Link](0, 1), _
[Link]("Italia").[Link](0, 1))
[Link]
With .PivotFields("Tara2").PivotItems("Group4")
.Caption = "Zona 4"

End With
[Link]("Tara").Orientation = xlHidden
'dezactiveaza afisarea denumirii campurilor
.DisplayFieldCaptions = False
'modifica numele implicit GrandTotal in Total
.GrandTotalName = "Total"
'aplica un stil
.TableStyle2 = "PivotStyleMedium2"
'nu se afiseaza totalurile de pe coloana
.ColumnGrand = False
'aplica o formatare conditionata ultimei coloane din tabelul pivot
.[Link](5).[Link]
End With
End Sub
În codul de mai sus gruparea se face cu ajutorul obiectului Range. În primul caz, în care au fost
grupate datele pe luni, am folosit instrucţiunea:
[Link] Start:=True, End:=True, Periods:=Array(False, False, False, False, _
True, False, False)
care stabileşte practic valorile cerute în mod obişuit de Excel în fereastra Grouping.

99
Valoarea True pentru Start şi End înseamnă că data de start este data cea mai mică găsită şi data de
final este data cea mai mare găsită. Gruparea se face după lună prin stabilirea valorii True pentru a
5-a valoare a tabloului Periods.
Pentru a grupa „manual” datele, în funcţie de zone, au fost selectate, cu ajutorul VBA, denumirile
ţărilor şi apoi grupate.
Observaţie: pentru a ajunge la celula ce urmează a fi selectată a fost folosită proprietatea
DataRange. Proprietatea DataLabel, ce era folosită în versiunile anterioare de Excel, nu
funcţionează pe Excel 2007-2010.

7.11 Eliminarea grupării datelor


Pentru a elimina gruparea datelor se foloseşte metoda Ungroup a unui obiect de tip Range. Pentru a
elimina gruparea creată anterior, se vor selecta domeniile cu numele câmpurilor Data şi Tara 2 şi se
va utiliza metoda Ungroup.
Sub AnulareGrupare()
Dim Rng1, Rng2 As Range
Set Rng1 = [Link](1).PivotFields("Data").DataRange
[Link]
Set Rng2 = [Link](1).PivotFields("Tara2").DataRange
[Link]
End Sub
7.12 Introducerea valorilor calculate în tabelele pivot
În cazul în care trebuie să facem calcule în tabelul pivot în care sunt implicate valori ale câmpurilor
(PivotItems) vom folosi metoda Add a colecţiei CalculatedItems. Valorile calculate nu por fi
folosite pe zone cache în care există grupări, din acest motiv e bine ca tabelul pivot ce conţine valori
calculate să fie creat pe o zonă cache nouă.
De exemplu, pentru datele anterioare trebuie să calculăm totalul de taxe plătite pe fiecare ţară.
Procentele aferente sunt următoarele:

Tara Taxe
aplicate
Anglia 21%
Belgia 18%
Danemarca 14%
Franta 22%
Germania 24%
Irlanda 17%
Italia 15%
Norvegia 9%

100
Olanda 11%
Portugalia 14%
Spania 15%
Codul ce calculează aceste taxe este următorul:
Sub CalculTaxe()
Dim PTCache As PivotCache
Dim PT As PivotTable
Dim Rng As Range
Dim PF As PivotField
Dim Zona1, Zona2, Zona3, Zona4 As Range
Dim FormulaText As String
'creare nou cache, pentru a nu avea conflicte cu eventualele grupari
Set PTCache = [Link](SourceType:=xlDatabase, _
SourceData:=Range("A1").CurrentRegion)
[Link]
'adaugarea unui nou pivot
Set PT = [Link](PivotCache:=PTCache,
TableDestination:=Range("A3"))
With PT
.PivotFields("Categoria").Orientation = xlRowField
.PivotFields("Tara").Orientation = xlColumnField
FormulaText = _ "=Anglia*21%+Belgia*18%+Danemarca*14%+Franta*22%
+Germania*24%+" & _
"Irlanda*17%+Italia*15%+Norvegia*9%+Olanda*11%+Portugalia*14%+Spania*15%"
.PivotFields("Tara").[Link] Name:="Taxe", Formula:=FormulaText
.AddDataField .PivotFields("Vanzari"), "Total vanzari", xlSum
.RowGrand = False
'dezactiveaza afisarea denumirii campurilor
.DisplayFieldCaptions = False
'modifica numele implicit GrandTotal in Total
.GrandTotalName = "Total"
'aplica un stil
.TableStyle2 = "PivotStyleMedium5"
End With
End Sub
Tabelul pivot rezultat este:

7.13 Ştergerea valorilor calculate în tabelele pivot


Pentru a şterge o valoare calculată, determinăm câmpul ce conţine acea valoare şi numele valorii şi
folosim metoda Delete.
Sub StergereCalculTaxe()
101
[Link](1).PivotFields("Tara").PivotItems("Taxe").Delete
End Sub

7.14 Grafice pivot


Graficele pivot au fost introduse pentru prima dată în Excel 2000. Acestea sunt grafice normale,
însă sunt legate de un tabel pivot. Dacă modificaţi structura tabelului pivot se va modifica automat
graficul şi similar, dacă modificaţi de pe grafic aranjarea câmpurilor, acest lucru va fi vizibil în
tabelul pivot asociat.
Exemplu: Pentru tabelul pivot alăturat dorim să contruim un grafic pivot de tip pie.

Codul de mai jos creează graficul pivot asociat tabelului:

Sub CreeazaGraficPivot()
Dim Sh As Shape
Dim gfPiv As Chart
Dim seria As Series
Set Sh = [Link](xlPieExploded)
Set gfPiv = [Link]
[Link] Source:=[Link](1).TableRange1
' ascunderea câmpurilor pivot
[Link] = False
' eliminarea legendei
[Link]
' stabilirea unui stil şi a titlului graficului
[Link] = 26
[Link] = "Total vanzari"
' adaugarea etichetelor si a procentelor
[Link] xlDataLabelsShowLabelAndPercent
' aplicarea unei culori pe suprafata graficului
[Link] = RGB(244, 192, 0)
' introducerea etichetelor si procentelor in interiorul sectorului aferent
[Link](1).[Link] = xlLabelPositionInsideEnd
' pozitionarea graficului pivot intr-un anumit domeniu
102
With Range("D3:K24")
[Link] = .Left
[Link] = .Top
[Link] = .Width
[Link] = .Height
End With
End Sub

Anexa Funcţii utile înVBA


Funcţii Descriere
Abs Returnează valoarea absolută a unui număr.
Array Returnează un obiect de tip variant ce conţine un tablou.
CBool Converteşte o expresie în tipul de date boolean.
CByte Converteşte o expresie în tipul de date byte.
CCur Converteşte o expresie în tipul de date currency.
CDate Converteşte o expresie în tipul de date data.
CDbl Converteşte o expresie în tipul de date double.
CDec Converteşte o expresie în tipul de date decimal.
Choose Selectează şi returnează o valoarea dintr-o listă de argumente.
Chr Converteşte un caracter în şir de caractere.
CInt Converteşte o expresie în tipul de date integer.
CLng Converteşte o expresie în tipul de date long.
CSng Converteşte o expresie în tipul de date single.
CStr Converteşte o expresie în tipul de date string.
CVar Converteşte o expresie în tipul de date variant.
Date Returnează data curentă.
DateAdd Adaugă un interval de timp unei date calendaristice.
DateDiff Returnează intervalul de timp între două date calendaristice.
103
DatePart Returnează o parte specificată a unei date calendaristice.
DateSerial Converteşte o dată calendaristică într-un număr serial.
DateValue Converteşte un şir de caractere într-o dată calendaristică.
Day Returnează ziua dintr-o dată calendaristică.
DoEvents Determină execuţia, astfel încât sistemul de operare poate procesa alte evenimente.
Error Returnează un mesaj de eroare corespunzător numărului erorii.
Format Returnează o expresie într-un anumit format.
FormatCurrency Returnează o expresie formatată cu simbolul monetar implicit al sistemului.
FormatDateTime Returnează o expresie formatată ca dată sau oră.
FormatNumber Returnează o expresie formatată ca număr.
FormatPercent Returnează o expresie formatată ca procent.
Hour Returnează ora dintr-o dată calendaristică.
InputBox Afişează o casetă de dialog în care utilizatorul poate introduce informaţii.
InStr Returnează poziţia unui şir de caractere din alt şir de caractere.
InStrRev Returnează poziţia unui şir de caractere din alt şir de caractere, de la sfârşitul şirului.
Int Returnează partea întreagă a unui număr.
IsArray Returneată True dacă o variabilă e un array.
IsDate Returneată True dacă o variabilă e de tip data.
IsEmpty Returneată True dacă o variabila nu a fost iniţializată.
IsError Returnează True dacă expresia este o eroare.
IsNull Returnează True dacă expresia conţine o valoare Null.
IsNumeric Returnează True dacă expresia este numerică.
IsObject Returnează True dacă expresia este un obiect.
LBound Returnează primul indice al unui array.
LCase Returnează un şirul de caractere convertit la litere mici.
Left Returnează un anumit număr de caractere de la începutul şirului de caractere.
Len Returnează lungimea şirului de caractere.
LTrim Returnează o copie a şirului de caractere ce nu conţine spaţii la începutul şirului.
Mid Returnează un număr de caractere din interiorul unui şir de caractere.
Minute Returnează minutele dintr-o dată calendaristică.
Month Returnează luna dintr-o dată calendaristică.
MonthName Returnează numele lunii dintr-o dată calendaristică ca şir de caractere.
MsgBox Afişează o casetă de mesaj.
Now Returnează data şi ora curentă a sistemului.
QBColor Returnează codul de culoare RGB (roşu, verde, albastru).
RGB Returnează un număr ce reprezintă valoarea RGB a unei culori.
Right Returnează un anumit număr de caractere de la sfârşitul şirului de caractere.
Round Returnează numărul rotunjit.
RTrim Returnează o copie a şirului de caractere ce nu conţine spaţii la sfârşitul şirului.
Second Returnează secundele dintr-o dată calendaristică.
Sqr Returnează rădăcina pătrată a unui număr.
Str Returnează şirul de caractere al unui număr.
StrComp Returnează o valoare ce indică rezultatul comparării şirurilor de caractere.
String Returnează un caracter repetat sau un şir.
StrReverse Returnează şirul de caractere inversat.
Switch Evaluează o listă de expresii booleene şi returnează valoarea asociată primei expresii
adevărate.
Time Returnează ora, minutele şi secundele curente a sistemului.
Timer Returnează numărul de secunde de la miezul nopţii până la ora curentă.
104
TimeSerial Returnează timpul pentru ora, minutul şi secunda specificată.
TimeValue Converteşte un şir de caractere într-un număr serial.
Trim Returnează un şir de caractere fără spaţii la începutul şi la sfârşitul şirului.
TypeName Returnează un şir cu descrierea tipului de dată a unei variabile.
UBound Returnează ultimul indice al unui array.
UCase Returnează un şirul de caractere convertit la majuscule.
Val Returnează numărul dintr-un şir de caractere.
VarType Returnează o valoare ce indică subtipul unei variabile.
Weekday Returnează un număr de indică în a câta zi din săptămână este o anumită dată
calendaristică.
WeekdayName Returnează numele zilei din săptămână pentru o anumită dată calendaristică.
Year Returnează anul pentru o dată calendaristică.

Instrucţiuni Acţiune
AppActivate Activeată o fereastră de aplicaţie.
Call Apelează altă procedură.
Const Declară o constantă.
Dim Declară o variabilă şi tipul său de date (opţional).
Do-Loop Ciclează un set de instrucţiuni.
End Dacă este folosit singur conduce la închiderea programului. Folosit împreună cu If,
With, Sub, Function, Property, Type, sau Select determină închiderea blocului.
Enum Declară o enumerare.
Erase Reiniţializează un array-
Error Simulează o anumită eroare.
Event Declară un eveniment definit de utilizator.
Exit Do Determină ieşirea dintr-un ciclu Do-Loop.
Exit For Determină ieşirea dintr-un ciclu For-Next.
Exit Function Determină ieşirea din funcţie.
Exit Sub Determină ieşirea din procedură.
For Each-Next Ciclează un set de instrucţiuni pentru fiecare membru al mulţimii de obiecte.
For-Next Ciclează un set de instrucţiuni pentru de un anumit număr de ori.
Function Declară numele şi argumentele funcţiei.
GoTo Transferă execuţia către o anumită instrucţiune dintr-o procedură.
If-Then-Else Verifică o expresie şi, funcţie de valoarea sa de adevăr, determină următoarele
instrucţiuni.
On Error Gives specific instructions for what to do in the case of an error
On…GoSub Ramuri a unei condiţii.
On…GoTo Ramuri a unei condiţii.
Option Explicit Forţează declararea explicită a variabilelor.
Option Private Stabileşte un modul ca fiind privat.
Private Declară o variabilă sau un array local.
Public Declară o variabilă sau un array public.
RaiseEvent “Aruncă” un eveniment definit de utilizator.
Rem Comentariu (la fel ca şi caracterul apostrof)
Resume Reia execuţia în momentul terminării rutinei de tratare a erorii.
Select Case Verifică o expresie şi, funcţie de valoarea sa de adevăr, determină următoarele
instrucţiuni.
Set Asignează referinţa unui obiect unei variabile sau proprietăţi.
Static Declară o variabilă ca fiind statică.
105
Stop Determină o “pauză” pentru program.
Sub Declară numele şi argumentele unei proceduri.
While…Wend Ciclează un set de instrucţiuni atât timp cât o condiţie rămâne adevărată.
With Stabileşte o serie de proprietăţi pentru un obiect.

106

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