Sunteți pe pagina 1din 13

INTRODUCERE IN VBA SI MACRO

Cand porniti VBA in Excel, din Tools -> Macro - > Visual Basic Editor, va apare fereastra:

Aceasta fereastra contine mai multe sub-ferestre:


1. Fereastra Project Explorer (in partea din stanga sus)

Aceasta are o structura de arbore, similara cu folderele din Windows Explorer.

Fiecare intrare in Project Explorer este numita nod. Nodurile principale reprezinta proiectele
deschise in momentul curent in Excel VBA. Acestea pot fi expandate sau ascunse, apasand
pe +.
Fiecare proiect are un nume, la alegerea programatorului. Numele implicit al proiectului este
VBAProject. Nodul principal pentru fiecare proiect este etichetat ca:
ProjectName (WorkbookName), unde ProjectName este numele proiectului, iar
WorkbookName este numele workbookului Excel.
La nivelul imediat urmator, mai sunt noduri numite:
- Microsoft Excel Objects
- Forms
- Modules
- Classes
Sub nodul Microsoft Excel Objects exista cate un nod pentru fiecare worksheet si chartsheet
din workbook, precum si un nod special numit ThisWorkbook, ce reprezinta chiar workbookul.
Aceste noduri ofera acces catre ferestrele de cod pentru fiecare dintre aceste obiecte, unde
putem scrie propriul cod.
Sub nodul Forms, exista cate un nod pentru fiecare formular din proiect. Formularele sunt
numite de asemenea UserForms sau custom dialog boxes. Vom vorbi despre ele mai pe larg
mai tarziu.
Sub nodul Modules, exista cate un nod pentru fiecare modul de cod din proiect. Modulele de
code sunt numite si module standard. Vom discuta mai amanuntit despre ele mai tarziu.
Sub nodul Classes, exista cate un nod pentru fiecare modul de tip clasa din proiect. Vom
discuta mai amanuntit despre ele mai tarziu.
Scopul principal al ferestrei Project Explorer este acela de a ne permite sa navigam prin
proiect.
Worksheet-urile si UserForm urile au 2 componente:
- o componenta vizibila (un worksheet sau un dialog)
- o componenta de cod
Daca dam click dreapta pe un nod tip Worksheet sau UserForm, putem opta pentru a
vizualiza obiectul in sine, sau a vizualiza componenta de cod scrisa pentru acel nod.
Modulele standard si cele tip clasa, au numai o singura componenta, si anume cea de cod,
care poate fi vizualizata dand dublu click pe nodul respectiv.
Obiectul ThisWorkbook
Sub fiecare nod din Project Explorer etichetat Microsoft Excel Objects este un nod numit
ThisWorkbook. Acest nod reprezinta workbookul proiectului, impreuna cu componenta de cod
care stocheaza codul pentru diferite evenimente pentru workbook.
Scopul evenimentelor este acela de a permite unui VBA programator sa scrie un cod care se
va executa de fiecare data cand unul dintre acele evenimente apare. Excel recunoaste 19
evenimente referitoare la workbook. Doar cateva exemple::
Open apare atunci cand se deschide workbook-ul
BeforeClose apare chiar inainte sa se inchida workbook-ul
NewSheet apare atunci cand se adauga un sheet nou workbook-ului.
BeforePrint apare chiar inainte de a printa workbook-ul

Obiectele Sheet
Sub fiecare nod Microsoft Excel Objects este un nod pentru fiecare sheet. Fiecare nod sheet
reprezinta un worksheet sau un chartsheet componenta vizibila, impreuna cu componenta
tip cod. Excel recunoaste 7 evenimente legate de worksheet si 13 evenimente legate de
chartsheet. Vom discuta de ele mai tarziu.
Module
Un modul, numit mai clar standard modul, este un modul de cod, care contine proceduri
generale (functii si subrutine). Aceste proceduri pot fi macro-uri destinate a fi rulate de catre
utilizator, sau pot fi programe de suport, folosite de alte programe.
Class modules
Class modules sunt module de cod, care contin cod referitor la obiecte specifice. Nu vom
discuta de ele in acest curs.
Obiecte UserForm
Asa cum ati observat, Excel contine multe dialog boxes gata construite, insa este posibil sa
cream si dialog boxes customizate, numite si formulare sau UserForms. Acest lucru se face
prin crearea de obiecte tip UserForm. Exemplu de formular nou creat:

