Excel VBA
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.
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.
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 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.
Î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.
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ă.
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 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).
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
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
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.
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
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:
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
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
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 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)
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
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
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
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)
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)
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ă:
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
Î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"))
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
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.
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
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
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.
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
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.
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.
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.
56
Spinner Un contor care permite limite minime, maxime şi
Buton de incrementare/ modificări incrementale
decrementare
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ă.
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.
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ă.
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 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ă).
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.
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.
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ă.
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ă.
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:
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.
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.
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"
75
5.4 Inserarea unei coloane cu valori calculate
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:
Exemplu: În tabelul din exemplul anterior afişaţi rândul de total şi afişaţi suma valorilor pe
coloanele Vanzari şi TVA:
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
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.
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.
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.
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
Î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
î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
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
Î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
Î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
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ă.
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.
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.
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
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:
94
secţiune de cod foloseşte obiectul PivotTables şi adaugă câmpuri în zona de pagină, de rând şi zona
de date.
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.
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.
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:
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
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