Sunteți pe pagina 1din 44

PROIECTARE ASISTATA DE CALCULATOR

UTILIZAREA LIMBAJULUI VBA PENTRU CONSTRUIREA DE


MACROFUNCTII IN EXCELTM
MODIFICAREA NUMELUI SHEET-URILOR
La deschiderea unui workbook EXCEL sheet-urile componente au denumirea implicita”Sheet1”, “Sheet2”,
“Sheet3”, etc.

Pentru a redenumi un sheet cursorul mouse-ului se pozitioneaza in dreptul sheet-ului a carui nume se doreste
modificat (bara de nume a sheet-urilor amplasata in partea de jos a ecranului) si se face dublu-click pe
butonl din stinga al mouse-ului. Prin aceasta operatie caseta sheet-ului selectat se inegreste.

Se tasteaza numele dorit urmat de “Enter”

2
In acest mod utilizatorul poate redenumi sheet-urile aplicatiei pentru a le putea gestiona mai usor continutul.

Daca se doreste introducerea unui sheet suplimentar atunci din meniul Insert se selecteaza “Worksheet”:

3
MACRO-URI REALIZATE IN VBA
EXCEL prezinta facilitatea de a permite dezvoltarea de aplicatii complexe (macro-uri) utilizind limbajul de
programare VBA (Visual Basic Application) – o varianta a limbajului Visual Basic.
In vederea scrierii unui macro trebuie sa fie activat editorul Visual Basic:

In urma activarii editorului Visual Basic se deschide un ecran in care trebuie sa fie inserat un modul in care
sa fie editata aplicatia:

Prin inserarea modulului se poate incepe scrierea aplicatiilor. Cele mai curente aplicatii sunt de tip
Subrutina:

Sub NumeSubrutina

4
Numele subrutinei este dat de utilizator. Prin tastare “Enter” dupa nume editorul VBA introduce automat
comanda de incheiere a subrutinei:

Intre cele doua instructiuni se introduc toate comenzile (instructiunile) care formeaza programul dorit.

Numarul de subrutine care se pot scrie in cadrul unui modul nu este limitat. De asemenea, in cazul in care se
doreste o structurare a subrutinelor mai riguroasa se pot initializa mai multe Module prin aceleasi proceduri
ca la inserarea primului modul.

5
.

Un modul poate fi sters prin activarea lui (click mouse pe numele lui) urmata de comanda “Remove”
activata din meniul principal al editorului

O structura generala a unei aplicatii inclusa intr-o subrutina este:

1. Bloc pentru definirea marimii maxime a variabilelor de tip vector sau matrice utilizate in program

2. Citirea datelor necesare programului din sheet-uri ale aplicatiei sau din fisiere externe

3. Blocul de calcul in care se executa operatiile dorite specifice aplicatiei

4. Scrierea datelor rezultate la punctul 3 in sheet-urile workbok-ului sau in fisiere externe.

VARIABILE
In cadrul unui program (subrutina, functie) realizat utilizind limbajul VBA ca Macro in EXCEL sunt
utilizate variabile in care se stocheaza informatia dorita.

O prima clasificare a variabilelor este dupa numarul lor de componente: scalare, vectoriale, matriciale.

6
Variabilele se pot clasifica de asemenea dupa continutul lor in variabile numerice, de tip text sau mixte
(variabile vectoriale sau matriciale in care elementele componente pot fi de tip text sau numar).

Variabile scalare
O variabila scalara are o singura componenta. Spre exemplu X = 1 atribuie variabilei denumite X valoarea 1.

Variabilele vectoriale
Variabilele vectoriale sunt utilizate atunci cind sub acelasi nume sunt stocate mai multe date organizate sub
forma de coloana sau rind.
Spre exemplu stocarea intr-o singura variabila denumita “CURS_Valutar” a valorilor cursului Leu - $ dintr-
un sir de zile se poate face atribuind variabilei dorite elemente diferite diferentiate prin valoarea inclusa intre
paranteze, conform schemei prezentate in figura de mai jos. Transferul datelor din sheet in program se face
printr-o secventa de instructiuni descrisa in capitolul de citire/scriere a datelor in sheet-uri (Exemplul 2)

Pentru operarea cu variabile de tip vectorial trebuie sa fie definit – la inceputul programului- numarul maxim
de valori care vor fi stocate (in cazul exemplului prezentat: 19) prin utilizarea instructiunii Dim:

Dim CURS_Valutar(19)

Variabile matriciale
Variabilele matriciale indexeaza sub acelasi nume informatiile cuprinse in tabele care au mai multe coloane.
In figura de mai jos este reprezentat modul in care poate fi stocata intr-o variabila matriciala X (definita in
cadrul unui Macro) valorile datei si cursurilor valutare Leu-$ si Leu-Euro incluse intr-un sheet EXCEL.
Valorile prezentate in chenar reprezinta elementele de identificare a variabilei matriciale. Spre exemplu:
X(1,1)=29.12.2004, X(1,2)=28919, s.a.m.d. Practic programul opereaza ca si cum cele doua tabele ar fi
suprapuse: tabelul cu identificarea rindurilor si coloanelor la baza, strat peste care se afla cimpul de valori.
Transferul datelor din sheet in program se face printr-o secventa de instructiuni descrisa in capitolul de
citire/scriere a datelor in sheet-uri (Exemplul 3)

7
Pentru operarea cu variabile de tip matricial trebuie sa fie definit – la inceputul programului- numarul
maxim de valori care vor fi stocate (in cazul exemplului prezentat: 19 rinduri si 3 coloane) prin utilizarea
instructiunii Dim:

Dim X(19,3)

Variabile numerice
O variabila numerica are ca valori numere care pot fi intregi (1,1001, 23456 etc.) sau zecimale (reprezentat
in Simpla sau Dubla precizie)

Variabile text
O variabila text contine un sir de caractere (numerice sau alfabetice cu exceptia ghilimelelor). Caracterele
variabilei de tip text sunt stocate in aplicatiile VBA intre ghilimele (“). Spre exemplu “12wer_s456”, “sdg
fbje”.
Numele unei variabile de tip text (in cazul in care se doreste explicitarea tipului de variabila) trebuie sa se
incheie cu simbolul $ (spre exemplu: a$, Text$). Variabilele de tip text pot fi supuse unor operatii de
coincatenare sau segmentare in cadrul programelor realizate ca Macro-uri

OPERATII CU SHEET-uri
MODIFICAREA CARACTERISTICILOR ELEMENTELOR COMPONENTE

Din interiorul unei aplicatii de tip VBA (Macro) pot fi comandate operatii pentru modificarea
caracteristicilor elementelor componente: celule, rinduri, coloane.
In acest scop este necesar in primul rind sa fie activat Sheet-ul ale carui elemente vor fi controlate prin
aplicatie.

Specificarea numelui sheet-ului din/in care se face citirea/scrierea datelor prin utilizarea comenzii: With,
urmata de specificarea obiectului asupra caruia se executa comanda: Sheets instantiat pentru numele sheet-
ului dorit: “Nume Sheet”:

With Sheets(“Nume Sheet”)

Spre exemplu, daca sheet-ul in care se doreste citirea/scrierea datelor are numele “Sheet1” atunci
instructiunea va avea forma:

8
With Sheets(“Sheet1”)

Daca sheet-ul are numele “Input” atunci forma instructiunii va fi:

With Sheets(“Input”)

Pentru a numi sheet-urile dintr-o aplicatie vezi capitolul “Modificarea numelui Sheet-urilor”

