Documente Academic
Documente Profesional
Documente Cultură
SUPORT DE CURS
CURS EXCEL VBA INFOTIM ETA2U TRAINING CENTER
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
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ă
Teodora Frunză 5/105
CURS EXCEL VBA INFOTIM ETA2U TRAINING CENTER
Obs: Când înregistraţi un macro, Excel-ul va insera automat codul VBA într-un modul.
Obs: nu puteţi elimina module asociate fişierului (ThisWorkbook) sau foilor (Sheet1, etc.).
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.
stânga; Page Layout / Page Setup / Footer şi introduceţi numărul paginii curente
în dreapta.
Pas 5: Se opreşte înregistrarea apăsând butonul Stop Recording de pe bara de stare, din
fila Developer sau View.
Pas 3: Delete.
Pas 2: În fişierul Personal.xlsb 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 Personal.xlsb.
Pas 5: Ascundem fişierul Personal.xlsb: alegem View / Hide.
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.
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ă.
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.
Î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.
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.
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.
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.
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 Book1.xlsx se face astfel:
Application. Workbooks("Book1.xlsx")
Vă referiţi astfel la fişierul Book1.xlsx 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 Book1.xlsx, veţi proceda astfel:
Application.Workbooks("Book1.xlsx").Worksheets("Sheet1")
Mai mult, dacă doriţi să ajungeţi în celula A1 din foaia Sheet1 din fişierul Book1.xlsx,
scrieţi următorul cod:
Application.Workbooks("Book1.xlsx").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.
veţi specifica între ghilimele calea şi numele fişierului. Dacă nu specificaţi calea, fişierul va fi
salvat în directorul curent de lucru.
Exerciţii:
- Creaţi trei fişiere (workbooks.add)
- Afişaţi numărul fişierelor deschise (workbooks.count)
- 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 (activeworkbook.close)
- Afişaţi numărul fişierelor deschise (workbooks.count)
- 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 (activeworkbook.save)
- Salvaţi celălalt fişier cu comanda Save As (activeworkbook.saveas(“C:\info.xlsx”) )
- Închideţi toate fişierele (workbooks.close)
- Deschideţi cele două fişiere salvate
Exemple:
1) Inseraţi o nouă foaie de calcul:
Worksheets.Add
2) Inserarea unei noi foi de calcul înaintea foii Sheet3:
worksheets.Add before:=sheets("Sheet3")
sau
sheets.Add before:=sheets("Sheet3"), type:= xlWorksheet
3) Inserarea unei noi foi de grafic după foaia Sheet1:
sheets.Add after:=sheets("Sheet1"), type:= xlChart
sau
charts.Add after:=sheets("Sheet1")
4) Inserarea a două foi de calcul la sfârşit:
sheets.Add after:=sheets(sheets.count), type:= xlWorksheet
sau
worksheets.Add after:=sheets(sheets.count)
foaie.Delete
unde:
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.
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(Sheets.Count)
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”)
Exemplu: Vizualizaţi foaia Sheet2 înainte de tipărire astfel încât utilizatorul să aibă posibilitatea
de a modifica marginile paginii:
Sheets(“sheet2”).PrintPreview
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
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 A3:C3:
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:
ActiveCell.Value = 5
sau
ActiveCell.Range("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:
ActiveCell.Range("B1") = 20
8) Introduceţi în celula din dreapta şi un rând mai jos faţă de celula activă valoarea 8:
ActiveCell.Range("B2") = 8
9) Coloanele corespunzătoare domeniului "A2:C4"formataţi-le cu un font de culoare roşie.
Range("A2:C4").EntireColumn.Font.Color=RGB(255,0,0)
10) Rândurile corespunzătoare domeniului "A2:C4"formataţi-le cu un font de culoare verde.
Range("A2:C4").EntireRow.Font.Color=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").Interior.Color=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").Interior.Color=RGB(255,255,0)
13) Regiunea curentă, în care se găseşte celula C3 va fi formatată cu o culoare roz.
Range("C3").CurrentRegion.Interior.Color=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
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:
obiect.Cells(rowIndex, columnIndex)
obiect.Cells(cellIndex)
obiect.Cells
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").Cells.Font.Size = 14
5) Goliţi de conţinut toate celulele de pe foaia activă:
ActiveSheet.Cells.ClearContents
6) Introduceţi în celula activă valoarea 5:
ActiveCell = 5
sau
ActiveCell.Cells(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:
ActiveCell.Cells(1,2) = 20
8) Introduceţi în celula din dreapta şi un rând mai jos faţă de celula activă valoarea 8:
ActiveCell.Cells(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.
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.
Sintaxa:
obiect.Offset(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:
ActiveCell.Value = 10
sau
ActiveCell.Offset(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:
ActiveCell.Offset(-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
Proprietăţile Rows şi Columns a obiectelor de tip Worksheet sau Range returnează un obiect de
tip Range.
Sintaxa:
obiect.Rows(rowIndex)
obiect.Columns(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).Font.Size = 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").Font.Size = 10
4) Ştergeţi coloana E:
Columns("E").Delete
2.5 Formule
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).
Notaţia R1C1
În mod obişnuit, Excel-ul foloseşte notaţia A1, adică fiecare celulă e identificată cu ajutorul literei
corespunzătoare coloanei şi a numărului corespunzător rândului. Pe lângă această notaţie, Excel
foloseşte şi notaţia R1C1, unde R – rândul şi C – coloana. Astfel, R1C1 înseamnă $A$1, R2C1 e
totuna cu $A$2, iar R3C7 este $G$3.
Puteţi modifica modul de afişare, astfel încât să se folosească notaţia R1C1 din butonul Excel /
Excel Options / Formulas şi bifaţi opţiunea R1C1 reference style. Veţi observa numerotarea cu
numere a coloanelor, precum şi modificarea în noua notaţie a adreselor celulelor.
Acest mod de adresare a celulelor este deosebit de util pentru adrese absolute. În cazul folosirii
adreselor relative, se folosesc paranteze pentru a preciza numărul de rânduri sau coloane relativ la
poziţia actuală. Astfel, R[-1]C[2] înseamnă celula aflată deasupra cu un rând (observaţi -1 după R)
şi două coloane mai în dreapta (observaţi numărul 2 de după C).
Obs: Atunci când nu se precizează nici un număr după R sau C, înseamnă că nu se modifică
rândul sau coloana.
De exemplu, dacă sunteţi în C2 (R2C3), următoarele formule au acelaşi efect:
Notaţia A1(standard) Notaţia R1C1
=A1+1 =R[-1]C[-2]+1
=C1+1 =R[-1]C+1
=B2+1 =RC[-1]+1
=$A$1+1 =R1C1+1
=$A1+1 =R[-1]C1+1
=A$1+1 =R1C[-2]+1
=SUM(A1:A10) =SUM(R[-1]C[-2]: R[8]C[-2])
=SUM($A$1: $A$10) =SUM(R1C1:R10C1)
Exemplu: În tabelul următor, folosiţi formule în notaţia R1C1 pentru a calcula Valoare, Valoare
TVA, Valoare cu TVA şi Totalul pentru valoare, valoare TVA şi valoare cu TVA.
3. Instrucţiuni VBA
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 -2.147.483.648 şi 2.147.483.647
între -3.402823E38 şi –1.401298E-45 (pentru valori negative); între
Single
1.401298E-45 şi 3.402823E38 (pentru valori pozitive)
între -1,79769313486232E308 şi -4,94065645841247E-324 (negative
Double val pentru valori negative); între 4,94065645841247E-324 şi
1,79769313486232E308 (pentru valori pozitive)
Currency între -922.337.203.685.477,5808 şi 922.337.203.685.477,5807
+/–79.228.162.514.264.337.593.543.950.335 fără zecimale;
Decimal +/–7.9228162514264337593543950335 cu 28 de zecimale după
virgulă
Date Între 1.Ian. 100 şi 31.Dec. 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)
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
Exemple:
Const DataStart As Date = #1/8/2009#
Const OraStart As Date= #12:00:00#
Const trimestre as Integer = 4
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”
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)
b) Instrucţiunea MsgBox
Permite afişarea unui mesaj, într-o casetă de dialog, utilizatorul putând alege un buton din cele
afişate.
Sintaxa:
MsgBox prompt, [Butoane ], [ Titlu ]
unde:
prompt - textul afişat în casetă
butoane - suma valorilor care specifică numărul şi tipul butoanelor afişate, şi tipul icoanei.
titlu - titlul casetei
Tabel cu valorile butoanelor
Constante Valoare Elemente afişate, acţiune
VbOkOnly 0 Buton OK
VbOkCancel 1 Butoane OK şi Cancel
VbAbortRetryIgnore 2 Butoane Abort, Retry, Ignore
VbYesNoCancel 3 Butoane Yes, No, Cancel
VbYesNo 4 Butoane Yes, No
VbRetryCancel 5 Butoane Retry, Cancel
VbCritical 16 Icoana X
VbQuestion 32 Icoana ?
VbExclamation 48 Icoana !
VbInformation 64 Icoana I
VbDefaultButton1 0 Primul buton este selectat implicit
VbDefaultButton2 256 Al doilea buton este selectat implicit
VbDefaultButton3 512 Al treilea buton este selectat implicit
VbDefaultButton4 768 Al patrulea buton este selectat implicit
Exemplu. Să se afişeze anul calendaristic cu ajutorul instrucţiunii MsgBox. Data curentă se obţine
din data sistemului.
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ă.
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ă.
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:
vba.Date
vba.Time
vba.Now
Exemplu: Introduceţi în celula A1 data curentă, iar în B1 data şi ora curentă, iar în C1 ora
curentă:
Range(“A1”).Value = vba.Date
Range(“B1”).Value = vba.Now
Range(“C1”).Value = vba.Time
Funcţiile DateSerial şi TimeSerial - returnează data pentru anul, luna şi ziua specificate şi
respectiv ora pentru ora, minutele şi secundele precizate.
Sintaxa:
vba.DateSerial(year, month, day)
vba.TimeSerial(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
Funcţiile Day, Month, Year – returnează ziua, luna sau anul din data precizată.
Sintaxa:
vba.Day(data)
vba.Month(data)
vba.Year(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”) = vba.Day("25/08/2003")
Range(“B1”) = vba.Month("25/08/2003")
Range(“C1”) = vba.Year("25/08/2003")
Funcţii de text
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.
vba.Left(string, number)
vba.Right(string, number)
vba.Mid(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")= vba.Left(Range("A1"), 2)
Range("C1")= vba.Right(Range("A1"), 3)
Range("D1")= vba.Mid(Range("A1"), 3,3)
vba.Str(number)
unde:
number – numărul ce trebuie convertit
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
- 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
În tabelele următoare aveţi la dispoziţie codurile de fotmat pentru a vă crea propriile formatări:
- Date calendaristice: d – codul pentru ziua, m –codul pentru lună, y – codul pentru an
Pentru a afişa Utilizaţi acest cod
Luni sub forma 1–12 m
Luni sub forma 01–12 mm
Luni sub forma Ian–Dec mmm
Luni sub forma Ianuarie–Decembrie mmmm
Luni sub forma primei litere a lunii mmmmm
Zile sub forma 1–31 d
Zile sub forma 01–31 dd
Zile sub forma D–S ddd
Zile sub forma Duminică–Sâmbătă dddd
Ani sub forma 00–99 yy
Ani sub forma 1900–9999 Yyyy
Trimestrul sub forma unui număr între 1 şi 4 q
- Timp: h – codul pentru oră, m –codul pentru minut, s – codul pentru secundă
Pentru a afişa Utilizaţi acest cod
- Texte :
o > formatează textul cu majuscule
o < formatează textul cu minuscule
Exemple:
1) Afişaţi data şi ora curentă cu următoarele formate:
Range("A1") = vba.Format(Date,"Long Date", vbMonday)
Range("A2") = vba.Format(Date,"Short Date")
Range("A3") = vba.Format(Time,"Medium Time")
Range("A4") = vba.Format(Time,"Short Time")
Range("A5") = vba.Format(Date,"dddd, mmm d yyyy")
Range("A6") = vba.Format(Time,"h:m")
Range("A7") = "Trim " & vba.Format(Date,"q, mmm-yy")
Range("B1") = vba.Format(12345.678,"standard")
Range("B2") = vba.Format(12345.678,"fixed")
Range("B3") = vba.Format(12345.678,"currency")
Range("B3") = vba.Format(0.234,"percent")
Range("B4") = vba.Format(12345.678," #.###")
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:
vba.RGB(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:
Application.WorksheetFunction.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”)= Application.WorksheetFunction.Sum(Range("B1:B9"))
Range(“B11”)= Application.WorksheetFunction.Average(Range("B1:B9"))
Range(“B12”)= Application.WorksheetFunction.Count(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
...
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
Procedurile Visual Basic pot testa condiţii şi funcţie de rezultatele testului, să efectueze operaţii
diferite.
Instrucţiunea 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
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
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
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
Teodora Frunză 42/105
CURS EXCEL VBA INFOTIM ETA2U TRAINING CENTER
Instrucţiunea 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
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
Case Is >= 75
discount = 0.25
End Select
MsgBox "Discount: " & discount
End Sub
b) Structuri repetitive
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]
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 celula.Value > 30 And celula.Value < 50 Then
celula.Font.FontStyle = "Bold"
celula.Interior.Color = 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
mySheet.Protect "aaa", True, True, True
Next mySheet
End Sub
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
mySheet.Unprotect "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]
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 Worksheets.Count
Set foaie = Worksheets(i)
foaie.Protect "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.
Sub Comparare()
Dim i As Integer
Calculate
For i = 1 To Range("Nou").Cells.Count
If Range("Nou").Cells(i) <> Range("Vechi").Cells(i) Then
Range("Nou").Cells(i).Interior.Color = rgbYellow
Range ("Nou").Cells(i).Font.Color=rgbRed
End If
Next i
End Sub
Obs: Am folosit ştergerea rândurilor pornind de jos în sus, cu un pas negativ pentru for. Aceasta
este varianta corectă de ştergere a rândurilor. Încercaţi procedura de mai jos, unde parcurgerea
este de sus în jos şi observaţi diferenţa (de exemplu, când rândul 2 este şters, rândul 3 devine
noul rând 2, iar rândul 5 devine rândul 4, etc.)
Sub StergeRanduri2()
Dim rand As Long
For rand = 2 To 10 Step 2
Rows(rand).Delete
Next rand
End Sub
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
ActiveCell.Value = "Vanzari in " & "ziua de " & ziua(n) & " au fost de " &
vanzari(n) & " mii lei"
ActiveCell.Offset(1, 0).Activate
Next
End Sub
Sub scriere_date()
Application.ScreenUpdating = False
Dim n As Integer
For n = 1 To 1000
ActiveCell.Value = n
ActiveCell.Offset(1, 0).Activate
Application.StatusBar = "scrie randul " & n
Next
Application.StatusBar = ""
Application.ScreenUpdating = 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ă.
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
ActiveCell.Offset(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
ActiveCell.Offset(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
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
ActiveCell.Offset(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
ActiveCell.Offset(1, 0).Activate
Loop Until Month(data) <> Month(Date)
End Sub
Sub ProtejareFoi()
Dim foaie As Worksheet
Dim i As Integer
i=1
Do Until i > Worksheets.Count
Set foaie = Worksheets(i)
foaie.Protect "aaa", True, True, True
i=i+1
Loop
End Sub
3.5 Proceduri
O procedură este compusă dintr-o serie de instrucţiuni VBA şi se găseşte într-un modul VBA.
Un modul poate conţine oricâte proceduri.
O procedură poate avea argumente, folosite de instrucţiunile din componenţa acesteia.
Sintaxa:
Sub nume_procedura ([lista_argumente])
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 Salutari()
Dim informatia As String
informatia = "Salut"
'AfisareInformatii (informatia)
' sau
'Call AfisareInformatii(informatia)
' sau
Application.Run "AfisareInformatii", informatia
End Sub
Sub AfisareInformatii(mesaj)
Dim butoane as Integer
butoane = vbOKOnly + vbInformation
MsgBox Prompt:=mesaj, Buttons:=butoane
End Sub
Exemplu 2: Apelaţi procedura Weekend sau Zile_lucratoare funcţie de ziua din săptămână.
Sub principala()
Dim procedura As String
Select Case Weekday(Now)
Case 1, 7: procedura = "Weekend"
Case Else: procedura = "Zile_lucratoare"
End Select
Application.Run procedura
End Sub
Sub Weekend()
Sub Zile_lucratoare()
MsgBox "Azi e o zi lucratoare"
End Sub
Sub principal1()
Dim x As Integer
x = 10
Call calculeaza1(x)
MsgBox x
End Sub
Sub calculeaza1(a)
a = a * 10
End Sub
Sub principala2()
Dim x As Integer
x = 10
Call calculeaza2(x)
MsgBox x
End Sub
Sub calculeaza2(ByVal a)
a = a * 10
End Sub
3.6 Funcţii
O funcţie e similară unei proceduri în VBA, dar spre deosebire de procedură, funcţia returnează
o valoare. O funcţie este compusă dintr-o serie de instrucţiuni VBA, o instrucţiune obligatorie
fiind cea de asignare a unei valori numelui funcţiei. O funcţie, la fel ca şi o procedură poate avea
argumente, apelate prin valoare sau referinţă. Spre deosebire de o procedură, o funcţie poate fi
utilizată în calcule direct din Excel.
Sintaxa:
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.
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.
Apelul funcţiei din Excel poate fi făcut direct din celulă, prin formula =prima(D3,E3,F33) sau
eticheta Formulas / Insert Function.
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.
Sub Macro1()
' Macro1 Macro
Sheets("produse").Range("A1").Select
ActiveSheet.ShowDataForm
End Sub
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.
Următoarele controale nu se mai pot folosi în Excel 2007-2010: TextField, Combo List-
Edit, - Combo Drop – Down list, - Run Dialog.
Exemplu 1: În fişierul Salariaţi avem un tabel cu datele acestora: marca salariat, prenume, nume,
data angajării, funcţia, locaţia şi salariul. Creaţi o casetă de căutare care se conţină o listă derulantă
din care utilizatorul să selecteze marca angajatului şi, corespunzător, să se afişeze imediat numele
şi prenumele, locaţia şi salariul:
Tabelul angajaţi Caseta de căutare
Obs: Caseta de derulare introduce în celula legată indexul elementului selectat (de ex. 5). Pentru a
determina numele şi prenumele, locaţia sau salariul se foloseşte funcţia index. Astfel, dacă celula
legată de caseta de derulare este J2, tabelul salariaţi se află în domeniul A2:G38 şi coloana de
salarii este a 7-a, funcţia index ce determină salariul angajatului selectat este:
=INDEX($A$2:$G$38,$J$2,7).
Exemplu 2: Folosiţi controalele scroll şi spin pentru a realiza următorul calculator de credite:
Exemplu 3: Creaţi un calculator de credite pentru maşina, ca în imaginea de mai jos. Aveţi un
tabel cu tipul maşinii şi preţul corespunzător, pe care în folosiţi în cadrul calculatorului pentru
selectarea tipului maşinii. Adăugaţi o casetă de validare cu reducerea aplicată, un control de tip
scroll pentru valoarea reducerii, precum şi un control spin pentru numărul de ani.
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ă.
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
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 txt.Text
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) .Font.Name – stilul fontului;
Exemplu: txtnume.Font.Name = ”TimesNewRoman”
b) .Font.Bold – este o proprietate booleană ce stabileşte dacă textul este scris îngroşat;
Exemplu: txtnume.Font.Bold=True – scrie îngroşat
c) .Font.Italic – este o proprietate booleană ce stabileşte dacă textul este scris înclinat;
Exemplu: txtnume.Font.Italic=False – nu scrie înclinat
d) .Font.Size – este o proprietate cu valori întregi ce stabileşte dimensiunea textului;
Exemplu: txtnume.Font.Size=14 – textul este scris cu caractere de dimensiune 14
e) .Font.Underline – este o propietate booleană ce stabileşte dacă textul este subliniat.
Exemplu: txtnume.Font.Underline=True – textul este scris subliniat
Teodora Frunză 63/105
CURS EXCEL VBA INFOTIM ETA2U TRAINING CENTER
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.
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.
Teodora Frunză 64/105
CURS EXCEL VBA INFOTIM ETA2U TRAINING CENTER
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
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.
Teodora Frunză 65/105
CURS EXCEL VBA INFOTIM ETA2U TRAINING CENTER
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ă).
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
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.
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"
ListBox1.List = 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:
ListBox2.RowSource = "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:
numecontrol.AddItem 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:
numecontrol.Clear
Metoda RemoveItem
Metoda şterge un element specificat din listă:
numecontrol.RemoveItem 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
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
Teodora Frunză 69/105
CURS EXCEL VBA INFOTIM ETA2U TRAINING CENTER
Proprietatea Listindex determină poziţia în listă a elementului selectat. Dacă nu a fost selectat nici
un element, valoarea e -1.
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.
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ă.
- SheetSelectionChange: apare la selectarea unei celule sau a unui domeniu de pe orice foaie
din fişier
Aplicaţie practică:
1) Creaţi fişierul Formulare UserForm.xlsm
2) Introduceţi în prima foaie butoanele Introduceţi sesizarea şi Şterge sesizarea, ca în
imaginea următoare:
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.
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.
Numărul de rânduri dintr-un tabel poate fi aflat cu ajutorul proprietăţii Count a obiectului
ListRows, iar numărul de coloane cu aceeaşi proprietate a obiectului ListColumns.
Exemplu: Afişaţi numărul de rânduri şi coloane a tabelului din prima foaie. Scrieţi în celula M1
adresa rândului de antet a tabelului, iar în M2 adresa datelor tabelului, excluzând rândul de antet.
Ascundeţi săgeţile corespunzătoare filtrului.
Dim tabel As ListObject
Set tabel = Worksheets(1).ListObjects(1)
MsgBox “Tabelul are: ” & tabel.ListRows.Count & ” randuri”
MsgBox “Tabelul are: ” & tabel.ListColumns.Count & ” coloane”
Range("M1").Value = tabel.HeaderRowRange.Address
Range("M2").Value = tabel.DataBodyRange.Address
tabel.ShowAutoFilter = False
Exemplu: În prima foaie din fişier există un tabel ca cel de mai jos. Scrieţi procedura VBA de
inserare a unui rând nou la sfârşit. Completaţi acest rând cu următoarele date: (01/01/2009,
imprimanta, Danemarca, 200).
Private Sub IntroducereDate()
Dim tabel As ListObject
Dim rand As ListRow
Dim r As Range
Set tabel = Worksheets(1).ListObjects(1)
tabel.ListRows.Add
Set rand = tabel.ListRows(tabel.ListRows.Count)
Set r = rand.Range
r(1) = "01/01/2009"
r(2) = "imprimanta"
r(3) = "Danemarca"
r(4) = "200"
End Sub
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
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 = ActiveSheet.ListObjects(1)
tabel.ListColumns.Add
Set col_tva = tabel.ListColumns(tabel.ListColumns.Count)
Set col_vanzari =tabel.ListColumns(
tabel.ListColumns.Count - 1)
Set r = col_tva.Range
formula = "=" & tabel.Name & "[[#This Row],[" &
col_vanzari.Name & "]]*19% "
r(1).Value = "TVA"
r(2).FormulaR1C1 = formula
End Sub
Exemplu: În tabelul din exemplul anterior afişaţi rândul de total şi afişaţi suma valorilor pe
coloanele Vanzari şi TVA:
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 = ActiveSheet.ListObjects(1)
Set col_data = tabel.ListColumns(1)
Set col_vanzari = tabel.ListColumns(tabel.ListColumns.Count - 1)
Set r = col_data.Range
Set modif = col_vanzari.Range
For i = 1 To r.Count
If r(i).Value = "4/28/2006" Then
modif(i).Value = "1000"
End If
Next i
End Sub
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 = ActiveSheet.ListObjects(1)
tabel.TableStyle = "TableStyleLight10"
tabel.ListColumns(5).Delete
tabel.ListRows(3).Delete
End Sub
6. Grafice
Un grafic Excel este o sumă de obiecte, fiecare cu proprietăţile şi metodele sale. Din această
cauză, lucrul cu grafice din VBA poate fi mai dificil şi, din păcate, macro-comenzile nu sunt de
ajutor în Excel 2007-2010.
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
Exemplu 2: Modificaţi titlul pentru graficul din foaia Chart1 de tip grafic.
With Charts("Chart")
.HasTitle = True
ChartTitle. Text = "Vanzari"
End With
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 = ActiveSheet.Range("A1:C7")
Set MyChart = ActiveSheet.ChartObjects.Add(10, 10, 354, 210).Chart
MyChart.SetSourceData Source:=DataRange
MyChart.ChartType = xlColumnClustered
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()
Charts.Add after:=Worksheets("Sheet1")
ActiveChart.ChartType = 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 = ActiveSheet.Range("A1:C7")
Set MyChart = Charts.Add(, Worksheets("Sheet1"))
MyChart.SetSourceData Source:=DataRange
ActiveChart.ChartType = xlColumnClustered
End Sub
Sub ModificareTipGrafic2()
ActiveSheet.ChartObjects("Chart 1").Chart.ChartType = 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.
Exemplu1: Mutaţi graficul din Sheet1 într-o foaie de grafic cu numele Gf1.
Sub Grafic1()
Sheets("Sheet1").ChartObjects(1).Chart.Location 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 ActiveChart.Name
End If
Pentru a şterge o foaie de grafic trebuie să-i cunoaştem numele sau indexul. Comanda următoare
şterge foaia de grafic cu numele Chart1:
Charts("Chart1").Delete
Ştergerea tuturor foilor de grafic se face cu ajutorul comenzii:
ActiveWorkbook.Charts.Delete
Ştergerea foilor de grafic conduce la apariţia, pentru utilizator, a ferestrei următoare:
în care utilizatorul trebuie să confirme ştergerea. Dacă nu doriţi ca utilizatorului să-i apară
fereastra de confirmare, folosiţi următoarea secvenţă de comenzi:
Application.DisplayAlerts = False
ActiveWorkbook.Charts("Chart1")..Delete
Application.DisplayAlerts = True
Stabilirea modului de afişare (layout) se face cu ajutorul metodei Apply Layout a unui obiect de
tip Chart. Metoda are două argumente
Layout – specifică numărul modului de afişare, de la 1 la 10.
ChartType – specifică tipul graficului, una din valorile enumerării XlChartType;
argument opţional
Exemplu:
ActiveChart.ApplyLayout 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:
ActiveChart.ChartStyle = 30
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ă.
ActiveChart.SetElement msoElementChartTitleAboveChart
ActiveChart.SetElement 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 = ActiveSheet.Shapes.AddChart.Chart
' datele sursă pentru grafic
grafic1.SetSourceData Source:=Range("'Stoc'!$A$1:$A$5,'Stoc'!$E$1:$E$5")
' lăţimea şi înălţimea graficului
grafic1.ChartArea.Width = 400
grafic1.ChartArea.Height = 300
' tipul graficului
grafic1.ChartType = xlPieExploded
' stilul graficului
grafic1.ChartStyle = 26
' stabilirea unei culori ca fundal pentru titlu
grafic1.ChartTitle.Format.Fill.ForeColor.RGB = RGB(220, 230, 242)
' aplicarea unui aspect tridimensional graficului
With grafic1.ChartArea.Format.ThreeD
.Visible = msoTrue
.BevelTopType = msoBevelDivot
.BevelTopDepth = 12
.BevelTopInset = 32
End With
' stabilirea titlului graficului
grafic1.ChartTitle.Text = "Situatia stocurilor pe Trimestrul 1"
' rotirea graficului cu 45 de grade
grafic1.Rotation = 45
' eliminarea legendei
grafic1.Legend.Clear
' afişarea etichetelor de date şi a procentului
grafic1.ApplyDataLabels xlDataLabelsShowLabelAndPercent
End Sub
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 ActiveSheet.ChartObjects
With ChtObj.Chart
.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 ActiveWorkbook.Charts
With cht
.ChartType = xlLineMarkers
.ApplyLayout 3
.ChartStyle = 12
.ClearToMatchStyle
.SetElement msoElementChartTitleAboveChart
.SetElement msoElementLegendNone
.SetElement msoElementPrimaryValueAxisTitleNone
.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
=SERIES(Sheet1!$B$1, , budget.xlsx!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 Excel.Range)
Call UpdateChart
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
sumaMediilor = 0
For Each seria In grafic.SeriesCollection
'calculul mediei pe fiecare serie si adunarea in variabila sumaMediilor
sumaMediilor = sumaMediilor + WorksheetFunction.Average(seria.Values)
Next seria
'calculul mediilor tuturor datelor din serii
media = sumaMediilor / grafic.SeriesCollection.Count
With axaX
'afisare titlu pentru axa X
.HasTitle = True
.AxisTitle.Text = "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
.Border.Weight = xlMedium
.Border.Color = RGB(255, 0, 0)
End With
With axaY
'afisare titlu pentru axa Y
.HasTitle = True
.AxisTitle.Text = "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 = _
WorksheetFunction.RoundUp(WorksheetFunction.Max(Range("B2:D5")), -1)
End With
End Sub
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ă.
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
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
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.
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()
Sheets.Add
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"Echipamente!R1C1:R53C4", Version:=xlPivotTableVersion10).CreatePivotTable _
TableDestination:="Sheet3!R3C1", TableName:="PivotTable1", DefaultVersion _
:=xlPivotTableVersion10
Sheets("Sheet1").Select
Cells(3, 1).Select
With ActiveSheet.PivotTables("PivotTable1").PivotFields("Categoria")
.Orientation = xlRowField
.Position = 1
End With
With ActiveSheet.PivotTables("PivotTable1").PivotFields("Tara")
.Orientation = xlPageField
.Position = 1
End With
ActiveSheet.PivotTables("PivotTable1").AddDataField ActiveSheet.PivotTables( _
"PivotTable1").PivotFields("Vanzari"), "Sum of Vanzari", xlSum
ActiveSheet.PivotTables("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
Sub CreeazaPivot()
Dim PTCache As PivotCache
Dim PT As PivotTable
' creeaza cache
Set PTCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _
SourceData:=Range("A1").CurrentRegion)
'insereaza o noua foaie pentru pivot
Worksheets.Add
'creeaza tabelul pivot
Set PT = PTCache.CreatePivotTable(TableDestination:=ActiveSheet.Range("A3"), _
DefaultVersion:=xlPivotTableVersion12)
'alta varianta de a crea tabelul pivot
'Set PT = ActiveSheet.PivotTables.Add(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
Teodora Frunză 93/105
CURS EXCEL VBA INFOTIM ETA2U TRAINING CENTER
În exemplul anterior zona cache este creată cu ajutorul metodei Create a colecţiei PivotCaches.
Tabelul pivot este creat cu ajutorul metodei CreatePivotTable a colecţiei PivotCaches. Ultima
secţiune de cod foloseşte obiectul PivotTables şi adaugă câmpuri în zona de pagină, de rând şi
zona de date.
Sub AdaugaPivot()
Dim PTCache As PivotCache
Dim PT As PivotTable
'accesarea PivotCache-ului existent
Set PTCache = ActiveWorkbook.PivotCaches(1)
'adaugarea unui nou pivot, în aceeaşi foaie
Set PT = ActiveSheet.PivotTables.Add(PivotCache:=PTCache, _
TableDestination:=Range("D3"))
With PT
.PivotFields("Tara").Orientation = xlRowField
.PivotFields("Tara").Position = 1
.PivotFields("Categoria").Orientation = xlRowField
.PivotFields("Categoria").Position = 2
.AddDataField PT.PivotFields("Vanzari"), "Total vanzari", xlSum
'dezactiveaza afisarea denumirii campurilor
.DisplayFieldCaptions = False
End With
End Sub
Teodora Frunză 94/105
CURS EXCEL VBA INFOTIM ETA2U TRAINING CENTER
Sub ModificaFunctia()
Dim PTCache As PivotCache
Dim PT As PivotTable
'accesarea PivotCache-ului existent
Set PTCache = ActiveWorkbook.PivotCaches(1)
'accesarea tabelui pivot existent, caruia dorim sa-i modificam functia
Set PT = ActiveSheet.PivotTables("PivotTable4")
With PT.DataFields("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
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()
On Error GoTo 0
.CalculatedFields.Add 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ă.
Î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.
Sub GrupareDate()
Dim PTCache As PivotCache
Dim PT As PivotTable
Dim Rng As Range
Dim PF As PivotField
Dim Zona1, Zona2, Zona3, Zona4 As Range
'crearea zona cache noua, pentru a nu afecta celelalte tabele pivot
Set PTCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _
SourceData:=Range("A1").CurrentRegion)
Worksheets.Add
'adaugarea unui nou pivot
Set PT = ActiveSheet.PivotTables.Add(PivotCache:=PTCache,
TableDestination:=Range("A3"))
'definire cu pivot
With PT
.PivotFields("Data").Orientation = xlRowField
.PivotFields("Tara").Orientation = xlColumnField
.AddDataField .PivotFields("Vanzari"), "Total vanzari", xlSum
'localizarea primei valori din campul Data
Set Rng = .PivotFields("Data").DataRange.Cells(1, 1)
'gruparea datelor dupa luna
Rng.Group Start:=True, End:=True, Periods:=Array(False, False, False, False, _
True, False, False)
Set PF = .PivotFields("Tara")
Set Zona1 = Application.Union(PF.PivotItems("Anglia").DataRange.Cells(0, 1), _
PF.PivotItems("Irlanda").DataRange.Cells(0, 1), _
PF.PivotItems("Norvegia").DataRange.Cells(0, 1))
Zona1.Group
With .PivotFields("Tara2").PivotItems("Group1")
.Caption = "Zona 1"
.Position = 1
End With
Set Zona2 = Application.Union(PF.PivotItems("Franta").DataRange.Cells(0, 1), _
PF.PivotItems("Spania").DataRange.Cells(0, 1), _
PF.PivotItems("Portugalia").DataRange.Cells(0, 1))
Zona2.Group
With .PivotFields("Tara2").PivotItems("Group2")
.Caption = "Zona 2"
.Position = 2
End With
Set Zona3 = Application.Union(PF.PivotItems("Olanda").DataRange.Cells(0, 1), _
PF.PivotItems("Belgia").DataRange.Cells(0, 1), _
PF.PivotItems("Danemarca").DataRange.Cells(0, 1))
Zona3.Group
With .PivotFields("Tara2").PivotItems("Group3")
.Caption = "Zona 3"
.Position = 3
End With
Set Zona4 = Application.Union(PF.PivotItems("Germania").DataRange.Cells(0, 1), _
PF.PivotItems("Italia").DataRange.Cells(0, 1))
Zona4.Group
With .PivotFields("Tara2").PivotItems("Group4")
.Caption = "Zona 4"
.Position = 4
End With
PT.PivotFields("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
.DataBodyRange.Columns(5).FormatConditions.AddDatabar
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:
Rng.Group 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.
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.
Sub AnulareGrupare()
Dim Rng1, Rng2 As Range
Set Rng1 = ActiveSheet.PivotTables(1).PivotFields("Data").DataRange
Rng1.Ungroup
Set Rng2 = ActiveSheet.PivotTables(1).PivotFields("Tara2").DataRange
Rng2.Ungroup
End Sub
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 = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _
SourceData:=Range("A1").CurrentRegion)
Worksheets.Add
'adaugarea unui nou pivot
Set PT = ActiveSheet.PivotTables.Add(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").CalculatedItems.Add 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
Sub StergereCalculTaxe()
ActiveSheet.PivotTables(1).PivotFields("Tara").PivotItems("Taxe").Delete
End Sub
Exemplu: Pentru tabelul pivot alăturat dorim să contruim un grafic pivot de tip pie.
Sub CreeazaGraficPivot()
Dim Sh As Shape
Dim gfPiv As Chart
Teodora Frunză 101/105
CURS EXCEL VBA INFOTIM ETA2U TRAINING CENTER
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.