Vom discuta mai pe larg modul in care se proiecteaza un formular.


Fereastra Properties
Aceasta afiseaza proprietatile unui obiect si ne permite sa le modificam.
Fereastra Code
Fereastra Code afiseaza codul asociat cu item-ul selectat in fereastra Project.

Obiecte workbook sau sheet

Cand in fereastra de Project este selectat un obiect tip workbook sau sheet, sectiunea
de Object contine numai 2 intrari: generala, pentru procedurile generale si cea pentru
obiectul respectiv.

Daca de exemplu selectam Workbook si alegem ca si eveniment BeforeClose:

observam ca se genereaza un cod:


Private Sub Workbook_BeforeClose(Cancel As Boolean)
End Sub
Module
Cand se selecteaza un modul, singura intrare posibila este General, iar in dreapta
apare o lista cu toate procedurile pe care le-am dezvoltat noi pentru acel modul (daca
este vreuna dezvoltata).

Sectiunea de Declarations este folosita pentru a plasa declararea variabilelor (care vor
fi folosite in acest modul).
Obiect UserForm
Cand este selectat un obiect UserForm, in Object box vom gasi o lista cu toate
obiectele continute in UserForm.

Exemplu: Un programel simplu


Sub Test()
Dim ws As Worksheet
Set ws = ActiveSheet
' Insert a value into cell A1
ws.Cells(1, 1).Value = "sample"
' Make it bold
ws.Cells(1, 1).Font.Bold = True
' Copy cell
ws.Cells(1, 1).Copy
' Paste value only
ws.Cells(2, 1).PasteSpecial Paste:=xlValues
End Sub
Pentru a vedea ce se intampla cu ajutorul acestui program, deschideti un Excel nou, intrati pe
VBA (din Tools ->Macro -> Visual Basic Editor).
Dati dublu click pe Sheet1 si copiati codul de mai sus in fereastra nou deschisa. Apoi apasati
tasta F8 si veti vedea cum codul incepe sa ruleze pas cu pas.
Apasati F8 si vedeti ce efect are in Excel (treceti din VBA in Excel apasand Alt-F11), apoi
apasati din nou F8 si vedeti ce se intampla, pana se ajunge la sfarsitul codului.
Incercati sa identificati ce face fiecare linie de cod.

Alt exemplu, prin care se apeleaza o procedura din alta procedura:


Sub ProcedureA()
ActiveSheet.Cells(1,
Call ProcedureB
ActiveSheet.Cells(1,
End Sub
Sub ProcedureB()
ActiveSheet.Cells(1,
ActiveSheet.Cells(1,
End Sub

1).Value = "sample"
1).Font.Bold = True
1).Font.Size = 24
1).Font.Name = "Arial"

Pentru a vedea ce se intampla cu ajutorul acestui program, deschideti un Excel nou, intrati pe
VBA (din Tools ->Macro -> Visual Basic Editor).
Dati dublu click pe Sheet1 si copiati codul de mai sus in fereastra nou deschisa. Apoi apasati
tasta F8 si veti vedea cum codul incepe sa ruleze pas cu pas.
Apasati F8 si vedeti ce efect are in Excel (treceti din VBA in Excel apasand Alt-F11), apoi
apasati din nou F8 si vedeti ce se intampla, pana se ajunge la sfarsitul codului.
Incercati sa identificati ce face fiecare linie de cod.