Numele sheet-ului poate fi specificat si prin intermediul unei variabile de tip text definita anterior in
program. Astfel, secventa de instructiuni:

a$ = “Input”
With Sheets(a$)

va instantia sheet-ul “Input”. Avantajul unui astfel de mod de apelare il reprezinta flexibilitatea in
constructia variabilei de tip text.

Instructiunea With se incheie cu instructiunea End With. Intre cele doua instructiuni trebuie inserate
comenzile referitoare la manipularea elementelor componente ale sheet-ului (celule, rinduri, coloane):

With Sheets(“Nume Sheet”)

{Bloc de instructiuni}

End With

Celule

Exista trei moduri de apelare si editare a caracteristicilor unei celule dintr-un sheet specificat:

1. Folosind instructiunea With urmata de clasele de obiecte asupra careia se aplica:


• Pentru identificarea celulei ale carei caracteristici se editeaza, clasa de obiecte este Cells.
Instantierea celulei dorite se face prin specificarea coordonatelor ei si anume: Rind si
Coloana:

With Sheets(“NumeSheet”)
With Cells(Rind, Coloana)

{Bloc de instructiuni}

End With
End With

Rind este un numar sau variabila numerica care reprezinta rindul celulei care se citeste. Spre
exemplu pentru celula “A1” rindul este 1, pentru celula “C5” rindul este 5.
Coloana este un numar sau variabila numerica reprezinta numarul de ordine al coloanei
celulei care se citeste: pentru A numarul este 1, pentru B -2, C -3, s.a.m.d.
In acest mod celula “M5” va fi inclusa in instructiune sub forma .Cells(5,13), celula “N7”:
.Cells(7,14), etc.

• Editarea caracteristicilor celulelor se face prin utilizarea claselor de obiecte corespunzatoare:


Font pentru modificarea fontului, Interior pentru modificarea fundalului, NumberFormat
9
pentru tipul de informatii din celula (numere, text, etc). Modul de apelare a acestor clase de
obiecte se bazeaza pe utilizarea caracterului ”.” pentru legarea de clasa de obiecte ierarhic
superioara (in acest caz Cells). Apelarea clasei de editare este urmata de specificarea tipului
de operatie care se executa. Exemplele urmatoare acopera cea mai mare parte a posibilitatilor
de editare posibil de a fi controlate prin acest procedeu:

o Textul din celula specificata prin Rind, Coloana din Sheet-ul NumeSheet este scris cu
caractere ingrosate (bold):

With Sheets(“NumeSheet”)
With Cells(Rind, Coloana)
.Font.Bold = True
End With
End With

o Dezactivarea din textul din celula specificata prin Rind, Coloana din Sheet-ul
NumeSheet a stilului de scriere cu caractere ingrosate (bold):

With Sheets(“NumeSheet”)
With Cells(Rind, Coloana)
.Font.Bold = False
End With
End With

o Textul din celula specificata prin Rind, Coloana din Sheet-ul NumeSheet este scris cu
caractere italice (italic):

With Sheets(“NumeSheet”)
With Cells(Rind, Coloana)
.Font.Italic = True
End With
End With

Pentru dezactivarea stilului italic se inlocuieste valoarea logica True cu False

o Textul din celula specificata prin Rind, Coloana din Sheet-ul NumeSheet este subliniat
cu linie simpla (underline):

With Sheets(“NumeSheet”)
With Cells(Rind, Coloana)
.Font.Underline = xlUnderlineStyleSingle
End With
End With

o Textul din celula specificata prin Rind, Coloana din Sheet-ul NumeSheet este subliniat
cu linie dubla (underline):

With Sheets(“NumeSheet”)
With Cells(Rind, Coloana)
.Font.Underline = xlUnderlineStyleDouble
End With
End With

10
o Textul din celula specificata prin Rind, Coloana din Sheet-ul NumeSheet este scris cu
fonturi a caror culoare este specificata:

With Sheets(“NumeSheet”)
With Cells(Rind, Coloana)
.Font.Color = ColorNumber
End With
End With

ColorNumber este un numar asociat fiecarei culori. Figura urmatoare prezinta


numerele atasate fiecarei culori care poate fi selectata din meniul Font Color al sheet-
urilor EXCEL:

Textul din celula specificata prin Rind, Coloana din Sheet-ul NumeSheet este scris cu
fonturi al caror stil este specificat:

With Sheets(“NumeSheet”)
With Cells(Rind, Coloana)
.Font.Name = “FontName”
End With
End With

FontName este numele fontului specificat in caseta de selectare a fontului din meniul principal al
sheet-urilor:

Spre exemplu pentru Arial:

11
.Font.Name = “Arial”
pentru Times New Roman:
.Font.Name = “Times New Roman”
pentru Symbol:
.Font.Name = “Symbol”

o Textul din celula specificata prin Rind, Coloana din Sheet-ul NumeSheet este scris cu
fonturi a caror marime este specificata:

With Sheets(“NumeSheet”)
With Cells(Rind, Coloana)
.Font.Size = Number
End With
End With

unde Number este un numar egal cu marimea fontului

o Culoarea fundalului celulei specificate prin Rind, Coloana din Sheet-ul NumeSheet
poate fi modificata prin instructiunile:

With Sheets(“NumeSheet”)
With Cells(Rind, Coloana)
.Interior.Color = ColorNumber
End With
End With

ColorNumber este un numar asociat fiecarei culori identic cu cel prezentat la


schimbarea culorii fontului.

o Continutul celulei specificate prin Rind, Coloana din Sheet-ul NumeSheet corespunde
unui tip specificat de utilizator:

With Sheets(“NumeSheet”)
With Cells(Rind, Coloana)
.NumberFormat = “TipFormat”
End With
End With

unde pentru principalele tipuri de variabile:

“TipFormat” = "0.00"
pentru scrierea variabilelor numerice cu un numar de zecimale specificat de
utilizator. Numarul de zecimale scris este egal cu numarul de zerouri dupa
caracterul “.”. Astfel pentru 0.00 vor fi scrise 2 zecimale, pentru 0.000 vor fi 3
zecimale s.a.m.d.
“TipFormat” = "m/d/yyyy"
pentru scrierea unei variabile de tip data calendaristica
“TipFormat” = "0.00%"
pentru scrierea unei variabile de tip procent. Numarul de zerouri dupa
caracterul ”.” reprezinta numarul de zecimale care sunt scrise
“TipFormat” = "0.00E+00"
pentru scrierea unei variabile numerice in format stiintific
“TipFormat” = "@"
12
pentru scrierea unei variabile de tip text

2. Apelind direct clasa de obiecte Cells corespunzatoare Sheet-ului instantiat anterior utilizind metoda
generala din limbajul VBA prin care legatura intre doua clase subordonate se face prin caracterul “.”.
In acest caz clasa de nivel superior este “Sheets”, iar clasa subordonata este “Cells”. Toate comenzile
specificate la punctul 1 pot fi scrise in acest mod. Spre exemplu:

With Sheets(“NumeSheet”)
.Cells(Rind, Coloana).Font.Bold = True
End With

3. Prin selectarea sheet-ului si celulelor utilizind instructiunea Select.

• Selectarea unui sheet se face sub forma:

Sheets(VariabilaText).Select

Aceasta instructiune poate fi tradusa in limbaj obisnuit prin expresia:


“Din clasa de obiecte Sheets se selectioneaza sheet-ul al carui nume este VariabilaText”.
Sheet-ul selectionat devine activ in cadrul aplicatiei.

Spre exemplu activarea Sheet-ului “Input” se poate face sub una din formele:

A$ = “Input”
Sheets(A$).Select

