Documente Academic
Documente Profesional
Documente Cultură
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.
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
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
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”:
Spre exemplu, daca sheet-ul in care se doreste citirea/scrierea datelor are numele “Sheet1” atunci
instructiunea va avea forma:
8
With Sheets(“Sheet1”)
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):
{Bloc de instructiuni}
End With
Celule
Exista trei moduri de apelare si editare a caracteristicilor unei celule dintr-un sheet specificat:
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.
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
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
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:
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
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
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
“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
Sheets(VariabilaText).Select
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
• 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
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
Sheets("Sheet1").Select
Range("B2:D2").Select
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
Sheets("Sheet1").Select
Range("B2:D2").Select
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
Sheets("Sheet1").Select
Range("B2:D2").Select
With Selection.Borders(xlEdgeTop)
.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
.Weight = xlMedium
se foloseste instructiunea:
.Weight = xlThin
.ColorIndex = xlAutomatic
15
cu instructiunea:
.ColorIndex = ColorNumber
.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
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
Sheets(VariabilaText).Select
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
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
With Sheets(“NumeSheet”)
With Cells(Rind, Coloana)
.Font.Bold = True
End With
End With
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
Sheets(VariabilaText).Select
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).
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).
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
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)
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
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
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
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
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:
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:
a. Secvential (linie dupa linie de la inceputul fisierului) utilizind instructiunea Line Input. Acest
mod permite cel mai sigur control asupra informatiei citite:
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)
In urma acestei secvente de citire variabilele de tip text X1$ si X2$ vor avea continutul:
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.
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:
5. Scrierea datelor intr-un fisier extern se face prin utilizarea instructiunilor Write si Print.
Instructiunea WRITE are sintaxa:
Variabilele cuprinse in lista sunt scrise pe aceeasi linie in fisierul extern. O noua apelare a
instructiunii Write va scrie variabilele pe rindul urmator.
pe un singur rind din fisierul exterior desemnat prin numarul Fn1 (vezi pasul 2) instructiunea 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:
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:
26
Se remarca faptul ca variabilele text nu mai sunt scrise intre ghilimele. Separatorii dintre variabile
sunt in acest blancurile.
Sandu Ion12344657679Bucuresti
Introducerea de separatori specifici utilizatorului intre valorile scrise pe aceeasi linie in fisierul extern
se poate face in unul din modurile urmatoare:
Sau
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
A$ = A1$ + A2$
A$ = Trim(VariabilaText)
B$ = ” Sandu Ion ”
Aplicarea instructiunii:
A$ = Trim(B$)
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$)
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:
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”
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:
In aceasta expresie cautarea incepe de la primul caracter dupa aparitia anterioara a caracterului dorit
(‘,”), adica t+1.
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$, “,”)
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”
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$:
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$)
A$ = Str(VariabilaNumerica)
Astfel, daca:
X = 123.457
atunci:
30
A$ = Str(X)
Operatiile cu variabile text prezentate sunt deosebit de utile in citirea si/sau scrierea variabilelor din/in
fisiere externe.
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”.
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
FOR I = 10 TO 0 STEP -1
{Bloc Instructiuni}
NEXT I
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
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
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.
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.
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:
37
Selectarea coloanelor A:G efectuata in workbook-ul deschis este transcrisa automat in editorul VBA sub
forma:
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
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
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