Upload
borzasi-daniel-zoltan
View
219
Download
0
Embed Size (px)
Citation preview
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 1/59
Visual Basic pentru
aplicaţiiMicrosoft Access 2013
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 2/59
BASIC sau Beginner's All-purpose Symbolic Instruction Code
-apare 1963
-este un limbaj simplu, creat de John G !emen" si #homas $ !urt% de la &artmouth
Colle'e
-a (ost scris pentru a permite pro'ramarea c)t mai simpl* pentru studen+i i ncep*tori,
Visual Basic pentru Aplicaţii - VBA - a fost transformat de firma
.icroso(t n limbajul de pro'ramare al ntre'ii (amilii de produse .icroso(t /((ice
0Access, $cel, 2ord, o4eroint5
ucleul limbajului, componentele sale i mediul sunt aceleai pentru toate
aceste aplica+ii, o(erind n plus, (a+* de macro comen%i urm*toarele (acilit*+i7
1 apelarea (unc+iilor AI8
tratarea erorilor8
3 manipularea datelor din ba%* de date sub controlul unor instruc+iuni (olosind metodede acces la date speci(ice sau 'enerale8
: manipularea structurii ba%ei de date prin pro'ram
.acro comen%ile o(er* solu+ii rapide i simple, dar cu limit*ri multiple
;imbajul <BA o(er* (acilit*+i i control mai e(icace asupra ac+iunilor pe care le
derul*m cu datele din ba%*
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 3/59
Programare orientată peevenimente
În programarea procedurală tradiţională,1. controlul evoluţiei programului este determinat chiar de el nsu!i.2. "#ecuţia ncepe cu prima instrucţiune !i urmea$ă o linie secvenţială
sau cu salturi% n funcţie de instrucţiunile programului.
În programarea orientată pe evenimente,1.acţiunile utili$atorului sau ale sistemului pe care se e#ecută programulgenerea$ă evenimente.2.Pentru a cunoa!te care porţiune de cod este e#ecutată% tre&uie să !tim ceeveniment a apărut%3.iar dacă sunt mai multe% ordinea lor de apariţie.
Esenţa interfeţelor grace cu utilizatorul şi a programării orientatepe evenimente:
porţiunea de cod executată la un moment de timp depinde deacţiunile utilizatorului
Pentru că nu se poate !ti ce va face utili$atorul%codul tre&uie să facă anumite presupuneri cu privire la starea mediului n
care funcţionea$ă.'in acest motiv codul (
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 4/59
Proceduri de evenimente(Event Procedures)
Access
1 recunoate apari+ia unui e=eniment de (ormular, raport sau control,
apelea%* automat procedura de e=eniment denumit* dup* numele obiectului i al
e=enimentului care a ap*rut
$emplu7
umele procedurii de tratare a e=enimentului =a (i
Form_Click n situaţia unui
(ormular 0Form! "i e#eniment clic $Click!
%eport_Click n situaţia unui
raport0%eport! "i e#eniment clic $Click!Ie"ire_Click n situaţia unui
un &uton cu numele eşire şi evenimentul care tratează esteevenimentul !lic"
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 5/59
&umele obiectelor sunt stocate n
proprietatea &ame se modific( nainte de scrierea primei proceduri de e=eniment
dac* se modi(ic* numele obiectului dup* ce s-a scris o procedur* de e=eniment, at
trebuie s* se modi(ice i numele procedurilor scrise p)n* atunci
&eci, Access-ul (olosete aceeai strate'ie pentru construirea numelor procedurilor de
e=enimente7
#u$ şi End #u$ marc%ează &nceputul şi sf'rşitul procedurii
!uvintele care1.urmea$ă pe aceea!i linie cu #u$ sunt numele procedurii de
eveniment,iar instrucţiuni repre$intă codul scris de programator prin care se
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 6/59
utilizator (*eneral
Procedures)Access-ul permite
• crearea de proceduri de(inite de utili%ator,• care trebuie apelate eplicit, prin cod, pentru ca s* (ie eecutate•nu sunt le'ate de e=enimentele 'enerate de utili%ator, ci de anumite 'rupuri de linii de
pro'ram care se repet* n mai multe locuri
$liminarea duplic*rii acestor linii se (olosesc proceduri de tipul (unc+ie
0Function! sau subrutin($Sub!)
*rocedurile utili+ator pot fi create oriunde
n formulare rapoarte sau module 0,odules!)
,odulul este un obiect Access care stocea+( numai proceduri de(inite de utili%ator
rocedurile din module pot (i re(erite din orice alte obiecte Access, n timp, permi+)nd scrierea
unor biblioteci de proceduri utile pentru re%ol=area unor sarcini care se repet* des
> deschide+i o ba%a de date Access.
> clic pe butonul ,odules din fereastra ba+ei de date.
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 7/59
Pas2. clic pe &utonul +e pentru a crea
as3 se selectea%* *rocedure))) Insert *rocedure a fi a(iat*
(ereastra de dialo'7 in care se completea%*
numele Procedurii în Name: Exemplu şi în Type: Sub
Scope: Public
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 8/59
numele Procedurii în Name: Ex şi în Type: Function Scope: Public
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 9/59
Procedurile de tipul #u$ sau-unction
Procedura #u$
. nu &ntoarce valoare2. )ind asemănătoare unei instrucţiuni.3. procedurile de eveniment sunt ntotdeauna de tipul #u$
Procedura -unction1. ntoarce o valoare.2. se utili$ea$ă c,nd se calculea$ă valori de e#presii tipul procedurii va )
-unction.
inta#a procedurii #u$ este:
numeprocedură //umele proceduriiinstrucţiuni -se numesc corpul procedurii.
parametri sunt o listă de nume de parametri separate prin virgule.&s(-iecare parametru respectă sinta#a declaraţiei de varia&ilă !i esteechivalentul unei varia&ile n corpul procedurii.
inta#a pentru )ecare parametru este(
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 10/59
---tip: oricare dintre tipurile fundamentale de date
(Integer, Long, Single, Double, Currency, String, Variant sau Obiect).
---dac tipul nu este specificat e!plicit, parametrul "a a=ea tipul Variant
care poate stoca orice tip de date.
---parante#ele drepte specific faptul c elementele cuprinse ntre elesunt op+ionale
---parante%ele rotunde op+ionale dup* nume#ariabil* indic* un
ar'ument de tipul tablou
rocedura de tipul Sub se apelea+( prin numele ei "i
prin specificarea parametrilor ei
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 11/59
"#emplurocedura de tipul Sub se apelea+(prin numele ei "i prin specificarea
parametrilor ei
&e eemplu, procedura Sub cu numele &umara/
1.Va ) apelată prin +umara 0
2."#ecuţia procedurii !i re$ultatele ei se a)!ea$ă nfereastra MM"'A".3. e apasă !trl1*, apoi n ferestra se scrie +umara 0după care se apasă Enter
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 12/59
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 13/59
inta#a procedurii -unction este:
Semni(ica+ia elementelor sintactice ale procedurii Function sunt
acelea"i cu cele ale procedurii Sub cu urm(toarele e0cepţii/
1 procedurile Function asemenea #ariabilelor au tipuri de date care
determin( tipul =alorii ntoarse8
=aloarea se ntoarce atribuind numelui procedurii Function o #aloare
n corpul (unc+iei <aloarea ntoars* de procedura Function prin
numele ei se poate folosi n e0presii.
3 ar'umentele procedurii Function se scriu ntotdeauna ntre
parante+e rotunde)
funcţie 2rie!erc pentru calculul ariei unui cerc de ra$ă3, codul corespun$ător unei implementări prin procedura
-unction este:
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 14/59
""MP45
* d i i t $* i t ! i bli $* bli !
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 15/59
*roceduri pri#ate $*ri#ate! "i publice $*ublic!
$rocedurile unui formular sau raport sunt pri"ate,
pot (i (olosite numai n epresii ale codului con+inut de
(ormularul sau raportul n cau%*
$rocedurile unui modul sunt publice,
pot (i apelate din orice por+iune a aplica+iei, mai pu+in n
ca%ul n care au (ost (*cute pri=ate prin (olosirea lui*ri#ate naintea de Sub sau Function)
1bs/
1umele procedurilor publice trebuie s* (ie unice ntr-oaplica+ie
2) procedurile formularelor "i rapoartelor sunt pri=ate ?@ se
pot scrie proceduri cu acelai nume n (ormulare sau rapoarte
distincte
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 16/59
4aria$ile-i modi(ic* =aloarea n timpul eecu+iei pro'ramului-se de(inesc prin numme, tip i =aloare
-ntr-o =ariabil* se re+ine ntotdeauna ultima =aloare atribuit* acesteia
Sintaa declara+ie =ariabil*7
&ume #ariabil( trebuie s( nceap( cu o liter( "i nu poate conţine
spaţii sau punct +ecimal)
<ariabilele declarate cu 3im e0ist( at4t timp c4t se eecut* procedura
n care au (ost declarate
tipul Variant permite s se memore#e orice tip de =aloare7 num*r, tet,dat*, ir
.3im i
3im 5 As Integer
3 3im 0 As 3ouble
: 3im sir As String
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 17/59
Scop "i durat( de e0istenţ(
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 18/59
5ipuri de date#ipul determin* =alorile pe care =ariabila le poate stoca&ac* tipul nu este speci(icat, implicit, <BA asocia%* =ariabilei tipul
Variant.
6) 7ipul Variant- =ariabilele de tipul Variant pot stoca date de tipul numeric, ir,
dat*or*, =alori &ull
- se poate determina dac* =aloarea stocat* ntr-un tip Variant este
-numeric prin (unc+ia Is&umeric$!
- de tip dat( prin (unc+ia Is3ate$! )
- <ariabilele Variant au "aloarea Empty din momentul în care s-au declarat
i p)n* c)nd le-am atribuit o =aloareVariant cu "aloarea Empty într-o expresie este echivalentă cu valoarea numerică !
- prin (unc+ia Is8mpty$!
<ariabila Variant poate con%ine "aloarea special Null!
"ceasta se (olosete n ba%a de date pentru a marca datele lips* sau necunoscute
C)mpurile i controalele care nu au (ost ini+iali%ate au =aloarea implicit* &ull)- funcţia Is&ull$!)
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 19/59
ipuri /umerice
#ipul speci(ic*
1 ce (el de =alori poate lua o =ariabil*
domeniul n care pot =aria =ariabila3 operatorii care pot a=ea ca operan%i aceste =ariabile
: i spa+iul de A. ce se (olosete pentru stocarea =ariabile
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 20/59
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 21/59
5ipul 6ir<ariabilele care con+in un tet se declar* de tipul ir 0String).
3im sir As String
irul se poate atribui unei =ariabile de tipul ir i poate (i manipulat prin (unc+iispeci(ice
irurilor de caractere
sir9:Salut bade;:
sir9%igt<$=!
<ariabil* de tipul ir are lun'imea =ariabil*, adic* lun'imea ei poate crete dac*se adau'* noi date n =ariabil*
&eclararea de =ariabile ir cu lun'ime (i* prin (olosirea sintaei7
3im linie As String>?@
&ac* un ir mai scurt se atribuie unuia mai lun', caracterele lips* se
completea%* automat cu spa+ii&ac* un ir mai lun' se atribuie unuia mai scurt caracterele n plus se
trunchia%*
irurile cu lun'ime (i* se completea%* automat n unele opera+ii cu spa+ii,
eist* un set de (unc+ii utile pentru eliminarea acestora7
7rim$! %7rim$! 7rim$!)
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 22/59
5ipul dată7orăVariabilele de tipul dat( se stochea%* pe D octe+i sub (orm* de numere reale
•au domeniul ntre 1 ianuarie 1EE i 31 decembrie 9999•ora de la E7EE7EE la 37F97F9
Constantele de tipul dat* trebuie cuprinse ntre caractere nainte de a (i atribuite
=ariabilelor de tipul dat* sub (orma 111999
Aceste =ariabile se a(iea%* con(orm set*rilor (ormatului sort date recunoscute de
calculator
/rele =or (i i ele a(iate con(orm set*rilor (ormatului de timp recunoscut de
calculator 01 ore sau : de ore5
&atele pot (i adunate sau sc*%ute (olosind (unc+iile 3ateAdd$! "i 3ate3iff$!)
iua luna "i anul pot fi e0trase folosind funcţiile 3ay$! ,ont$! "i ear$!)
Funcţia &oD$! ntoarce data "i ora curent()
1peraţii de formatare pot fi (*cute asupra datelor (olosind (unc+ia Format$!)
Funcţiile 3ateSerial$! "i 7imeSerial$! se pot (olosi pentru crearea unor date i ore
din =alori numerice ntre'i
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 23/59
5ipul 8$9ect
se stochea%* pe : octe+i i are ca =aloare adresa unui obiect
Holosind instruc+iunea Set o #ariabil( declarat( de tipul
#b$ect va putea stoca adresa oricărui obiect!
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 24/59
eclararea ta$lourilor
matrice de 1E1E se declar* ast(el7
3im ,atrice$EE! As 3ouble
sau3im ,atrice6$6 7o 6@ 6 7o 6@! As 3ouble
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 25/59
!onstante
A Constantele simbolice sunt create de programator)
u i modi(ic* =aloarea n timpul eecu+iei pro'ramului
Sintaa pentru de(inirea constantelor simbolice
B Constantele intrinseci sunt definite de cei care au scris
<BA i se =i%uali%ea%* (olosind &a#igatorul de 1biecte
$1b5ect BroDser!) umele acestora trebuie s* (ie unic i sunt disponibile n toate
modulele aplica+iei
8 i
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 26/59
8peratori$presiile sunt (ormate din sec=en+e de operatori i operan%i
rm*toarele 'rupe de operatori sunt prede(ini+i n <BA7
• aritmetici8• de compara+ie• de concatenare•lo'ici
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 27/59
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 28/59
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 29/59
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 30/59
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 31/59
/65785/If)))7en
Se (olosete pentru eecu+ia condi+ional* a unei instruc+iuni sau a unui'rup de instruc+iuni
Sintaa este7
Condiţie este de obicei o comparaţie, dar poate f orice
expresie care se evaluează la o valoare numerică.'acă valoarea numerică este 0% VBA i atri&uie valoarea deadevăr -alse,dacă este nenulă% valoarea de adevăr atri&uită de VBA este5rueacă condiţie este True se execută instrucţiune sau
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 32/59
f5%enElse
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 33/59
f5%enElsee folose!te pentru e#ecuţia condiţiontă a unui grup de instrucţiuni dintremai multe grupuri.
Se testea%* condi%ie&.
Dac este False% se testea&ă condi'ie( şi aşa mai departe p)n* la
'*sirea unei condi+ii 7rue)
C4nd s-a g(sit o astfel de condiţie se e0ecut( grupul de instruc+iuni
instruc%iuni'!, apoi se sare la codul imediat urmtor lui End )*!
#p'ional se poate un 8lse la care se #a trece numai dac( nu s-a g(sit
nici o condiţie 7rue)
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 34/59
Select)))Case
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 35/59
Select)))Case
- este o alternati=* pentru scrierea de If 7en 8lse -uri lungi asigur4nd o citire mai
uoar* a codului
•este o singură e#presie de test expresietest care se evaluează o dată laintrarea în instrucţiune.•se compară valoarea acestei e#presii cu valoarile din )ecare !ase acăse găse!te o egalitate va e#ecuta instrucţiunile asociate !ase/uluirespectiv•4istele de e#presii listaexpresie conţin una sau mai multe valori. 'acă
e#istă mai mult de o valoare n listă% tre&uie separate prin virgule. -iecaregrup de instrucţiuni instrucţiuni_x conţine nici una% una sau mai multeinstrucţiuni.
#elect !ase evaluează pe expresietest o singură dată la început, cuIf Then ElseIf se pot evalua e#presii diferite pentru )ecare Elsef
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 36/59
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 37/59
nstrucţiuni de ciclare-permit eecutarea repetat* a unei instruc+iuni sau 'rup de instruc+iuni uneori denumite
i corpul ciclului, at)ta timp c)t o condi+ie r*m)ne ade=*rat* <BA suport* urm*toareleinstruc+iuni de ciclare7
3o)))oop
For)))&e0t
For 8ac)))&e0t
ile)))end
Ciclul 3o)))oop
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 38/59
C c u o))) oop
epet* un 'rup de instruc%iuni ct timp o condi%ie este True sau devine True!
rm*toarele (orme de cicluri 3o)))oop sunt #alide/
condi%ie este o e!presie numeric sau ir op%ional care este True sau False! +acă condi'ie ia =aloarea &ull este eci#alent( cu False) Cu#intele ntre acolade
repre+int( alternati#e adic( unul dintre ele poate s* (ie scris• entru ile instruc'iuni se execută at,ta timp c,t condi%ie este True%
• Pentru ntil instruc'iuni se execută c,t timp condi'ie nu este True!
80it 3o produce ie"irea din ciclul 3o)))oop nainte de reali+area condiţiei dep(r(sire a ciclului
Controlul este dat instruc+iunii imediat urm*toare ciclului, prima linie dup* oop sau
oop GHile JntilK condi'ie.!
"l doilea tip de ciclu se execută cel pu'in o dată pentru că condi%ie, prin care se face
testarea terminri, se atinge numai dup e!ecu%ia instruc%iunilor.
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 39/59
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 40/59
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 41/59
Ciclul For 8ac)))&e0t
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 42/59
Ciclul For 8ac)))&e0t
epet* un 'rup de instruc%iuni pentru fiecare element de tablou sau
colec%ie.
&. element este o "ariabil folosit pentru parcurgerea iterati" a elementelor
din grup.
*. $entru colec+ii, element poate fi numai de tip Variant, "ariabil obiect
generic sau "ariabil obiect speci(ic
. grup este numele unei colec%ii de obiecte sau tablou.
For Each!!!Next se începe numai dac* n grup este cel pu%in un element. Dac
e!ist mai multe elemente, instruc'iuni sunt repetate pentru fiecare element
pn la parcurgerea tuturor elementelor, c)nd ciclul se termin* s*rindu-se
la instruc+iunea imediat urm*toare lui
80it For produce ie"irea forţat( din ciclu cu saltul la instrucţiunea imediat
urm(toare ciclului)
Ci l l il d
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 43/59
Ciclul ile)))end
$ecut* instruc%iuni ct tip condi%ie este True!
•condi%ie este o e!presie numeric sau ir care se e"aluea# la True sau
False!•instruc%iuni repre#int una sau mai multe instruc%iuni care "or fi
e!ecutate ct timp
•condi%ie este True! /ontrolul revine la condi'ie după o execu'ie a
corpului ciclului *ormat din•instruc%iuni cnd se "erific dac condi%ie este +nc True! +acă da%
procesul se repetă%•alt(el se eecut* instruc+iunea urmtoare lui end)
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 44/59
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 45/59
-ormulare 7ode Builder
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 46/59
-ormulare +7ode Builder
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 47/59
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 48/59
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 49/59
onoad a lui list bo0 n prim plan)
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 50/59
p p
Se introduce codul surs* a(erent ac+iunii care se dorete s* se reali%e la
nc*rcare (ormului pe ecran n momentul eecu+iei (ormularului
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 51/59
.odi(icare date din tabela arteneri se (ace pe principiul7 ne deplas*m
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 52/59
.odi(icare date din tabela arteneri se (ace pe principiul7 ne deplas*m
cu butoanele s*'e+i n sus i n jos p)n* la nre'istrarea care dormi s* o
modi(ic*m e po%i+ion*m pe înregistrare, o modif icăm şi apoi
apăsăm click stânga de mouse pe butonul Salvare.
Dacă se modifică numele Partenerului atunci apăsăm butonul
Listă pentru ca modificarea să fie viibilă şi în listă.
!e"t#o"$ul %d îl blocăm ca să nu se modifice valoare astfel& în
fereastra Property Sheet în fila Data setăm Locked=Yes. Codul
sursă pentru modificare este:
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 53/59
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 54/59
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 55/59
'dăgarea se face click pe butonul Adauare ac!ine ce "a a"ea ca efect olirea
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 56/59
'dăgarea se face click pe butonul Adauare ac!ine ce "a a"ea ca efect olireac#mpurilor formularului$ se completea%ă c#mpurile cu informa!ii &i apoi see'ecută click pe (utonul Sal"are
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 57/59
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 58/59
8/17/2019 Curs VBA
http://slidepdf.com/reader/full/curs-vba 59/59
-ereastra 7od ursa 9tergere