Sau

Sheets(“Input”).Select

• Selectarea unei celule sau grup de celule se face aplicind operatia Select asupra clasei de
obiecte Range actualizata pentru domeniul dorit:

Range(VariabilaText).Select

unde VariabilaText reprezinta domeniul celulelor al caror continut se doreste modificat. Spre
exemplu, daca se doreste selectarea domeniului “A1:B5” atunci:

a$ = “A1:B5”
Range(a$).Select

Actiunea acestei instructiuni este similara cu


selectarea fizica a celulelor din sheet-ul considerat.

• Selectiei efectuate in acest mod ii pot fi asociate, similar procedurilor descrise la punctul 1,
operatiile asociate claselor Font, Interior sau NumberFormat. Exemplul urmator este
edificator in acest sens:
13
A$ = “Input”
Sheets(A$).Select
B$ = “A1:B10”
Range(B$).Select
Selection.Font.Bold=True
Selection.Font.Color=5

Se constata ca operatiile definite la punctul 1 se aplica clasei de obiecte Selection

In plus fata de operatiile definite la punctul 1 se pot efectua operatii de incadrare in chenare a
celulelor din domeniul selectat. Exemplele urmatoare arata modul de folosire a instructiunii
Borders aplicata unui domeniu de celule selectat prin instructiunea Range

Chenar la partea inferioara (bottom) a celulelor:

Sheets("Sheet1").Select
Range("B2:D2").Select
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With

Chenar la stinga (left) domeniului:

Sheets("Sheet1").Select
Range("B2:D2").Select
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With

Chenar deasupra (top) domeniului:

Sheets("Sheet1").Select
Range("B2:D2").Select
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With

Chenar la dreapta (right) domeniului:


Sheets("Sheet1").Select
Range("B2:D2").Select
With
Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With

14
Diagonale peste domeniu - 1:
Sheets("Sheet1").Select
Range("B2:D6").Select
With
Selection.Borders(xlDiagonalDown)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With

Diagonale peste domeniu - 2:


Sheets("Sheet1").Select
Range("B2:D6").Select
With
Selection.Borders(xlDiagonalUp)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With

Linii interioare verticale peste domeniu:


Sheets("Sheet1").Select
Range("B2:D6").Select
With
Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With

Linii interioare orizontale peste domeniu:


Sheets("Sheet1").Select
Range("B2:D6").Select
With
Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With

In setul de instructiuni pentru realizarea chenarelor daca in loc de :

.Weight = xlMedium

se foloseste instructiunea:

.Weight = xlThin

liniile din chenar vor fi subtiri.

De asemenea, daca se inlocuieste:

.ColorIndex = xlAutomatic

15
cu instructiunea:

.ColorIndex = ColorNumber

unde ColorNumber este codul de culoare.

In cazul in care se doreste stergerea liniei in locul instructiunii:

.LineStyle = xlContinuous

se va utiliza:

.LineStyle = xlNone

Coloane

Exista aceleasi trei moduri de apelare si editare a caracteristicilor unei selectii de coloane dintr-un sheet
specificat ca si in cazul celulelor:
1. Folosind instructiunea With urmata de clasele de obiecte asupra careia se aplica:
• Pentru identificarea coloanei ale carei caracteristici se editeaza, clasa de obiecte este
Columns. Instantierea coloanei dorite se face prin specificarea coordonatelor ei:

With Sheets(“NumeSheet”)
With Columns(Coloana)

{Bloc de instructiuni}

End With
End With

unde Coloana este numarul de ordine al coloanei: pentru coloana A : 1, pentru B: 2, s.a.m.d.
Editarea caracteristicilor coloanelor se face prin utilizarea claselor de obiecte
corespunzatoare: Font pentru modificarea fontului, Interior pentru modificarea fundalului,
NumberFormat pentru tipul de informatii din celula (numere, text, etc). Modul de apelare a
acestor clase de obiecte se bazeaza pe utilizarea caracterului ”.” pentru legarea de clasa de
obiecte ierarhic superioara (in acest caz Columns). Apelarea clasei de editare este urmata de
specificarea tipului de operatie care se executa, similar cazului celulelor: in instructiunile
prezentate pentru editarea celulelor se va inlocui clasa de obiecte .Cells cu clasa .Columns.
Spre exemplu, instructiunile

With Sheets(“NumeSheet”)
With Cells(Rind, Coloana)
.Font.Bold = True
End With
End With

De la editarea celulelor se vor inlocui cu:

With Sheets(“NumeSheet”)
With Columns(Coloana)
.Font.Bold = True
End With
End With
16
2. Apelind direct clasa de obiecte Columns corespunzatoare Sheet-ului instantiat anterior utilizind
metoda generala din limbajul VBA prin care legatura intre doua clase subordonate se face prin
caracterul “.”. In acest caz clasa de nivel superior este “Sheets”, iar clasa subordonata este
“Columns”. Toate comenzile specificate la punctul 1 pot fi scrise in acest mod. Spre exemplu:

With Sheets(“NumeSheet”)
.Columns(Coloana).Font.Bold = True
End With

3. Prin selectarea sheet-ului si celulelor utilizind instructiunea Select.

• Selectarea unui sheet se face sub forma:

Sheets(VariabilaText).Select

Aceasta instructiune poate fi tradusa in limbaj obisnuit prin expresia:


“Din clasa de obiecte Sheets se selectioneaza sheet-ul al carui nume este VariabilaText”.
Sheet-ul selectionat devine activ in cadrul aplicatiei.

Spre exemplu activarea Sheet-ului “Input” se poate face sub una din formele:

A$ = “Input”
Sheets(A$).Select

Sau

Sheets(“Input”).Select

• Selectarea unei coloane sau grup de coloane se face aplicind operatia Select asupra clasei de
obiecte Columns actualizata pentru domeniul dorit:

Columns(VariabilaText).Select

unde VariabilaText reprezinta domeniul coloanelor al caror continut se doreste modificat.


Spre exemplu, daca se doreste selectarea coloanelor “A:D” atunci:

a$ = “A:D”
Range(a$).Select

• Selectiei efectuate in acest mod ii pot fi asociate, similar procedurilor descrise la punctul 1,
operatiile asociate claselor Font, Interior sau NumberFormat (vezi punctul 3 de la editarea
celulelor).

Rinduri

Exista aceleasi trei moduri de apelare si editare a caracteristicilor unei selectii de rinduri dintr-un sheet
specificat ca si in cazul celulelor:
1. Folosind instructiunea With urmata de clasele de obiecte asupra careia se aplica:
• Pentru identificarea coloanei ale carei caracteristici se editeaza, clasa de obiecte este Rows.
Instantierea rindului dorite se face prin specificarea coordonatelor ei:

With Sheets(“NumeSheet”)
With Rows(Rind)
17
{Bloc de instructiuni}

End With
End With

unde Rind este numarul de ordine al rindului.


Editarea caracteristicilor rindurilor se face prin utilizarea claselor de obiecte corespunzatoare:
Font pentru modificarea fontului, Interior pentru modificarea fundalului, NumberFormat
pentru tipul de informatii din celula (numere, text, etc). Modul de apelare a acestor clase de
obiecte se bazeaza pe utilizarea caracterului ”.” pentru legarea de clasa de obiecte ierarhic
superioara (in acest caz Rows). Apelarea clasei de editare este urmata de specificarea tipului
de operatie care se executa, similar cazului celulelor: in instructiunile prezentate pentru
editarea celulelor se va inlocui clasa de obiecte .Cells cu clasa .Rows. Spre exemplu,
instructiunile