Macros
Recording Macros
Excel are capabilitatea de a inregistra macrouri simple.
Din menu selectati Macro -> Record New Macro.
De exemplu, sa presupunem ca inregistram un Macro care gaseste si inlocuieste cuvantul
roc cu cuvantul reconciliation.
Cand ne uitam in fereastra Projects in proiectul in care s-a inregistrat macro-ul, vom gasi o
noua subrutina intr-un Standard Module:
Sub Macro1()
'
' Macro1 Macro
' Macro recorded 9/13/98 by sr
'
'
Cells.Replace What:="roc", Replacement:="reconciliation", _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False
End Sub
Acesta este acelasi cod pe care ar fi trebuit sa il scriem noi ca sa realizam aceasta operatie
de find and replace.
In anumite situatii, un macro inregistrat poate servi si drept unealta de invatare a codului.
Daca nu va dati seama cum ati putea scrie un anumit cod, puteti eventual inregistra un macro
si apoi sa copiati codul rezultat in propriul program.
Totusi, folosind macro recording, putem crea sectiuni de cod care sa functioneze doar pe
anumite selectii si care la alte selectii sa nu mai functioneze intrucat este specificat clar in cod
ce celule se iau in calcul (de ex).

O alta problema cu macro-urile inregistrate este aceea ca ele sunt capabile sa


inregistreze numai proceduri simple. Majoritatea programelor Excel sunt mult prea
complicate ca sa poata fi rezolvate cu macro recorder.
Rularea Macro-urilor
Pentru a rula un macro se apasa Alt+F8 sau se intra din menu, Tools -> Macro
->Macros. Va aparea fereastra:

De aici se selecteaza de la picklist-ul Macros in, locatia macro-ului, apoi se da click pe


numele macroului pe care vreti sa il rulati, apoi click pe Run.

Variabile, tipuri de date si constante


Comentarii
Comentariile sunt importante in cadrul unui cod.
Orice text care este precedat de apostrof este considerat comentariu si este ignorat de Excel.
Exemplu:
' Declar o variabila tip sir de caractere
Dim WksName as String
WksName = Activesheet.Name ' Obtin numele sheetului activ
De asemenea, atunci cand vrei sa comentezi o linie de cod, si nu vrei sa o stergi, poti pune
apostrof inaintea ei. Daca vrei sa comentezi / decomentezi mai multe linii deodata, folosesti
butoanele CommentBlock si UncommentBlock

Continuarea unei linii


Daca liniile de cod sunt prea lungi si prea greu de urmarit, puteti opta pentru continuarea lor
pe randul urmator, folosind un caracter, underscore, care trebuie sa fie precedat de un spatiu
si sa nu mai fie urmat de alte caractere, nici macar de comentarii. De exemplu:
ActiveSheet.Range("A1").Font.Bold = _
True
este tratat ca o singura linie de Excel.
Constante
Limbajul VBA are doua tipuri de constante.
- o constanta literala (numita si constanta) este o valoare specifica, de ex. Un
numar, o data, un sir de caractere; ea nu se schimba si este folosita exact asa cum este
scrisa.
Constantele de tip sir de caractere sunt scrise intre ghilimele, ca de ex. "Donna" iar cele de tip
data sunt scrise intre #, de ex #1/1/96#.
- o constanta simbolica este un nume pentru a constanta literala

Pentru a defini sau a declara o constanta simbolica intr-un program, trebuie sa folosim
cuvantul cheie Const. Exemplu:
Const InvoicePath = "d:\Invoices\"
In acest caz, Excel va inlocui fiecare aparitie a lui InvoicePath din codul nostru cu sirul de
caractere "d:\Invoices\". Astfel, InvoicePath este o constanta, intrucat nu isi schimba niciodata
valoarea, dar nu este o constanta literala, pentru ca nu este folosita asa cum e scrisa.
De ce e util sa le folosim? Daca de exemplu mai tarziu ne hotaram sa schimbam calea
fisierului si avem definita o astfel de constanta. Tot ce trebuie sa facem este sa modificam
numai valoarea constantei
Variabile si tipuri de date

