c1_vba
TRANSCRIPT
-
7/28/2019 C1_VBA
1/38
VBAVISUAL BASIC FOR
APPLICATIONS
GIANINA GABORC1 INFORMATICA APLICATA II
-
7/28/2019 C1_VBA
2/38
CONTINUT
BAZELE PROGRAMRIIVBA TIPURI DE DATE INSTRUCIUNILELIMBAJULUI
-
7/28/2019 C1_VBA
3/38
INTRODUCERE
VBA (Visual Basic for Applications) = limbaj de programare creat
de Microsoft pentru automatizarea aplicaiilor Ataat iniial componentelor din Microsoft Office, n prezent >
200 de aplicaii include VBA - CorelDraw, AutoCAD,
VBA este parte a familiei de limbaje Visual Basic & oferera suportpentru limbaj, interfaa - forme, controale, obiecte si tehnologii
de accesare a datelor Atunci cnd este gzduit de alt aplicaie /Excel VBA ofer
mijloacele de interaciune cu obiectele aplicaiei gazd & permitedezvoltatorilor s furnizeze soluii complete care extind i/sauintegreaz aplicaia gazd
Pentru a programan VBA o cerin suplimentar fa de alte
limbaje este aceea c trebuie s se cunoasc aplicaia gazd -Word, Excel, PowerPoint, Access
-
7/28/2019 C1_VBA
4/38
SCURT ISTORIC
1993 VBA apare n Microsoft Excel1994 VBA este ataat la Microsoft Project
1995 VBA inclus n Microsoft Access nlocuindAccess Basic
1996 VBA devine element n Visual Basic
1996 VBAinclus n Word nlocuind Word Basic
1997 VBA este integrat n suita Office 97
1997 Microsoft liceniaz VBA pentru utilizarean alte aplicaii software
-
7/28/2019 C1_VBA
5/38
ORGANIZARE PROIECTE VBA
Obiectele iprelucrrile necesare realizrii unei aplicaiiVBA sunt gestionate sub forma unui proiect
Un proiect conine documentele aplicaiei suport & fiierespecifice
Module standard (module de cod) - conindeclaraii si proceduriiar fiecare document (inclusiv foile de calcul din Excel) au ataatcte un modul de cod sunt fiiere.bas
Module de clas - conin definirea obiectelor/claselor utilizatorfiiere.cls Forme - fiiere.frm care conin definirea interfeei utilizatori
tratarea evenimentelor asociate Referine - pentru a avea acces la entiti din alte proiecte acestea
se vor indica drept referine ale proiectului curent & aici se indic si
bibliotecile de tipuri necesare proiectului curentExemplu doresc sa lucrez programatic n Excel cu obiecte Word trebuie specificatreferina la biblioteca Word
-
7/28/2019 C1_VBA
6/38
ORGANIZARE PROIECTE VBA
Un modul de cod ncepe cu o seciune de declaraii
(poate fi vid) & instruciuni neexecutabile prin carese definesc constante, variabile prin utilizareaclauzelor Public, Private, Static se poate precizadomeniul de vizibilitate al entitilordefinite
Dup seciunea declaraiilor se definesc procedurilemodulului & structura modulului este secvenialneexistnd intersecii nevide ntre proceduri
Se recomand ca toate declaraiile de variabile iconstante de la nivel de modul s fie grupate la
nceputul modulului chiar daca este posibilaintercalarea lor printre declaraiile de proceduri
-
7/28/2019 C1_VBA
7/38
ORGANIZARE PROIECTE VBA
Prin domeniul unei entiti se nelege mulimea
instruciunilorn care se poate referi entitatea. In domeniul su orice entitate se considervizibil
deci poate fi referit
Domeniul este dependent de locul definirii entitii
de clauzele utilizate la definire i de parametriiglobali ai proiectului
Exist 3 tipuri de domenii
la nivel de procedur la nivel de modul - privat la nivel de modul - public
-
7/28/2019 C1_VBA
8/38
ORGANIZARE PROIECTE VBA
Nivel procedur
o variabil definit ntr-o procedur prin Dim estevizibil doar n procedura respectiv
intr-o procedur nu se pot utiliza declaraiiPublic
o variabil definit Statici pstreaz valoarea ntreapeluri succesive ale procedurii & celelalte variabilelocale se reiniializeaz la fiecare apel
dac o variabil trebuie s fie referit n alte proceduri
atunci ea se va declara la nivel de modul sau se vatransmite prin parametri
-
7/28/2019 C1_VBA
9/38
ORGANIZARE PROIECTE VBA
Nivel modul - privat
variabilele definite la nivel de modul n zonaDeclarations prin Dim sau Private (recomandat) suntvizibile doar n modulul respectiv
dac se utilizeaz instruciuneaOption Private Modulen zona Declarations atunci toate variabilele iprocedurile publice vor fi vizibile doar n proiectul curentiar in lipsa acestei declaraii procedurile publice suntvizibile n toate proiectele care fac referin la proiectul
curent
-
7/28/2019 C1_VBA
10/38
ORGANIZARE PROIECTE VBA
Nivel modul - public
variabilele declarate la nivel de modul prin Publicsunt vizibile n toate modulele proiectului curent cai n proiectele care au referin la acesta cuexcepia cazului, explicat anterior al utilizriiinstruciuniiOption Private Module
procedurile sunt publice n mod implicit cu excepiaprocedurilor de tratare a evenimentelor care suntPrivate n mod implicit
-
7/28/2019 C1_VBA
11/38
TIPURI DE DATE
Variabilele i constantele utilizate ntr-un program VBA pot
avea diverse tipurisimilare celor uzuale n alte limbaje Existns i un tip universal tipul Variant asignat
implicit tuturor variabilelor nedeclarate altfel
Tipuri de date predefinite
Boolean = True (-1), False (0) Byte = 0 255, ntreg fr semn Currency = 15 cifre la parteantreag, 4 la partea zecimal Date = date calendaristice i/sau timp orar Decimal (a se vedea observaiile din documentaie)
Single, Double = numere reale n simpl, dubl precizie Integer, Long = numere ntregi Object = adrese pe 32 de bii care se refer la obiecte
-
7/28/2019 C1_VBA
12/38
TIPURI DE DATE
Tipuri de date predefinite - continuare
String = iruri de caractere de lungime variabil (pn la 2^31 caractere)sau de lungime fix (pn la 2^16 caractere) Variant = tipul implicit & poate conine valori avnd orice alt tip de date cu
excepiairurilorcu lungime fixi a tipurilor definite. Memoria utilizat estemai mare & accesul este mai lent
Valori speciale Empty = un variant neiniializat
Null = un variant care programatic nu conine date Error= valoarea care arat ndeplinirea unei condiii de eroare - procesarea
este a utilizatorului Nothing = valoarea utilizat pentru disocierea unei variabile de tip Object de
un obiect efectiv Tipuri definite de utilizator - sinonim uneinregistrri
[Private|Public] Type varnameelementname[([subscripts])] As type[elementname[([subscripts])] As type]
End Type
-
7/28/2019 C1_VBA
13/38
IDENTIFICATORI
Denumirile procedurilor, constantelor, variabilelor
argumentelor respectcerinele uzuale primul caracter este o liter nu coninespaiu, punct,semnul exclamrii, @,&,$,# lungimea este de maxim 255 caractere la acelai nivel de existen nu pot s existe denumiri identice.
Nu se recomand denumiri identice cu nume defuncii, instruciuni. (prin calificare se poate totuiutiliza entitatea cu denumirea implicit).
VBA nu este case-sensitive - mediul de programare
pstreaz capitalizarea din prima apariie a denumirii
-
7/28/2019 C1_VBA
14/38
DECLARAIIConstante
[Public|Private]Const constname [As type] = expression
In lipsa tipului se va ataa tipul cel mai apropiat de expresiamenionat
Implicit constantele sunt Private & la nivel de procedur sau demodul clas domeniul lor nu poate fi modificat prin Public, la nivelde modul standard pot fi Public
Constantele declarate n proceduri sunt locale procedurii Se pot declara pe o linie mai multe constante
Const NrLinii = 15Public ConstMesaj = Tastati numarul de liniiPublic Const NrLinii = 15, Pondere AsSingle =1.25
!!De remarcat - NrLinii este Integer, Mesaj este String, Pondere este Public !
-
7/28/2019 C1_VBA
15/38
DECLARAIIVariabile
Variabilele - simple sau tablou se definesc explicit prininstruciuni Dim, Private, Public, ReDim sau Static & tipul sedeclar explicit sau reamintim este implicit Variant
Dac modulul conine declaraia Option Explicit n zona dedeclaraii atunci toate variabilele trebuie s se declare explicit ->in lipsa declaraiei, apariia unui nou identificator produce
definirea unei noi variabile - de tip VariantDim [With Events] varname[([subscripts])] [As [New] type]
Private [With Events] varname[([subscripts])] [As [New] type]
Public [With Events] varname[([subscripts])] [As [New] type]
Static varname[([subscripts])] [As [New] type]
ReDim [Preserve] varname[([subscripts])] [As type]
Se pot declara mai multe variabile pe o linie separate prin virguledar tipul trebuie specificat la fiecare
-
7/28/2019 C1_VBA
16/38
DECLARAIIVariabile
In instruciunile de declarare a variabilelor
varname = numele variabilei subscripts = dimensiunile tabloului; pot exista cel mult 60 de indici
separai prin virgule un indice fiind de forma
[lowerTo] upper Limita inferioar este implicit 0, dar poate fi controlat prin
instruciuneaOption Base {0 | 1} Dac nu se specific limitele indicilor apar doar parantezele se
definete o variabil dinamiccare se poate redimensiona prinReDim
type = tipul variabilei definite -> Byte, Boolean, , String,String*length, tip utilizator, tip de obiect
New este utilizat doar pentru variabile obiect i produce crearea uneinoi instane la prima referire a variabilei
-
7/28/2019 C1_VBA
17/38
DECLARAIIProceduri
Exist trei tipuri de proceduri Sub = poate primi i transmite informaii prin interme-
diul unor variabile publice sau/i al parametrilor &numele procedurii Sub nu are ataat nici o valoare
Function = se deosebete de o procedur Sub prinaceea c numele are ataat o valoare - valoareafunciei
Property = caracteristic definirii proprietilorunui obiectSe va discuta la subiectul definirea obiectelor
Orice instruciuneexecutabil trebuie saparinunei proceduri
Declaraiile pot sapari n afara procedurilor lanivel de modul
-
7/28/2019 C1_VBA
18/38
DECLARAIIProceduri
Declararea unei proceduri Sub[Private|Public] [Static] Sub name ([arglist])
[declaraii][instruciuni][Exit Sub]
[instruciuni]
End Sub Public, Private, Static = determin vizibilitatea -> Publicvizibil pentru
tot proiectul (n funcie de Option Private se controleaz vizibilitateapentru alte proiecte) Privatevizibil doar n modulul unde apare Static toate variabi-lele locale sunt statice (pstreaz valorile ntre apeluri
name = numele procedurii & se recomanda o construcie de tipAciuneObiect - exemplu ModificaFereastra, StergeButon .
arglist = lista de argumente (explicate n continuare) separate prinvirgule
prin Exit Sub se iese din procedur
-
7/28/2019 C1_VBA
19/38
DECLARAIIProceduri
Un argument se definete prin
[Optional] [ByVal | ByRef] [ParamArray] varname[()] [As type][=defaultvalue]
Optional = parametrul nu este obligatoriu & se vor grupa obligatoriu lafinalul listei de argumente
ByVal, ByRef = modul de apel prin valoare/referin -> Implicit esteapelul prin referin
ParamArray = folosit doar ca ultim argument denot un tablou Optionalde elemente de tip Variant
varname = numele argumentului iar arantezele sunt necesare pentru aindica un tablou
type = tipul parametrului -> pentru argumentele obligatorii poate fi i tiputilizator sau de obiect
defaultvalue = valoarea implicit pentru argumentele Optional -> poate fiorice dar pentru tipul Object poate fi doarNothing
-
7/28/2019 C1_VBA
20/38
DECLARAIIProceduri
Declararea unei proceduri Function[Private|Public] [Static] Functionname ([arglist]) [As type]
[declaraii][instruciuni][name = expression]
[Exit Function][instruciuni][name = expression]
End Sub
declararea este similar unei proceduri Sub dar apare n plus
posibilitatea de a defini explicit tipul funciei prin clauza As type se remarc necesitatea de a atribui o valoare funciei prin
name = expresie
prin Exit Function se iese din procedur
-
7/28/2019 C1_VBA
21/38
EXECUTAREA PROCEDURILOR
Pentru a executa o procedurSub din interiorul altei proceduri -
cu ndeplinirea condiiei de vizibilitate se scrie pe o linie separat[Nume_proiect.Nume_modul.]Nume_procedurlist_parametri
Lista parametrilor de apel = efectivi se include ntre parantezedoar n cazul n care se utilizeaz apelul procedurii prin
instruciuneaCall Argumentele efective sunt separate prin virgule i trebuie s
respecte ordinea i tipul argumentelor din definiia procedurii
Este uzual transmiterea valorilor prin tehnica argumentelornumite caz n care lista parametrilor efectivi este oniruire deexpresii
nume_argument:=valoare_argument
In acest caz nu mai este necesars se respecte ordinea din definiie -> sevor da valorile neopionalei doar cele opionale necesare execuiei dorite
-
7/28/2019 C1_VBA
22/38
EXECUTAREA PROCEDURILOR
pentru a executa o procedur Function din interiorul altei
proceduri (cu ndeplinirea condiiei de vizibilitate) se vautiliza expresia (acolo unde este necesar valoarea funciei)
[Nume_proiect.Nume_modul.]Nume_functie(list_parametri)
este de remarcat prezena obligatorie a parantezelor carenchid lista parametrilor
dac se utilizeaz apelul prin Call valoarea funciei estepierdut doar prelucrrile colaterale = side effectsproducnd efect dac exist astfel de prelucrri - situaie
nerecomandat
-
7/28/2019 C1_VBA
23/38
CONSTANTE PREDEFINITE
Bibliotecile de obiecte Office ofer o mulime de constante predefinite
(built-in) care pot fi utilizate pentru a stabili proprieti sau pentru atransmite argumente
Constantele predefinite sunt de regul grupate n tipuri enumerate carereprezint valorile posibile pentru o proprietate specific
Este posibil s se utilizeze valoarea numeric a constantei DAR esterecomandat s se utilizeze constanta predefinit deoarece dezvoltrile
ulterioare ale aplicaiilor tind smenin denumirile constantelori nuvalorile lor
Exemplu se prefer
Application.DisplayAlerts = wdAlertAll
n loc de
Application.DisplayA lerts = -1
pentru a fixa n Word afiarea tuturor mesajelor de alert laexecuia procedurilor - se remarca i avantajul claritii codului !!
-
7/28/2019 C1_VBA
24/38
INSTRUCIUNIVBA
-
7/28/2019 C1_VBA
25/38
INSTRUCIUNI - GENERALITI
Exist trei categorii de instruciuni VB
de declarare (prezentate anterior)
de atribuire
executabile care iniiaz aciuni - execut metode sau
proceduri, controleaz fluxul execuiei O instruciune se poate continua pe mai
multe linii utiliznd caracterele de
continuare _ !de remarcat spaiul iniial
2 instruciuni se pot scrie pe o aceeai linie
dac sunt separate de :
-
7/28/2019 C1_VBA
26/38
INSTRUCIUNI - GENERALITI
O linie de cod poate fi identificat
printr-o etichet orice identificator care ncepe din prima coloanise termin cu caracterul :
printr-un numr orice combinaie de cifre care ncepe din primacoloani este unic n modulul respectiv.
Identificatorii de linii pot fi utilizai n instruciuni de control (situaienerecomandat) sau n procesul de tratare a erorilor (situaiediscutat ulterior
Inserare comentarii pentru documentare cod
pe linii separate care ncep cu un apostrof sau cu cuvntul Remurmat de un spaiu
pe aceeai linie cu instruciunea, la sfritul liniei, dup un apostrof linia de comentariu nu se poate continua similar unei linii instruciune
-
7/28/2019 C1_VBA
27/38
OPERATORI
Operatori aritmetici: ^ (ridicare la putere), *,/,-,+(adunare, concatenareiruri), \ (mprirentreag), mod
Operatori de comparare: =,=,,Is (object1 Is object2), Like (string Like pattern)
operatorul Is produce Truedac variabilele se refer la acelai obiect operatorul Like produce Truedacirul este conform ablonului Comportarea depinde i de prezena instruciuniiOption Compare Binary -
ordinea este a reprezentrii interne potrivit codului de pagin - sau OptionCompare Text - comparare insenzitiv la capitalizare, ordinea estedeterminat de setrile locale
Operatori de concatenare: +, &
Operatori logici:And, Eqv, Imp, Not, Or, Xor
De remarcat - n afara conversiilor uzuale la tipul numeric cel mainalt rezultatul este Null atunci cnd cel puin un operand este Null &o expresie Empty este considerat 0 n calcule numerice
-
7/28/2019 C1_VBA
28/38
INSTRUCIUNI DE ATRIBUIRE
Atribuirile se efectueaz prin instruciunile Let - pentru valorineobiectuale Set - pentru obiecte LSet i RSet - pentru atribuirispeciale de iruri sau tipuri definite
[Let] varname = expression
Valoarea expresiei trebuie s fie compatibil ca tip cu variabila (ambelenumerice sau ambele iruri) iar conversiile sunt cele uzuale
O variabilVariant poate primi orice valoare, reciproc doardac subtipul
Variant al expresiei este compatibil cu variabila.
LSetstringvar = stringLSetvarname1 = varname2
Copiere cu aliniere la stnga irde caractere fiind binar se poate utilizai ntre tipuri utilizator (rezultatul este n gestiunea utilizatorului si nu seface nici o verificare la copiere) caracterele neocupate se completeaz cu
spaii & cele n plus se pierdRSetstringvar = string
Copiere cu aliniere la dreapta numai pentru variabile/expresii string
-
7/28/2019 C1_VBA
29/38
VARIABILE OBIECT
Declarare variabila de tip obiect se poate efectua prin instruciune de tip
Dim objvarAs Objectsau specificnd exact numele de clasDim myDoc As Word.Document
prima situaie nu permite nici o verificare n momentul compilrii &ataarea unui obiect la variabil este o legare trzie -> late bind ing
a doua situaie permite verificare n momnentul compilarii al doilea cazvorbindu-se de o legare timpurie -> ear ly bindin g
Atribuirea (legarea) unui obiect la o variabil obiect se obine prin
Set objectvar = {[New] objectexpression | Nothing}
prin New se creeaz o nouinstan a clasei & prin Nothing se rupeasocierea cu obiectul eliberndu-se resursele sistem i de memorie
utilizate frNew se creeaz doar o referin/pointer la obiect astfel nct mai
multe variabile se pot referi la acelai obiect/instan
-
7/28/2019 C1_VBA
30/38
INSTRUCIUNI EXECUTABILE
Execuia unui program are loc n lipsa oricrui control,
instruciune cu instruciune, de la stnga la dreapta i desus n jos, sens ce poate fi modificat doar de ordinea depreceden a operaiilorn evaluarea expresiilor
Cum o asemenea situaie nu poate acoperi toatenecesitile de programare similar altor limbaje deprogramare necesitatea instruciunilor de control afluxului execuiei
Unele instruciuni au fost pstrate n VB doar pentrucompatibilitate cu versiunile mai vechi & se recomandautilizarea structurilor similare formelor actuale din altelimbaje de programare
-
7/28/2019 C1_VBA
31/38
INSTRUCIUNI DE TRANSFER
GoSub Return
n cadrul unei proceduri un grup de instruciuni poate fi organizat ca o subrutinidentificat prin linia de start & transferul i ntoarcerea se execut prin
GoSub line
line
Return
unde line este un identificator de linie din aceeaiprocedur & pot exista maimulte instruciuniReturn, prima atins producnd revenirea la instruciuneacare urmeazdup cea mai recentGoSub
GoTo line Transferul controlului execuiei la o anumit linie se realizeaz prin
GoTo lineunde line este un identificator de linie din aceeaiprocedur
On Error - se va discuta la controlul erorilor
OnGoSub, OnGoTosunt structuri arhaice
-
7/28/2019 C1_VBA
32/38
INSTRUCIUNI DE OPRIRE
End
Prin aceastinstruciune care poate fi plasat oriunde n program execuiaeste terminat imediat, fr a se mai executa vreo poriune de cod - cumar fi secvene de tratare a evenimentelor specifice terminrii unui program
Fiierele deschise prin Open se nchid variabilele sunt eliberate instanelecreate se distrug referinele din alte aplicaii sunt invalidate memoria esteeliberat
De notat c pentru o terminare normal a programului se vor descrca
toate formele iar programul se termin singur atunci cnd nu exist alteaplicaii care fac referin la obiecte create din modulele clasi nu existcod care se execut
Stop
suspend execuia ca i End dar (executat din mediul VBA) nunchide fiierele si nici nu elibereaz variabilele & este similar fixriiunui breakpointn program
-
7/28/2019 C1_VBA
33/38
INSTRUCIUNI DE OPRIRE
DoEvents
Prin apelul la aceastfuncieDoEvents()se cedeaz controlul ctre sistemul de operare & controlul esteredat programului dup ce sistemul de operare a procesatevenimentele din coada de evenimente i a procesat toatecaracterele din coada SendKeys
Exit
Instruciunea sub una din formele
Exit Do
Exit ForExit FunctionExit Sub
ntrerupe o ramur de execuie pentru a continua cu nivelul apelant!!! Nu trebuie confundat cu End
-
7/28/2019 C1_VBA
34/38
STRUCTURI ITERATIVE
DoLoop
Repet un grup de instruciuni atta timp ct o condiie este sau devineTrue
Are dou forme sintactice, dup momentul verificriicondiiei
Do [{While | Until} condition][statements]
[Exit Do][statements]
Loop
sau
Do
[statements][Exit Do][statements]
Loop [{While | Until} condition]
STRUCTURI ITERATIVE
-
7/28/2019 C1_VBA
35/38
STRUCTURI ITERATIVE
ForNext repet un grup de instruciuni de un numrdeterminat de ori
Forcounter = start To end [Step step][statements][Exit For][statements]
Next [counter]
For EachNext repet un grup de instruciuni pentru fiecare element al unui tablou sau
al unei colecii
ForEach element In group[statements][Exit For][statements]
Next [element]
-
7/28/2019 C1_VBA
36/38
STRUCTURI ITERATIVE
WhileWend
Repet un grup de instruciuni ct timp rmne adevrat o condiieWhile condition
[statements]Wend
With
Execut un grup de instruciuni pentru un obiect sau pentru un tiputilizator
With object
[statements]End With
Obiectul nu poate fi modificat n grupul de instruciuni
-
7/28/2019 C1_VBA
37/38
STRUCTURI DE DECIZIE
IfThenElse
Ifcondition Then [statements] [Else elsestatements]
sau
Ifcondition Then[statements]
[ElseIfcondition-n Then[elseifstatements]
[Else
[elsestatements]]End If
Condiia poate fi - numai aici
o expresie numeric /string care se evalueaz la True/False (Null este False)sau o construcie de forma
TypeOfobjectname Is objecttype
-
7/28/2019 C1_VBA
38/38
STRUCTURI DE DECIZIE
Select Case
SelectCase testexpression[Case expressionlist-n
[statements-n]]...
[Case Else
[elsestatements]]End Select
testexpression este o expresie numeric sau string. expressionlist-n este o list de expresii separat prin virgule de tip
expresie expresie To expresie Is operatordecomparare expresie