With Sheets(“NumeSheet”)
With Cells(Rind, Coloana)
.Font.Bold = True
End With
End With

De la editarea celulelor se vor inlocui cu:

With Sheets(“NumeSheet”)
With Rows(Rind)
.Font.Bold = True
End With
End With

2. Apelind direct clasa de obiecte Rows corespunzatoare Sheet-ului instantiat anterior utilizind metoda
generala din limbajul VBA prin care legatura intre doua clase subordonate se face prin caracterul “.”.
In acest caz clasa de nivel superior este “Sheets”, iar clasa subordonata este “Rows”. Toate
comenzile specificate la punctul 1 pot fi scrise in acest mod. Spre exemplu:

With Sheets(“NumeSheet”)
.Rows(Rind).Font.Bold = True
End With

3. Prin selectarea sheet-ului si celulelor utilizind instructiunea Select.

• Selectarea unui sheet se face sub forma:

Sheets(VariabilaText).Select

Aceasta instructiune poate fi tradusa in limbaj obisnuit prin expresia:


“Din clasa de obiecte Sheets se selectioneaza sheet-ul al carui nume este VariabilaText”.
Sheet-ul selectionat devine activ in cadrul aplicatiei.

Spre exemplu activarea Sheet-ului “Input” se poate face sub una din formele:

A$ = “Input”
Sheets(A$).Select

18
Sau

Sheets(“Input”).Select

• Selectarea unui rind sau grup de rinduri se face aplicind operatia Select asupra clasei de
obiecte Rows actualizata pentru domeniul dorit:

Rows(VariabilaText).Select

unde VariabilaText reprezinta domeniul rindurilor al caror continut se doreste modificat. Spre
exemplu, daca se doreste selectarea rindurilor “1:5” atunci:

a$ = “1:5”
Range(a$).Select

• Selectiei efectuate in acest mod ii pot fi asociate, similar procedurilor descrise la punctul 1,
operatiile asociate claselor Font, Interior sau NumberFormat (vezi punctul 3 de la editarea
celulelor).

CITIREA SI SCRIEREA DATELOR IN SHEET-uri

Aplicatiile realizate in VBA (subrutine, functii, etc.) necesita comunicarea datelor de intrare (din sheet-uri
EXCEL) catre aplicatie si scrierea valorilor calculate in aplicatie in sheet-uri EXCEL.

Instructiunile care realizeaza citirea/scrierea datelor din/in sheet-uri realizeaza urmatorii pasi:

1. Specificarea numelui sheet-ului din/in care se face citirea/scrierea datelor prin utilizarea comenzii:
With, urmata de specificarea obiectului asupra caruia se executa comanda;

2. Citirea datelor dintr-un sheet reprezinta alocarea continutului unei celule din sheet unei variabile din
interiorul programului (aplicatiei VBA). Astfel, instructiunea pentru transferarea continutului din
celula A1 variabilei X este:

X = .Cells(1,1).Value

In acest mod se transfera valoarea din dreapta semnului egal (continutul celulei A1) variabilei din
stinga semnului “=” (X).

Forma generala a instructiunii este:

NumeVariabila = .Cells(Rind, Coloana).Value

NumeVariabila este numele dat variabilei in cadrul subrutinei respective (X, Y, etc.)
Rind este un numar sau variabila numerica care reprezinta rindul celulei care se citeste. Spre exemplu
pentru celula “A1” rindul este 1, pentru celula “C5” rindul este 5.
Coloana este un numar sau variabila numerica reprezinta numarul de ordine al coloanei celulei care
se citeste: pentru A numarul este 1, pentru B -2, C -3, s.a.m.d.
In acest mod celula “M5” va fi inclusa in instructiune sub forma .Cells(5,13), celula “N7”:
.Cells(7,14), etc.

.Cells reprezinta apelarea obiectului Cells corespunzator obiectului Sheet instantiat prin instructiunea
With. Punctul “.” Din fata numelui obiectului Cells reprezinta legatura cu clasa de obiecte ierarhic

19
superioare (Sheet) instantiate anterior. Similar punctul plasat dupa instructiunea Cells(Rind, Coloana)
arata ca instructiunea care urmeaza (in acest caz Value) se refera la celula instantiata anterior.

In mod similar transferarea (scrierea) continutului variabilei Y in celula “B3” spre exemplu se face
prin instructiunea:

.Cells(3,2).Value = Y

Instructiunea generala este:

.Cells(Rind, Coloana).Value = NumeVariabila

Din nou se remarca faptul ca se atribuie ceea ce se afla in dreapta semnului “=” (valoarea stocata in
NumeVariabila) la ceea ce se afla in stinga (continutul celulei specificate)

3. Se inchide instructiunea With deschisa la pasul 1 prin instructiunea:

End With

In continuare sunt prezentate citeva exemple de secvente de instructiuni pentru citirea/scrierea datelor
din/in sheet-uri.

Exemplul 1.
Atribuirea continutului celulei “A1” din Sheet-ul “Input” variabilei X si continutului celulei B4
variabilei Y

With Sheets(“Input”)
X = .Cells(1,1).Value
Y = .Cells(4,2).Value
End With

Similar, daca se doreste scrierea variabilelor X si Y


calculate in program in celulele A1 si B4 din
Sheet-ul “Ouput” secventa de instructiuni este:
With Sheets(“Output”)
.Cells(1,1).Value = X
.Cells(4,2).Value = Y
End With

Exemplul 2.
Atribuirea continutului mai multor celule organizate in coloana unei variabile de tip vector
denumita CURS_Valutar

Dim CURS_Valutar(19)
With Sheets(“Input”)
For i = 1 TO 19
CURS_Valutar(i) = .Cells(i+1 , 2).Value
Next i
End With

In acest exemplu se remarca utilizarea instructiunii de ciclare


For: variabila I ia valori intre 1 si 19. Pentru fiecare valoare I

20
se atribuie variabilei CURS_Valutar(i) continutul celulei avind rindul i+1 (+1 deoarece rindul 1 este destinat
capului de tabel) si coloana 1 (“A”).
Algoritmul poate fi scris si sub forma:

Dim CURS_Valutar(19)
N = 19
With Sheets(“Input”)
For i = 1 TO N
CURS_Valutar(i) = .Cells(i+1 , 2).Value
Next i
End With

In acest mod numarul de citiri (19) este inclus intr-o variabila distincta (N) fiind crescuta flexibilitatea
programului.

Exemplul 3.
Atribuirea continutului mai multor celule organizate in mai multe rinduri si coloane unei variabile de tip
matrice denumita X

Dim X(19,3)
With Sheets(“Input”)
For I = 1 TO 19
For J = 1 TO 3
X(I , J) = .Cells(I+1, J).Value
Next J
Next I
End With

In cazul in care variabila matriciala X se defineste


specificind intii coloana si apoi rindul se poate scrie un
algoritm similar:

Dim X(3,19)
With Sheets(“Input”)
For I = 1 TO 3
For J = 1 TO 19
X(I , J) = .Cells(J+1 , I).Value
Next J
Next I
End With

Exemplul 4.
Atribuirea continutului mai multor celule organizate in
coloana unei variabile de tip vector
denumita CURS_Valutar. Spre deosebire de Exemplu 2 nu
se cunoaste numarul de elemente din coloana care urmeaza
a fi citita. In acest caz citirea se va face crescind numarul de
ordine al rindului citit (i1) atita timp cit (While) continutul
celulei corespunzatoare nu este nul (continutul nul este
similar cu variabila text nula: ””)