O variabila poate fi privita ca un memory de la un calculator. Ea tine minte o valoare


care i-a fost atribuita, de un anumit tip
Posibilele tipuri de variabile le regasiti in tabelul de mai jos:

Declararea variabilelor
Declararea unei variabile presupune declararea tipului de data.
Variabilele se declara folosind cuvantul cheie Dim (sau Private si Public, de care vom discuta
ulterior). Cateva exemple de declaratii de variabile:
Dim Name As String
Dim Holiday As Date
Dim Age As Integer

Dim Height As Single


Dim Money As Currency
Dim wbk As Workbook
Dim ch As Chart
Sintaxa unei declarari de variabile este:
Dim NumeleVariabilei As TipulDeData
Daca o variabila este folosita fara a fi mai intai declarata sau este declarata fara a-I mentiona
tipul de data, ea va fi tratata ca fiind de tip Variant. Acest lucru duce la consum mare si inutil
de memorie.
Puteti sa declarati mai multe variabile pe acelasi rand:
Dim Age As Integer, Name As String, Money As Currency
Daca insa scrieti o declaratie de variabile:
Dim Age, Height, Weight As Integer
Este OK, insa Age si Height vor fi tratate ca si Variants, nu ca Integers. Trebuie sa specificati
explicit tipul de data pentru fiecare variabila.
Importanta declararii explicite a variabilelor
Daca din greseala scriem gresit un nume de variabila, VBA va crede ca vrem sa cream o
noua variabila. Pentru a vedea cat de periculos poate fi acest lucru, copiati codul de mai jos
intr-un module nou si rulati-l. Scopul acestui cod este de a deschide un workbook, a-i
schimba continutul, a cere utilizatorului numele cu care sa il salveze si a salva workbookul cu
noul nume.
Sub NewBook()
Dim Wbk As Workbook
Dim WbkName As String
' Get first open workbook
Set Wbk = Workbooks(1)
' Get the workbook name
WbkName = Wbk.Name
' Code to change the contents of the workbook
' goes here . . .
' Ask user for new name for document
WkbName = InputBox("Enter name for workbook " & WbkName)
' Save the workbook
Wbk.SaveAs WbkName
End Sub
Observati ca e o greseala de tiparire (este definita variabila WbkName, si este folosita ulterior
WkbName
De vreme ce variabila WkbName nu este declarata, Excel o va trata ca pe o noua variabila si
ii va atribui tipul Variant. Mai mult decat atat, VBA va presupune ca vrem sa asignam noul
nume variabilei WkbName, si va salva documentul modificat cu numele sau original, care
este stocat in WbkName. Astfel, vom pierde fisierul original pentru ca va fi suprascris fara
atentionare!

Option Explicit
Pentru a evita problema descrisa mai sus, trebuie sa gasim un mod de a determina Excel-ul
sa refuze sa ruleze un program daca acesta contine variabile care nu sunt declarate in mod
explicit. Acest lucru se face scriind urmatoarea linie de cod:
Option Explicit
in sectiunea de Declarations a fiecarui modul de cod. Pentru ca e usor sa uiti sa faci asta,
VBA ofera o optiune numita "Require Variable Declaration" in fereastra Options dialog box.
Cand este selectata aceasta optiune. VBA insereaza automat linia Option Explicit.
Tipuri de data - Numeric
Include: Integer, Long, Single, Double, si Currency.
Tip de data Boolean
Acest tip de variabila ia doar doua valori: True sau False.
Tip de data String (sir de caractere)
Un string este un sir de caractere. Acesta poate contine litere, cifre, semne de punctuatie, dar
si caractere speciale de control, cum ar fi vbCrLf (carriage return/line feed characters) sau
vbTab (tab character). O constanta tip string este scrisa intre apostrof, Un sir gol este
reprezentat prin
In VBA exista doua tipuri de variabile tip sir de caractere: cu lungime fixa si cu lungime
variabila.
O variabila string cu lungime fixa este declarata astfel:
Dim FixedStringVarName As String * StringLen
Daca vrem sa declaram o variabila string de 10 caractere, atunci vom scrie:
Dim sName As String * 10
O variabila string cu lungime variabila este definita:
Dim VariableStringVarName As String
Tipul de data Date
Dim dt As Date
Tipul de data Variant
Acest tip de variabila poate pastra orice tip de data, cu exceptia tipului string cu lungime fixa.
Scopul variabilelor
Variabilele si constantele au un scop, care indica locul din program in care acestea sunt
recunoscute sau vizibile pentru cod. Acesta poate sa fie la nivel de procedura (numit si local),
module-level private, sau module-level public.
Variabilele declarate local

Sunt cele declarate in cadrul unei proceduri si nu sunt vizibile in afara procedurii.

Variabilele definite in cadrul unui Module


Sunt declarate in sectiunea de declaratii a unui cod module si pot fi de 2 tipuri: private
si public.
O variabila module-level public este disponibila pentru toate procedurile din toate
modulele din proiect, nu numai pentru modulul in care au fost declarate, in timp ce
cele declarate ca module-level private sunt disponibile numai pentru procedurile din
modulul in care au fost declarate.
EXERCITII
1. Deschideti un fisier nou Excel, salvati-l cu numele
Macro_Week6_Nume.xls. Inregistrati in el apoi un Macro care sa faca
urmatoarele: scrie in celula B2 Nume, in celula C2 Prenume si in celula
D2 Varsta. Apoi scrie in celula B3 numele vostru, in celula C3 prenumele
vostru si in celula D3 varsta voastra. Formatati apoi range-ul B2:D3 ca pe o
tabela (de ex:

Apoi formatati capul de tabel astfel:

Apoi opriti inregistrarea Macroului si salvati macroul cu numele Inregistrata.


Stergeti datele completate la inregistrarea macro-ului si rulati apoi macroul creat ca sa
va asigurati ca functioneaza. Salvati apoi fisierul.
2. Deschideti un fisier nou Excel, salvati-l cu numele VBA_Week6_Nume.xls.
Intrati pe VBA si in Module scrieti un cod in care sa faceti urmatoarele:
-

declarati trei variabile: Nume de tip string, Prenume, de tip string si Varsta
de tip integer
Folositi sintaxa pentru InputBox pentru a solicita numele, prenumele si varsta.
Sintaxa este urmatoarea:

InputBox(prompt [, title] [, default])


Unde prompt este mesajul din fereastra de input, title este titlul pentru caseta input box, si
default este valoarea implicita care este afisata in text box. De exemplu, codul:
sName = InputBox("Enter your name.", "Name", "Albert")

duce la afisarea urmatoarei ferestre:

Functia InputBox returneaza sirul pe care l-a introdus utilizatorul in caseta de text. In cazul de
mai sus, variabila sName va contine acel sir.

Chiar daca dorim ca utilizatorul sa introduca un numar, vom folosi tot functia
InputBox, si vom converti sirul de caractere introdus in numar, folosind functia Val.
Val(variabila tip string) returneaza un numar.
Scrieti apoi Numele, Prenumele si Varsta pe care le-ati solicitat utilizatorului in sheet
astfel:
-

Celula A1 numele
Celula B1 prenumele
Celula C1 varsta

Acest lucru se face atribuind celulelor respective, valoarea continuta de variabila


corespunzatoare.
Exemplu:
Sintaxa pentru evidentierea unei celule este Cells(row,column).
Cells(1,1) este celula de la intersectia randului 1 cu coloana 1 deci celula A1
Ca sa ii atribui celulei A1 valoarea continuta de variabila Nume, vom scrie:
Cells(1,1)=Nume
Salvati apoi fisierul si il inchideti.
Trimiteti cele 2 fisiere la mine pana la data de 22.09.2011.
SUCCES !