21
With Sheets("Input")
i1 = 1
While .Cells(i1+1, 1) <> ""
X(i1) = .Cells(i1+1, 1).Value
i1 = i1 + 1
Wend
n = i1 - 1
End With

Acelasi algoritm se poate scrie utilizind secventa de instructiuni DO WHILE / LOOP sub forma:

With Sheets("Input")
i1 = 1
Do While .Cells(i1+1, 1) <> ""
X(i1) = .Cells(i1+1, 1).Value
i1 = i1 + 1
Loop
n = i1 - 1
End With

Acelasi rezultat se obtine si prin folosirea algoritmului bazat pe secventa de instructiuni DO UNTIL /
LOOP:

With Sheets("Input")
i1 = 1
Do Until .Cells(i1+1, 1) = ""
X(i1) = .Cells(i1+1, 1).Value
i1 = i1 + 1
Loop
n = i1 - 1
End With

CITIREA SI SCRIEREA DATELOR DIN / IN FISIERE EXTERNE


In numeroase cazuri datele necesare rularii unui model sunt stocate in fisiere exterioare de tip text (cod
ASCII – format care nu contine formatarea textelor fiind in acest mod transferabil intre diferite sisteme de
operare sau aplicatii). De asemenea este necesara transferarea output-ului programelor de calcul realizate ca
macro-uri in EXCEL in fisiere exterioare.
Pentru citirea/scrierea datelor din/in fisiere exterioare trebuie efectuati urmatorii pasi:
1. Definirea numelui fisierului extern. Numele fisierului extern este o variabila de tip text. El trebuie sa
contina intreaga cale (unitate de disc + director) pentru a ajunge la fisierul specificat. Spre exemplu
daca se doreste apelarea fisierului Exemplu5.txt numele care trebuie definit in aplicatie este:

“C:\ Curs Manag & Dezv Rurala\Exemplu5.txt”

Caracterele subliniate sunt fixe in definirea variabilei care reprezinta numele fisierului. In acest mod
in cadrul aplicatiei numele fisierului poate fi construit utilizind operatia de incatenare a variabilelor
de tip text:

UnitateDisc$ = “C”
Folder$ = “Curs Manag & Dezv Rurala”
Fisier$ = “Exemplu5”
Extensie$ = “txt”
NumeFisier$ = UnitateDisc$ + ”:\” + Folder$ + ”\” + Fisier$ + ”.” + Extensie$
22
Variabilele de tip text UnitateDisc$, Folder$, Fisier$, Extensie$ pot fi citite dintr-un sheet
component al aplicatiei:

With Sheets(“Fisiere”)
UnitateDisc$ = .Cells(1,2).Value
Folder$ = .Cells(2,2).Value
Fisier$ = .Cells(3,2).Value
Extensie$ = .Cells(4,2).Value
End With

Acest mod de definire a variabilei pentru numele de fisier elimina orice ambiguitati prin includerea
in cadrul programului a caracterelor speciale fixe (“:\”, “\”, “.”)

2. Atribuirea unui numar de identificare in cadrul programului pentru fisierul care urmeaza a fi deschis.
Pentru evitarea erorilor care pot sa apara prin deschiderea sub acelasi numar a mai multor fisiere
diferite se recomanda ca atribuirea unui numar pentru fisier sa fie facuta automat de program prin
utilizarea instructiunii FreeFile:

Fn1 = FreeFile

In urma efectuarii acestei instructiuni variabila numerica Fn1 va lua valoarea 1 daca nu mai este
deschis nici un fisier, 2 daca deja este deschis un fisier, etc.

23
3. Deschiderea fisierului pentru operatii de citire se face utilizind instructiunea:

Open NumeFisier$ For Input Access Read As #Fn1

Caracterele subliniate sunt fixe pentru instructiune. NumeFisier$ si Fn1 se definesc in cadrul
aplicatiei. In cazul in care se doreste deschiderea fisierului pentru scrierea datelor instructiunea are
forma:

Open NumeFisier$ For Output Access Write As #Fn1

4. Citirea datelor dintr-un fisier se poate face in mai multe moduri:

a. Secvential (linie dupa linie de la inceputul fisierului) utilizind instructiunea Line Input. Acest
mod permite cel mai sigur control asupra informatiei citite:

Line Input #Fn1, Variabila$

unde Fn1 este variabila numerica care contorizeaza numarul fisierului (conform pasului 2),
iar Variabila$ este o variabila de tip text care va contine informatia cuprinsa in linia citita din
fisierul extern. Ulterior in program, variabila de tip text citita din fisier (Variabila$) poate fi
analizata in termeni ai variabilelor componente separate prin caractere specificate (vezi
operatii cu variabile de tip text)

Astfel, pentru fisierul

cele doua linii sunt citite prin secventa de instructiuni:

Line Input #Fn1, X1$


Line Input #Fn2, X2$

In urma acestei secvente de citire variabilele de tip text X1$ si X2$ vor avea continutul:

X1$ = “Sandu Ion , 12344657679 , Bucuresti”


X2$ = “Mihai Gheorghe , 1426485696, Ploiesti”

In cazul in care nu se cunosc numarul de linii care sunt in fisierul extern se poate utiliza o
secventa de instructiuni utilizind un ciclu bazat pe secventa DO / LOOP:

i1 = 0
Do While Not EOF(Fn1)
i1 = i1 + 1
Line Input #Fn1, Tx(i1)
Loop

24
In aceasta secventa Fn1 este numarul corespunzator fisierului din care se face citirea (Pasul
2), i1 este un numar intreg care contorizeaza liniile citite, iar Tx(i1) este o variabila vectoriala
in care se stocheaza informatiile din fiecare linie a fisierului. EOF(Fn1) este o functie a
limbajului VBA care semnaleaza atingerea sfirsitului fisierului desemnat prin variabila
numerica Fn1.

In limbaj natural secventa de instructiuni de mai sus se poate exprima sub forma :
“Executa (DO) atit timp (WHILE) cit nu s-a ajuns la sfirsitul fisierului al carui numar este
Fn [Not EOF(Fn)] citirea linie cu linie (LINE INPUT) si atribuie continutul citit unei
variabile vectoriale de tip text Tx indexata dupa numarul liniei (i1)”

Separarea variabilelor text citite prin instructiunea Line Input in variabile text formate din
siruri de caractere separate prin caractere definite de utilizator (spre exemplu ,) se face
utilizind operatiile de manipulare a variabilelor text.

b. Secvential (variabila dupa variabila de la inceputul fisierului) utilizind instructiunea Input. In


general acest tip de citire se face cind variabilele din fisierul extern sunt numere separate intre
ele prin ”,” sau plasate, unul dupa altul in linii diferite:

Input #Fn1, A1, A2, A3

Spre exemplu, in cazul unui fisier in care sunt stocate date meteorologice zilnice conform
unei structuri in care fiecare linie a fisierului extern este de tipul:
An, Luna, Zi, Temperatura Medie, Temparatura maxima, Temperatura minima, Precipitatii,
Evapotranspiratie, Umiditate Aer, Durata de stralucire a soarelui

citirea si atribuirea datelor variabilelor din cadrul programului se poate face prin secventa:

For i_An = 1 To NrAni


25
For i_Luna = 1 to 12
For i_Zi = 1 to 365
Input #Fn1, An(i_An), Luna, Zi, Tav(i_An, i_Luna, i_Zi),
Tmax(i_An, i_Luna, i_Zi), Tmin(i_An, i_Luna, i_Zi),
Prec(i_An, i_Luna, i_Zi), Evap(i_An, i_Luna, i_Zi),
Umid(i_An, i_Luna, i_Zi), DSS(i_An, i_Luna, i_Zi),
Next i_Zi
Next i_Luna
Next i_An

In aceasta secventa se utilizeaza variabile matriciale pentru stocarea datelor climatice


depinzind de trei indici: an, luna, zi

5. Scrierea datelor intr-un fisier extern se face prin utilizarea instructiunilor Write si Print.
Instructiunea WRITE are sintaxa:

Write #Fn1, Lista variabile separate prin ,

Variabilele cuprinse in lista sunt scrise pe aceeasi linie in fisierul extern. O noua apelare a
instructiunii Write va scrie variabilele pe rindul urmator.

Spre exemplu daca dorim sa scriem variabilele


X1 = ” Sandu Ion"
X2 = "12344657679"
X3 = "Bucuresti"

pe un singur rind din fisierul exterior desemnat prin numarul Fn1 (vezi pasul 2) instructiunea va avea
forma:

Write #Fn1, X1, X2, X3

In fisierul exterior rindul corespunzator va avea forma:

"Sandu Ion","12344657679","Bucuresti"

Instructiunea PRINT permite un control mai mare asupra modului de scriere prin posibilitatea
introducerii in fisierul exterior a unor separatori intre variabile specificati de utilizator.
Structura generala a instructiunii este:

Print #Fn1, Lista de variabile separate prin , sau ;

Separarea prin virgula (,) introduce automat separatori de tip blanc intre valorile scrise in fisierul
extern. Separarea prin punct si virgula (;) scrie valorile in continuare fara separatori. Daca lista de
variabile dintr-o instructiune Print se termina cu ; atunci urmatoarea apelare a instrctiunii print va
scrie lista de variabile aferenta ei in continuarea liniei precedente.

Astfel daca instructiunea se scrie, pentru exemplul de mai sus, sub forma:

Print #Fn1, X1, X2, X3

linia scrisa in fisierul extern va avea forma:

Sandu Ion 12344657679 Bucuresti

26
Se remarca faptul ca variabilele text nu mai sunt scrise intre ghilimele. Separatorii dintre variabile
sunt in acest blancurile.

Daca in instructiunea Print separatorii dintre variabile sunt ;

Print #Fn1, X1;X2; X3

atunci linia scrisa in fisierul extern va fi:

Sandu Ion12344657679Bucuresti

Acelasi rezultat se poate obtine si prin utilizarea secventei:

Print #Fn1, X1;


Print #Fn1, X2;
Print #Fn1, X3

Introducerea de separatori specifici utilizatorului intre valorile scrise pe aceeasi linie in fisierul extern
se poate face in unul din modurile urmatoare:

Print #Fn1, X1, “!”, X2, “!”, X3

caz in care linia scrisa va fi:

Sandu Ion ! 12344657679 ! Bucuresti

Sau

Print #Fn1, X1; “!”; X2; “!”; X3

Caz in care linia scrisa va fi

Sandu Ion!12344657679!Bucuresti

6. Dupa incheierea instructiunilor de citire sau scriere, se recomanda inchiderea fisierului. Inchiderea
fisierului se face utilizind instructiunea Close:

Close #Fn1

Daca se utilizeaza instructiunea fara specificarea numarului fisierului (Fn1) care se inchide:

Close

Atunci sunt inchise toate fisierele deschise in cadrul aplicatiei.

Operatii cu variabile de tip text


Operatiile care pot fi efectuate cu variabile de tip text sunt:

1. Coincatenarea care este echivalentul adunarii din operatiile cu variabile numerice


Astfel daca avem doua variabile de tip text
A1$ = ”Operatii cu ”
A2$ = ”variabile de tip text”
27
Prin coincatenare realizata cu operatorul +:

A$ = A1$ + A2$

se obtine variabila de tip text:

A$ = ”Operatii cu variabile de tip text”


2. Eliminarea blancurilor de la inceputul sau sfirsitul unei variabile text:

A$ = Trim(VariabilaText)

Spre exemplu daca avem variabila:

B$ = ” Sandu Ion ”

Aplicarea instructiunii:

A$ = Trim(B$)

Va avea ca rezultat variabila text:

A$ = ”Sandu Ion”

3. Evaluarea numarului de caractere ale unei variabile text. Instructiunea utilizata in acest scop este:

X = Len(Expresie)

unde X este numele unei variabile numerice egala cu lungimea numarului de caractere continute in
variabila de tip text rezultata in urma evaluarii Expresiei.

Astfel daca:

A1$ = “Operatii cu “

atunci:

X1 = Len(A1$)

va avea valoarea 12.

Daca:

A1$ = ”Operatii cu ”
A2$ = ”variabile de tip text”

atunci:

X = Len(A1$+A2$)

va evalua numarul de caractere al variabilei text ”Operatii cu variabile de tip text” deci va avea
valoarea X=33.
Din aceste exemple rezulta ca in calculul numarului de caractere este inclus si spatiul
“ “.

28
4. Evaluarea pozitiei la care apare pentru prima data un caracter sau sir de caractere specificat de
utilizator. Forma generala a instructiunii care realizeaza aceasta evaluare este:

t = InStr(Start, VariabilaText, “Caracter”)

unde Start este o variabila numerica reprezentind prima pozitie de unde incepe cautarea (spre
exemplu daca se doreste cautarea de la inceputul variabilei text atunci Start=1, daca se doreste
cautarea incepind cu pozitia a 10a atunci Start=10), VariabilaText este variabila de tip text in care se
face cautarea, iar “Caracter” caracterul sau sirul de caractere care se cauta (spre exemplu “,”, “ , “).
In urma evaluarii instructiunii InStr se atribuie variabilei numerice t un numar reprezentind pozitia la
care apare prima data caracterul (sirul de caractere) specificat de “Caracter” incepind cu pozitia
Start in variabila text VariabilaText.

Exemple:
Sa presupunem ca in variabila text
A$ = ”SANDU ION,123445767,IASI”

Dorim sa aflam pozitia in care se afla caracterul ”,”

Variabila text poate fi reprezentata sub forma:

S A N D U I O N , 1 2 3 4 4 6 5 7 6 7 , I A S I
1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 26
0 1 2 3 4 5 6 7 8 9 0 2 3 4 5

unde primul rind reprezinta sirul de caractere al variabilei, iar rindul al doilea pozitia fiecarui caracter
in variabila.

Pozitia (t) la care apare prima data caracterul ”,” este data prin evaluarea expresiei din dreapta
semnului egal:

t = InStr(1, A$, “,”)

A doua aparitie (t1) a caracterului “,” este data de evaluarea expresiei:

t1 = InStr(t+1, A$, “,”)

In aceasta expresie cautarea incepe de la primul caracter dupa aparitia anterioara a caracterului dorit
(‘,”), adica t+1.

5. Extragerea unui sir de caractere consecutive dintr-o variabila text:

A1$ = Mid(A$, PozitieStart, LungimeExtragere)

unde: PozitieStart este o variabila numerica (sau numar) a carei valoare reprezinta pozitia de la care
incepe extragerea sirului de caractere, LungimeExtragere este o variabila numerica (sau numar) egala
cu numarul de caractere care sunt extrase din variabila text A$.
Ca exemplu sa segmentam variabila :

A$ = ”SANDU ION,123445767,IASI”

in trei variabile text care sa contina caracterele separate prin virgula. Pasii care trebuiesc efectuati in
acest sens sunt:
• Calculul pozitiei la care apare prima data caracterul separator considerat (,):

29
t = InStr(1, A$, “,”)

• Extragerea sirului de la inceputul variabilei A$ si pina la prima aparitie a caracterului de


separatie “,”:

A1$ = Mid(A$, 1, t-1)

unde 1 este pozitia in variabila A$ de la care incepe cautarea (inceputul variabilei), iar t-1 este
lungimea sirului de caractere care este extras. Variabila text A1$ va avea valoarea”SANDU
ION”

• Calculul pozitiei celei de a doua aparitii a caracterului de separatie “,”:

t1 = InStr(t+1, A$, “,”)

• Extragerea sirului de caractere cuprins intre cele doua caractere de separare:

A2$ = Mid(A$, t+1, t1-t-1)

unde t+1 reprezinta pozitia primului caracter de la dreapta primei virgule(,) incepind cu care
se face extragerea, iar t1-t-1 reprezinta lungimea sirului de caractere care este extras.
Variabila text A2$ va avea valoarea “123445767”

• Extragerea sirului de caractere dupa a doua apariti a virgulei si pina la capatul variabilei text
A$:

A3$ = Mid(A$, t1+1)

In cazul in care extragerea se face pina la capatul variabilei nu mai este necesara specificarea
lungimii sirului de caractere. Variabila A3$ va primi valoarea “IASI”
6. Transformarea unei variabile text in numar:

X = Val(VariabilaText)

Astfel daca

A2$ = “123445767”

Atunci:

X = Val(A2$)

va avea ca valoare numerica X = 123445767

7. Transformarea unei variabile numerice in variabila text:

A$ = Str(VariabilaNumerica)

Astfel, daca:

X = 123.457

atunci:

30
A$ = Str(X)

va avea valoarea A$ = “123.457”

Operatiile cu variabile text prezentate sunt deosebit de utile in citirea si/sau scrierea variabilelor din/in
fisiere externe.

Instructiunea FOR / NEXT


In cazul in care se doreste repetarea unui ciclu de operatii care depind de un indice exprimabil printr-un
numar intreg poate fi utilizata secventa de instructiuni FOR / NEXT a carei sintaxa este:

FOR Indice = StartValue TO StopValue STEP PasIndice


{Bloc de Instructiuni}
NEXT Indice

In aceasta secventa de instructiuni Indice, StartValue, StopValue si PasIndice sunt numere intregi (sau
variabile care iau valori numere intregi). Ciclul FOR / NEXT poate fi executat in ordinea crescatoare a
indicelui (in acest caz StartValue < StopValue si PasIndice>0) sau in ordine descrecatoare
(StartValue>StopValue si PasIndice < 0).

Tradusa in limbaj comun secventa de instructiuni precedenta poate fi exprimata sub forma:

“Pentru (FOR) valori ale Indicelui incepind cu StartValue pina la StopValue executa pe rind Blocul de
instructiuni. Indicele variaza la fiecare repetare a executiei blocului cu valoarea PasIndice”.

In executarea secventei de instructiuni, programul atribuie parametrului Indice valoarea StartValue. Se


executa Blocul de Instructiuni, dupa care valoare parametrului Indice este crescuta cu PasIndice. Daca noua
valoare este mai mare decit StopValue atunci se iese din ciclu. Daca nu ciclul se reia cu noua valoare pentru
Indice, s.a.m.d. pina la iesirea din ciclu.

Ex:

Pentru executarea {Bloc Instructiuni} pentru valorile I=1, 3, 5, 7, 9 se poate utiliza ciclul:

FOR I = 1 to 9 STEP 2
{Bloc Instructiuni}
NEXT I

Pentru executarea {Bloc Instructiuni} pentru valorile I=10, 8, 6, 4, 2, 0 instructiunile sunt:

FOR I = 10 TO 0 STEP -1
{Bloc Instructiuni}
NEXT I

Daca PasIndice este 1 valoarea poate sa nu mai fie scrisa in instructiune:

FOR Indice = StartValue TO StopValue


{Bloc de Instructiuni}
NEXT Indice

In continuare vom exemplifica secventa de instructiuni FOR / NEXT prin evaluarea mediei a n valori stocate
in vectorul X(i), I=1,n:

31
Suma = 0
For I = 1 TO n
Suma = Suma + X(i)
Next I
Medie = Suma / n

Executia programului se face conform urmatoarei secvente


0. Suma = 0
1. I = 1
2. Suma = 0 + X(1)
3. I = 2
4. Suma = [0 + X(1)] + X(2)
5. I = 3
6. Suma = [0 + X(1) + X(2)] + X(3)
………………
I=n
Suma = [0 + X(1) + X(2) + … + X(n-1)] + X(n)
I=n+1
I > n, deci se incheie ciclul

INSTRUCTIUNEA WHILE / WEND


Secventa de instructiuni While / Wend, avind sintaxa:

While Conditie
{Bloc de Instructiuni}
Wend

unde Conditie este o expresie a carei evaluare conduce la o valoare logica de tip “Adevarat” sau “Fals” poate
fi transpusa in limbaj normal sub forma:

“Atunci cind rezultatul evaluarii expresiei inclusa in Conditie este adevarat atunci executa Blocul de
instructiuni. Daca rezultatul evaluarii expresiei inclusa in Conditie este fals se iese din ciclu”

In continuare vom exemplifica secventa de instructiuni WHILE / WEND prin evaluarea mediei a n valori
stocate in vectorul X(i), I=1,n:

Suma = 0
I=0
While I < n
I=I+1
Suma = Suma + X(I)
Wend
Medie = Suma / n

Un exemplu de utilizare a instructiunii While / Wend este dat in capitolul referitor la citirea datelor dintr-un
sheet (Exemplu 4).

INSTRUCTIUNEA DO / LOOP
Secventa de instructiuni DO / LOOP avind una din sintaxele urmatoare:

DO WHILE Conditie

32
{Bloc de Instructiuni}
LOOP

Sau

DO UNTIL Conditie
{Bloc de Instructiuni}
LOOP

Executa {Bloc de Instructiuni} atita timp cit (WHILE) sau pina cind (UNTIL) expresia din Conditie este
Adevarata

Drept exemplu de utilizare a acestei instructiuni


With Sheets("Input")
i1 = 1
Do While .Cells(i1, 1) <> ""
X(i1) = .Cells(i1, 1).Value
i1 = i1 + 1
Loop
n = i1 - 1

End With

INSTRUCTIUNEA IF / END IF

BUTOANE
In sheet-rile aplicatiilor de tip workbook pot fi inserate butoane carora le pot fi asociate macro-functii
realizate in VBA.
Pentru crearea unui buton intr-un sheet trebuie parcursi urmatorii pasi:
• Activarea printr-un click al mouse-ului a optiunii Forms din meniul Toolbars activat din
meniul principal View

33
• In urma activarii optiunii Forms pe ecran apare caseta cuprinzind toate formele care se pot
insera in sheet.

• Cursorul mouse-ului se plaseaza pe forma corespunzatoare butoanelor.

34
• Prin apasarea butonului mouse-ului pe forma corespunzatoare butoanelor cursorul mouse-ului
isi modifica forma permitind desenarea prin procedeul drag & drop a butonului. Se deschide
de asemenea o fereastra care are lista macro-urilor realizate in VBA in cadrul aplicatiei. Se
poate selecta macro-ul a carei pornire se doreste asociata cu activarea butonului realizat
(selectarea numelui din lista urmata de ok) – aceasta operatie se poate face si ulterior (caz in
care caseta se inchide prin tastarea butonului Cancel)

• Prin click mouse dreapta pe butonul realizat se poate deschide un meniu de editare al
butonului. Optiunea Edit Text permite editarea textului scris in caseta butonului. Optiunea
Format Control permite modificarea fontului textului butonului, a dimensiunilor butonului
sau a centrarii textului (orizontl si vertical).

35
Macro-functiile care pot fi atasate butoanelor pot sa fie oricare din programele realizate in editorul VBA. In
acest mod aplicatiile realizate devin usor de manipulat de catre utilizatori.

INREGISTRAREA AUTOMATA A MACRO-FUNCTIILOR


Posibilitatea inregistrarii automate sub forma unui macro VBA a operatiilor pe care utilizatorul le executa in
cadrul unui workbook este deosebit de utila pentru dezvoltarea unor aplicatii complexe.

In vederea initierii procedurii de inregistrare automata a operatiilor care sunt efectuate in cadrul unui
workbook se apeleaza optiunea “Record New Macro” din meniul Tools:

In urma apelarii acestei optiuni pe ecran apare o fereastra pentru editarea numelui sub care se va inregistra
Macro-functia, precum si optional combinatia de taste <CTRL+Caracter alfabetic> destinata apelarii rapide
a Macro-ului (short-cut):

36
Dupa iesire din acest editor (prin tastarea butonului “OK”) pe ecran apare fereastra
care arata faptul ca inregistrarea instructiunilor care sunt efectuate in Sheet este activa.
In momentul in care se doreste stoparea inregistrarii instructiunilor se apasa (click
mouse) butonul Stop din aceasta fereasta de inregistrare.

Citeva exemple vor arata utilitatea acestei optiuni pentru realizarea unor aplicatii
complexe.
• Sa presupunem ca se inregistreaza succesiunea de instructiuni pentru deschiderea unui
workbook si copierea unor date din sheet-urile acestuia intr-un sheet din aplicatia curenta. Se
prezinta in continuare operatiile efectuate in cadrul sheet-ului si imaginea lor in instructiuni
VBA scrise automat de acest utilitar.
Deschiderea fisierului “Griu.xls” prin utilizarea instructiunii Open:

este inregistrata automat in editorul Visual Basic sub forma:

37
Selectarea coloanelor A:G efectuata in workbook-ul deschis este transcrisa automat in editorul VBA sub
forma:

Copierea coloanelor selectate (Edit/Copy) se traduce automat in editorul VBA:

38
Reintoarcerea la workbok-ul initial (“Book1”) si lipirea continutului coloanelor copiate (Edit/Paste)

39
Revenirea la workbook-ul “Griu.xls” si inchiderea acestuia (File/Close) este transpusa de asemenea in
macrofunctia scrisa automat:

Oprirea editarii operatiilor care se efectueaza in continuare in workbook se face prin tastarea butonului
din fereastra deschisa la initierea procedurii de inregistrare automata a unui macro.

40
Codul rezultat poate fi vizualizat dupa cum am vazut, in editorul VBA. Acest cod este bineinteles
particularizat pentru seria de operatii efectuate pe parcursul inregistrarii:

Sub Macro1()
Workbooks.Open Filename:="C:\My Documents\Griu.xls"
Windows("Griu.xls").Activate
Columns("A:G").Select
Selection.Copy
Application.CutCopyMode = False
Windows("Book1").Activate
Range("A1").Select
Application.CutCopyMode = False
ActiveSheet.Paste
Windows("Griu.xls").Activate
ActiveWorkbook.Close
Windows("Book1").Activate
End Sub

Pornind de la acest cod se poate obtine o aplicatie generalizata care sa poata fi utilizata si in alte configuratii
de fisiere, sheet-uri sau coloane care se copiaza. Textul scris cu rosu din programul urmator arata locul in
care au fost modificate instructiunile originale inregistrate automat, in scopul generalizarii programului:

Sub Macro1()
NumeFisier = "C:\My Documents\Griu.xls"
NumeWorkbook = "Griu.xls"
DomeniuCopiat = “A:G”
DomeniuPaste=”A1”
Workbooks.Open Filename:= NumeFisier
Windows(NumeWorkbook).Activate
Columns(DomeniuCopiat).Select
Selection.Copy
Application.CutCopyMode = False
Windows("Book1").Activate
Range(DomeniuPaste).Select
Application.CutCopyMode = False
ActiveSheet.Paste
Windows(NumeWorkbook).Activate
ActiveWorkbook.Close
Windows("Book1").Activate
End Sub

Se constata ca numele fisierului care se deschide si domeniile atribuite


instructiunilor Copy si Paste pot fi incluse in variabile text definite de
utilizator. Aceste variabile pot fi furnizate de utilizator dintr-un sheet, citirea
lor facindu-se utilizind procedurile descrise la capitolul privind citirea datelor
din sheet-uri.
Astfel, daca informatiile necesare sunt introduse prin sheet-ul “Sheet2”
conform imaginii alaturate, atunci subrutina anterioara se poate modifica
astfel

Sub Macro1()
With Sheets(“Sheet2”)
UnitateDisc = .Cells(1,4).Value
Director = .Cells(2,4).Value
Wbook = .Cells(3,4).Value

41
StartColumn = .Cells(4,4).Value
EndColumn = .Cells(5,4).Value
DomeniuPaste = .Cells(6,4).Value
End With
NumeFisier=UnitateDisc+”:\”+Director+”\”+Wbook
NumeWorkbook = Wbook
DomeniuCopiat=StartColumn+”:”+EndColumn
Workbooks.Open Filename:= NumeFisier
Windows(NumeWorkbook).Activate
Columns(DomeniuCopiat).Select
Selection.Copy
Application.CutCopyMode = False
Windows("Book1").Activate
Range(DomeniuPaste).Select
Application.CutCopyMode = False
ActiveSheet.Paste
Windows(NumeWorkbook).Activate
ActiveWorkbook.Close
Windows("Book1").Activate
End Sub

unde textul scris cu albastru reprezinta instructiunile scrise pentru citirea variabilelor text utilizate in
program.
• Inregistrarea automata a operatiilor care se fac pentru reprezentarea grafica a datelor conduc
la o macro-functie deosebit de utila pentru aplicatii ulterioare. Spre exemplu sa presupunem
ca dorim sa reprezentam grafic doua siruri de valori (Y1 si Y2) in functie de variabila
independenta X.

Dupa activarea optiunii pentru inregistrarea automata a unui macro, operatiile efectuate pentru reprezentarea
grafica a sirurilor de date:

42
1. Click Chart 2. Selectati Chart type, then press Next

3. Selectati Series, apoi click Next 4. Click Add, apoi Next

5. Completati casetele pentru: 6. Procedati similar pct. 5 pentru a doua


X value, Y value si Name. variabila
Pentru inserarea unei noi serii presati Add Click Next

43
7. Completati casetele privind Titlul graficului, numele variabilei X si Y
Click Finish

Codul scris automat in editorul VBA corespunzator pasilor 1-7 executati de utilizator pentru reprezentarea
grafica a datelor este urmatorul:

Sub Macro1()
Charts.Add
ActiveChart.ChartType = xlXYScatter
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(1).XValues = "=Sheet1!R2C1:R16C1"
ActiveChart.SeriesCollection(1).Values = "=Sheet1!R2C2:R16C2"
ActiveChart.SeriesCollection(1).Name = "=""Y1"""
ActiveChart.SeriesCollection(2).XValues = "=Sheet1!R2C1:R16C1"
ActiveChart.SeriesCollection(2).Values = "=Sheet1!R2C3:R16C3"
ActiveChart.SeriesCollection(2).Name = "=""Y2"""
ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "Exemplu"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "X"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Y"
End With
End Sub

44