Curs VBA Excel

  • Upload
    ruxed

  • View
    258

  • Download
    36

Embed Size (px)

Citation preview

  • 5/22/2018 Curs VBA Excel

    1/83

    Programarea aplicaiilor Microsoft Office(Visual Basic for Applications)

    IntroducereVBA (Visual Basic for Applications) este un limbaj de programare creat de Microsoft pentru automatizareaaplicaiilor. Ataat iniial componentelor din Microsoft Office, n prezent sunt raportate peste 200 de aplicaii careinclude VBA (CorelDraw, AutoCAD etc.).

    VBA este parte a familiei de limbaje Visual Basic, situndu-se sub VB, dar peste VBScript. Totui, VBA esteacumun element esenial n versiunea completVB, oferind suport pentru limbaj, interfaa pentru forme,controale, obiecte, tehnologii de accesare a datelor.

    Atunci cnd este gzduitde altaplicaie, cum ar fi Excel, VBA ofermijloacele de interaciune cu obiecteleaplicaiei gazd. In acest caz, VBA permite dezvoltatorilor sfurnizeze soluii complete care extind i/sauintegreazaplicaiile gazd.

    Pentru a programa n VBA trebuie totui reinut co cerinsupli-mentarfade alte limbaje este aceea ctrebuiesse cunoascaplicaia gazd(Word, Excel, PowerPoint, Access etc.).

    Scurt istoric1993 VBA apare n Microsoft Excel

    1994 VBA este ataat la Microsoft Project

    1995 este inclus n Microsoft Access, nlocuind Access Basic

    1996 VBA devine element n Visual Basic

    1996 este inclus n Word, nlocuind Word Basic

    1997VBA este integrat n suita Office 97

    1997 Microsoft liceniazVBA pentru utilizarea n alte aplicaii software

    Editorul Visual Basicn aceastseciune se prezintmediul de dezvoltare Visual Basic for Applications integrat n Microsoft Office.

    Utiliznd Visual Basic Editor, numit n continuare VBE, se poate crea, edita, depana i executa cod programasociat cu documente Microsoft Office.

    Proiectele dezvoltate n VBE, dei sunt asociate aplicaiilor din Office, nu pot fi reduse, ca problematic, laprocesarea de texte (Word), calcul tabelar (Excel), prezentri electronice (PowerPoint) sau baze de date (Access).Este corect sse considere aceste proiecte drept aplicaii similare celor dezvoltate n alte medii de programare,avnd nsla dispoziie componentele aplicaiilor din Office. Cu alte cuvinte, nu este vorba de o limitare aposibilitilor de prelucrare, ci o potenare a acestora prin apelul posibil la obiectele din Office.

    O obiecie la utilizarea VBA este aceea cproiectul se poate executa doar dintr-o aplicaie Office (deci deschiznd,chiar formal, un document Word, sau o foaie Excel etc.), dar multitudinea de componente disponibile ndezvoltarea proiectului compenseazacest neajuns. n plus nu trebuie uitat corice aplicaie necesito interfautilizator (puternicn Microsoft Office) i caplicaiile de bazsunt ntreinute i completate de Microsoft, astfelnct proiectele noastre se vor actualiza i ele o datcu componentele Office.

    Un ultim argument este acela cmediul VBE este identic cu mediul de dezvoltare din Microsoft Visual Studio(Visual Basic, C++ etc.) astfel cpractica n VBA poate fi consideratintroductivctre alte aplicaii RAD.

    Interfaa graficVBEPentru a deschide editorul VB, mai nti se va porni o aplicaie din Microsoft Office, apoi se poate aciona

    combinaia Alt+F11 (dacnu a fost atribuitaltei operaiuni), sau

    butonul Visual Basic Editor de pe bara de unelte Visual Basic (meniul View, Toolbars etc.) vizualizatntr-oaplicaie Office, sau

    Meniul Tools, Macro, Visual Basic Editor.

  • 5/22/2018 Curs VBA Excel

    2/83

    Interfaa graficVBE este suficient de complex, asemntoare mediilor de programare din Visual Studio. Pe lngobiectele grafice uzuale (Menu Bar, bare de unelte) sunt disponibile ferestre specializate pentru lucrul cu anumitecategorii de obiecte:

    Properties Window pentru vizualizarea i fixarea proprietilor n momentul proiectrii (design-time);

    Project Explorer care permite navigarea, vizualizarea i modificarea proiectelor deschise la un moment dat;

    Code Window unde este se scrie i este vizibil codul sursal proiectului activ;

    Locals Window care permite vizualizarea variabilelor locale cu valorile lor;

    Immediate Window care permite executarea imediata unei linii de cod;

    Watch Window unde se afieazvalorile unor expresii specificate (utile n depanarea programelor).

    Properties WindowPrin proprietatea unui obiect se nelege o caracteristicarespectivului obiect (cum ar fi culoarea sau vizibilitatea etc.).Fixarea valorii proprietii se reflectn aparena obiectului sau ncomportamentul lui (de exemplu, fixarea proprietiiShowSpellingErrors la valoarea True aratn document erorile descriere).

    Fereastra Properties poate fi utilizat, n momentul proiectrii,pentru a vizualiza toate proprietile obiectului activ i a modificavalorile dorite.

    n partea superioareste cutia de obiecte n care se poate selectaun obiect (sau mai multe) dintre cele vizibile.

    n fia Alphabetic se listeazproprietile modificabile aleobiectului selectat, n ordine alfabetic. Se poate modificavaloarea unui atribut prin selectarea numelui proprietii itastarea sau selectarea noii valori.

    n fia Categorized sunt listate proprietile dupcategorii, ntr-uncontrol de tip Explorer, in care ramurile pot fi expandate sau.

    Fereastra Properties poate fi artat(cnd nu este vizibil), princomanda Properties Windowdin meniul View.

    Project ExplorerCodul sursasociat cu un workbook, document, template sauprezentare este asociat ntr-un proiect,care este memorat i salvat nmod automat o datcu caietul Excel, documentul Word, ablonul sauprezentarea respectiv. n fereastra Project Explorer se pot vedea,modifica i naviga printre toate proiectele asociate oricrui document,caiet, ablon sau prezentare deschise.

    Pentru un proiect se listeaz, ntr-un control de tip Explorer, obiectelecare recunosc evenimente, formele, modulele, referinele. Pentru avedea codul dintr-un modul sau codul asociat unui obiect, se selecteaz

    respectivul modul sau obiect i se apasbutonul View Code (primuldin stnga). Pentru a vedea interfaa utilizator pentru un obiect sauformse selecteazi se apasbutonul View Object (cel din mijloc).Pentru a vedea organizarea n foldere a elementelor listate n ProjectExplorer se va apsa butonul Toggle Folders.

    Fiecare element este nsoit, n arborele de structur, de icoana specificelementului: proiect, folder, referin, obiect etc.

    Code Window

  • 5/22/2018 Curs VBA Excel

    3/83

    Fereastra principala Editorului Visual Basic este cea n care se poate scrie codul surs. Deoarece procedurile suntasociate unor obiecte de interfa, sau aparin unui modul, mai nti se va selecta, din Project Explorer, modulul sauforma vizati apoi se va apsa butonul View Code.

    Pentru a vedea mai mult de o procedurn fereastra de cod, se va selecta boxa de control Default to Full ModuleViewn fia Editordin Options(meniul Tools) (n caz contrar se va vedea doar cte o procedur).

    n partea de sus a ferestrei se gsesc douboxe:

    Object Box unde se poate selecta obiectul pentru care se afieazprocedurile asociate;Procedures/Events Box unde se poate selecta procedura pentru care se vizualizeaz/editeazcodul. Procedurile potfi de tip eveniment, dacobiectul selectat este o formutilizator. Selectarea unei proceduri produce o defilare atextului astfel nct pointerul sfie la prima linie a procedurii.

    Pot fi deschise mai multe ferestre de editare, textul poate fi mutat/copiat ntre ferestre, ferestrele se pot divizautiliznd bara de divizare etc.

    Acionarea butonului Procedure View Icon (primul din stnga, pe bara de jos a ferestrei) sau a butonului FullModule View Icon produce alegerea ntre vizualizarea unei singure proceduri sau a tuturor procedurilor din modul.

    Locals WindowUtiln procesul de punere la punct a programului, fereastra Locals servete la afiarea automata tuturorvariabilelor declarate n procedura curent. Coninutul ferestrei este actualizat de fiecare datcnd se trece dinmodul Run n modul Break sau atunci cnd se navigheazn stiva de apeluri.

    Pentru o descriere a ferestrei se va vedea seciunea dedicatdepanrii programelor.

    Immediate WindowPermite scrierea i execuia imediata unei linii de cod. Linia poate fi copiatn i dintr-o fereastrde cod.

    n modul de execuie Break, instruciunea din fereastra Immediate este executatn contextul procedurii afiate nProcedure Box.

    Pentru aciunile posibile n fereastra Immediate, se va studia Help Immediate Window Keyboard Shortcuts.

    Watch WindowEste fereastra unse sunt afiate automat valorile expresiilor urmrite n etapa de depanare a proiectului.

    Pentru o descriere a ferestrei Watch se va vedea seciunea dedicatdepanrii programelor.Scrierea procedurilorInstruciunile unui proiect se pot nscrie, dupmodul lor de creare, n doumari categorii:

    scrise de aplicaia de baz(Word, Excel etc.) prin traducerea aciunilor interfeei utilizator (meniuri, comenzi etc.)n cod VBA. Aceastoperaiune este cea de nregistrare a unui macro.

    scrise ntr-o fereastrde cod de ctre utilizator (proiectant), cu asistena mediului VBE.

    nregistrarea unui macroAciunea este utilatt prin aceea coperaiuni simple pot fi traduse uor n instruciuni VBA, procedurile pot fieditate din VBE, iar pentru proceduri mai complexe (cum ar fi operatiuni de cutare/nlocuire sau formatri de

  • 5/22/2018 Curs VBA Excel

    4/83

    obiecte grafice) codul generat automat oferun bun model de utilizare a obiectelor, proprietilor i metodeloraplicaiei.

    Pentru a nregistra un macro:

    Se afieazbara de unelte Visual Basic(meniul View- Toolbarsi selectarea barei dorite).

    Pe bara VisualBasicse acioneazbutonul Record Macro.

    n dialogul Record Macrose nlocuiete numele dat implicit n boxa Macro Namei apoi OK.

    Se poate utiliza boxa Store macropentru a alege locul de memorare a codului.Se executaciunile menite sfie nregistrate/traduse n VB, n succesiunea dorit.

    Pe bara Stop Recording(aprutla iniierea procesului de nregistrare) se apasbutonul StopRecording.

    Pentru a vedea liniile de cod generate, se deschide n aplicaia de bazmeniul Tools, comanda Macro, apoiMacros, se selecteazdupdenumire i se apasbutonul Edit.

    Codul surspoate fi vzut i prin navigarea n VBE prin Project Explorer, ferestre de cod etc.

    Din punctul de vedere al programrii se poate spune cun macro este o procedurpublicfrargumente, decipoate fi scrisi direct n fereastra de cod a unui document. Din punct de vedere formal, toate procedurile care potfi executate din dialogul Macros (Tools- Macro- Macros) sunt macro-uri.

    Scrierea unei proceduriDacse dorete scrierea unor proceduri generale, care nu sunt asociate unui obiect sau eveniment specific, se cacrea o procedurntr-un modul standard.

    Pentru a crea un modul standard nou (gol), se merge n Project Explorern proiectul unde se adaugmodulul noucreat i se dcomanda Moduledin meniul Insert.

    Pentru a deschide un modul standard existent, se va selecta modulul din Project Explorer i se apasbutonul ViewCode(sau dublu click).

    Pentru a aduga o procedurla un modul, se selecteazmodulul n Project Explorer, se deschide meniul Insert i sedcomanda Procedure. Se deschide dialogul Add Procedure unde se vor selecta opiunile definitorii (subrutinsaufuncie, publicsau nu etc.) i se dOK. Dupaceasta se pot aduga liniile de cod ale procedurii.

    Scrierea unei proceduri de eveniment (event procedure)Dacse dorete scrierea de cod surscare sse execute automat atunci cnd are loc un anumit eveniment (cum ar fideschiderea unui document, acionarea unui buton etc.), trebuie sse scrie o procedurasociatevenimentuluirespectiv. O asemenea procedurse va numi procedura evenimentului.

    Anumite obiecte din aplicaiile Microsoft Office recunosc un set predefinit de evenimente, care pot fi declanate dectre sistem sau de ctre utilizator. Evenimentele specifice fiecrui obiect trebuie sfie studiate separat (se vastudia seciunea din Help pentru fiecare aplicaie), doa principalele obiecte, cu proprietile, metodele sievenimentele lor, sunt prezentate i n acest curs, n capitole separate.

    Modul cum aplicaia rspunde la evenimentele recunoscute poate fi controlat prin scrierea procedurilor deeveniment. O asemenea procedurse va scrie n fereastra Code asociatobiectului. De fiecare datcnd apareevenimentul se executprocedura evenimentului respectiv. De exemplu, dacse scrie o procedurasociatcuevenimentul Open al unui document Word, procedura se va executa automat la fiecare deschidere a acelui

    documentului.O procedurde eveniment este memoratn documentul, caietul, foaia de calcul, diapozitivul, forma utilizator etc.unde poate fi declanat evenimentul. Pentru a vedea codul sursal procedurii, se va selecta obiectul n ProjectExplorer i click pe butonul View Code pentru a deschide fereastra de cod asociat. Dintr-o fereastrde coddeschis, asociat, se va selecta obiectul vizat, din boxa de obiecte, i n boxa de proceduri vor fi listate atunci toateprocedurile evenimentelor, chiar dacele nu sunt efectiv scrise. Selectarea unui eveniment va scrie (dacnu exist)liniile obligatorii ale procedurii i va fixa cursorul de editare n procedura respectiv.

    Numele unei proceduri de eveniment este format din numele obiectului, care recunoate evenimentul, urmat decaracterul "_" i de numele evenimentului asociat. De exemplu, Document_Open este numele procedurii care seexecutla deschiderea unui document.

  • 5/22/2018 Curs VBA Excel

    5/83

    Pentru controale ActiveX, numele este legat de numele codului controlului. Schimbarea numelui codului dupce s-au scris procedurile evenimentelor impune modificarea denumirilor acestora. La cele mai multe obiecte(Document, Worksheet, UserForm) denumirile sunt legate de numele clasei, deci nu mai trebuiesc redenumite.

    Observaie. Dacse dorete ca o procedursfie asociatcu un document specific, dar nu cu un evenimentspecific, atunci procedura se va scrie n seciunea (General) a documentului respectiv (de exemplu o rutincare spoatfi apelatdin mai multe proceduri de eveniment).

    Unelte VBE pentru scrierea instruciunilorDeoarece multe dintre denumirile obiectelor, proprietilor sau metodelor care apar n codul VBA sunt complexe,

    mediul de dezvoltare ofero serie de unelte pentru completarea automata cuvintelor cheie, pentru oferirea deajutor n reamintirea denumirilor etc.

    Dacs-au tastat suficient de multe caractere nct VB poate recunoate un cuvnt, atunci prin CTRL+SPACE, sauclick pe butonul Complete Wordde pe bara de unelte Edit, completeazcuvntul.

    n dialogul Options (meniul Tools) se pot activa urmtoarele aciuni, executate automat la completarea unei linii decod:

    verificarea automata sintaxei Auto Syntax Check;

    obligativitatea declarrii tuturor variabilelor, adugarea automata instruciunii Option Explicit la orice nou modul Require Variable Declaration;

    afiarea unei liste cu informaii utile (logice la poziia curenta cursorului) la completarea instruciunii AutoList Member;

    afiarea informaiei despre proceduri i parametrii lor Auto Quick Info;

    afieaz, doar n modul Break, valoarea unei variabile peste care este plasat cursorul Auto Data Tips;

    alinierea automata liniilor noi la nceputul liniei precedente Auto Indent;

    fixarea limii ntre poziiile tabulatorului, 1 la 32 de spaii (implicit fiind 4) Tab Width.

    Pe bara de unelte Edit existcteva butoane, care ajutla completarea cuvintelor i expresiilor n timpul scrieriiinstruciunilor:

    List Properties/Methods deschide o cutie n fereastra Code cu proprietile i metodele permise pentru obiectul

    care precede caracterul punct ("."), utilatunci cnd se opereazcu obiecte.

    List Constants deschide n fereastra de cod, la punctul de inserie, o cutie cu constantele permise pentruproprietatea care precede semnul egal ("=") n instruciunea curent.

    Quick Info ofer, ca ajutor, sintaxa pentru o variabil, funcie etc. prin analiza locului punctului de inserie pelinia curent.

    Parameter Info arato cutie, la punctul de inserie, cu informaia despre parametrii funciei n care estepointerul.

    Complete Word acceptcaracterele pa care le propune VBE drept completare la cuvntul tastat.

    Comment Block care transformn comentarii liniile selectate.

    Uncomment Block nltursemnul de comentarii la liniile selectate.

    Executarea unei proceduri SubO procedurpoate sse execute:

    automat, ca rspuns la declanarea unui eveniment (procedura evenimentului);

    din VBE, dacpunctul de inserie este n proceduri se acioneazbutonul Run Sub/UserFormdepe bara de unelte Standardsau Debug;

    ca un macro, Rundin dialogul Macros(Tools- Macro) al aplicaiei de baz;

  • 5/22/2018 Curs VBA Excel

    6/83

    apelatdin altprocedur.

    La apelul unei proceduri din altprocedurse va ine seama de interaciunea declaraiilor Public, Private, ca i dereferinele la alte proiecte (meniul Tools- References).

    Instruciunile VBATipuri de dateVariabilele i constantele utilizate ntr-un program VBA pot avea diverse tipuri, specifice datelor memorate. Spredeosebire de alte limbaje de programare, existun tip universal tipul Variant , care poate conine aproapeorice alt tip de date. Acest tip este asignat n mod implicit tuturor variabilelor nedeclarate altfel, nct declarareaexplicitpoate fi utilizatatunci cnd se dorete economisirea memoriei (tipul Variant alocmai multmemorie),vitezn execuie sau atunci cnd se scriu date ntr-un fiier n acces direct.

    BooleanDomeniu de valori:True sau False (valorile logice)

    Memorie:2 bytes

    Declarator de tip:

    Observaii.Convertirea valorilor numerice la tipul Boolean: 0 produce False, valorile nenuleproduc True.

    Convertirea valorilor de tip Boolean la alte tipuri numerice: False devine 0, True devine -1.Byte

    Domeniu de valori:0255 (numere ntregi, frsemn)

    Memorie:1 byte

    Declarator de tip:

    Observaii.

    CurrencyDomeniu de valori:-922 337 203 685 477.5808 922 337 203 685 477.5807

    Memorie:8 bytes

    Declarator de tip: @Observaii. Utilizate pentru calcule bneti (sau alte situaii n care precizia este foarteimportant). Valorile sunt memorate n format ntreg, scalate prin 10 000, pentru a obine 15 cifrela partea ntreagi 4 cifre la partea zecimal(reprezentare n virgulfix).

    DateDomeniu de valori:1 ianuarie 100 31 decembrie 9999, 0:00:00 23:59:59

    Memorie:8 bytes

    Declarator de tip:

    Observaii. Informaiile de tip datcalendaristici/sau timp orar sunt memorate drept numereflotante, partea ntreagreprezentnd data calendaristic, partea fracionarreprezentnd timpul.

    La convertiri, miezul nopii este 0, miezul zilei este .5, numerele negative reprezintdate nainte de30 decembrie 1899.

    Poate fi atribuit ca valoare de tip date orice literal care reprezinto datcalendaristicrecunoscutca atare, literalul trebuind sfie cuprins ntre simboluri #, de exemplu #1 Jan 99#.

    DecimalDomeniu de valori:(vezi observaiile)

    Memorie:12 bytes

    Declarator de tip:

    Observaii. Valorile de tip Decimal sunt memorate ca ntregi frsemn nsoii de un factor descal, ntre 0 i 28, specificnd numrul de zecimale. Pentru scala=0 (frparte zecimal), cea mai

  • 5/22/2018 Curs VBA Excel

    7/83

    mare valoare posibileste +/-79,228,162,514,264,337,593,543,950,335. Cu scala=28 cea mai marevaloare este +/-7.9228162514264337593543950335 iar cea mai micvaloare nenuleste +/-0.0000000000000000000000000001.

    Not: Deocamdat, tipul Decimal poate fi utilizat doar ca subtip n Variant, adicnu se pot declaravariabile ca fiind de tip Decimal. Acestea pot fi create ca Variant cu subtipul Decimal prin funciaCdec (funcia foreazo expresie sfie de un tip specificat, din aceeai categorie de funcii fiind iCBool, CByte etc.).

    DoubleDomeniu de valori:numere negative de la -1.79769313486232E308 pnla -4.94065645841247E-324; numere pozitive de la 4.94065645841247E-324 pnla1.79769313486232E308 (numere flotante n dublprecizie).

    Memorie:8 bytes

    Declarator de tip: #

    Observaii.

    IntegerDomeniu de valori:-32 768 32 767.

    Memorie:2 bytes

    Declarator de tip: %

    Observaii.

    LongDomeniu de valori:-2 147 483 648 2 147 483 647.

    Memorie:4 bytes

    Declarator de tip: &

    Observaii.

    ObjectDomeniu de valori:(vezi observaiile)

    Memorie:4 bytes

    Declarator de tip:

    Observaii. Adrese pe 32 de bii care se referla obiecte. Prin instruciunea Set se atribuie uneivariabile declarate de tip Object referina la obiectul dorit.

    Not. Prin declararea unei variabile de tip Object, referirea la un obiect prin Set produce o ataaretrzie (la timpul execuiei run-time binding). Pentru o ataare timpurie (la timpul compilrii compile-time binding) se va utiliza o variabildeclaratcu numele clasei respective.

    SingleDomeniu de valori:numere negative de la -3.402823E38 pnla -1.401298E-45; numere pozitivede la 1.401298E-45 pnla 3.402823E38.

    Memorie:4 bytes

    Declarator de tip: !

    Observaii.

    StringDomeniu de valori:ir de lungime variabil: pnla 2^31 caractere; ir de lungime fix: pnla2^16 caractere.

    Memorie:2 bytes

    Declarator de tip: $

    Observaii. Un ir de lungime fixdeclarat Public nu poate fi utilizat ntr-un modul de clas.

  • 5/22/2018 Curs VBA Excel

    8/83

    Variant (default)Domeniu de valori:aceleai cu domeniile specificate la tipurile precedente i care pot fi subtipuriale tipului Variant, cu meniunea ctoate subtipurile numerice au domeniul de la Double.

    Memorie:n funcie de subtipul valorii: valorile numerice ocup16 bytes, valorile de tip Stringnecesit22 bytes plus cte un byte pentru fiecare caracter.

    Declarator de tip:

    Observaii. Este tipul specificat implicit (n lipsa unei declaraii explicite) pentru o constant,

    variabil, sau argument (caz care, dei nerecomandat, poate elimina erorile provocate de diferenelede tip ale argumentelor la apelul procedurilor).

    Cu excepia datelor de tip String cu lungime fixi a datelor cu tipuri definite de utilizator, tipulVariant poate conine orice alt tip de dat. n plus poate sconinvalorile speciale Empty, Error,Nothing i Null. Tipul considerat pentru o datconinutntr-un Variant poate fi determinat cufuncia VarType sau TypeName.

    Valorile unei variabile Variant pot s-i converteascvalorile automat. n general, datele numericesunt memorate n tipul de origine, dar este posibil ca ele sfie promovate la tipul superior dacrezultatul unei operaii necesitacest fapt. De exemplu o valoare declaratiniial drept Integer iatribuitunui Variant va fi memoratca un ntreg pncnd, ridicnd-o de exemplu la o putere,valoarea ei excede domeniul tipului Integer. n acest caz are loc promovarea (ca mod dereprezentare) la tipul superior adecvat (Long sau Double). Dacdepirea domeniului are loc

    pentru subtipurile Currency, Decimal sau Double, atunci se va semnala eroare.Utilizarea tipului Variant permite o tratare mai difereniata irurilor de cifre: n operaii numericevor fi considerate numere iar n operaii cu iruri vor fi considerate iruri.

    Accesul la valorile Variant este mai lent dect accesul la valorile definite prin tipuri explicite.

    Valorile speciale au semnificaia:

    Empty este valoarea unui Variant care nu a fost iniializat. n calcule numerice este considerat 0 iar n operaii cuiruri este irul de lungime zero.

    Null este valoarea unui Variant care, n mod programatic, nu conine date.

    Error este valoarea utilizatpentru a arta ndeplinirea unei condiii de eroare (prin convertirea unui real cu funcia

    CVErr). Procesarea se va efectua de ctre utilizator, tratarea automata erorilor nu este activatla setarea acestorvalori.

    Nothing este utilizatpentru disocierea unei variabile de tip Object de un obiect efectiv.

    Tipuri definite de utilizatorUn tip de datdefinit de utilizator reprezintechivalentul unei nregistrri dintr-un fiier (bazde date), adicogrupare de entiti de tipuri diferite. Definirea are loc la nivel de modul, prin instruciuni Type. Pentru clauzele careapar se va vedea discuia de la domeniul variabilelor.

    [Private | Public] Type varname

    elementname[([subscripts])] As type

    [elementname[([subscripts])] As type]

    . . .

    End Type

    unde varnameeste numele dat tipului definit, iar prin elementname se definesc componentele tipului. Se pot utilizai componente de tipuri utilizator deja definite. Componentele pot fi i tablouri, caz n care apar definiiile specifice(vezi declararea variabilelor).

    Declararea constantelor, variabilelor i tablourilorNume

    La denumirea procedurilor, constantelor, variabilelor i argumentelor ntr-un modul Visual Basic

    se cere respectarea urmtoarelor reguli:

  • 5/22/2018 Curs VBA Excel

    9/83

    primul caracter trebuie sfie o liter;

    nu se utilizeazspaiu, punct (.), semnul exclamrii(!), sau caracterele @, &, $, #

    lungimea denumirii nu poate depi 255 de caractere;

    la acelai nivel de existennu pot sexiste denumiri identice. Pot sexiste totui, n acelai modul, o variabilprivati o variabilla nivel de procedurcare spoarte acelai nume.

    n general, nu se recomanddefinirea unor denumiri identice cu nume de funcii, instruciuni sau metode existente

    n Visual Basic. Dacs-a ajuns totui la aceastsituaie, atunci utilizarea funciei intrinseci limbajului, ainstruciunii sau metodei care intrn conflict cu un nume asignat necesitcalificarea ei n raport de bibliotecaasociat. De exemplu, VBA.Left este apelul la funcia Left atunci cnd este definitde utilizator i o variabilLeft.Not. Visual Basic nu este case-sensitive, deci denumirea unei entiti nu are ca atribut distinctiv capitalizarealiterelor, dar mediul de programare VBA pstreazcapitalizarea din instruciunea unde este definit un nume.

    Declararea constantelorDefinirea unei constante se realizeazprin instruciunea Const, n care se poate specifica tipul, domeniul i valoareaconstantei. Valoarea unei constante nu se poate schimba programatic.

    [Public | Private] Const constname[As type] = expression

    Public cuvnt cheie, opional, utilizat la nivel de modul pentru a declara constante recunoscute n toateprocedurile din toate modulele. Nu este permis n proceduri.

    Private cuvnt cheie, opional, utilizat la nivel de modul pentru a declara constante recunoscute n toateprocedurile din modulul n care apare declaraia. Nu este permis n proceduri.

    constname numele constantei (obligatoriu).

    type tipul constantei: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (ncnu este suportat),Date, String, sau Variant. Fiecare constantpresupune o clauzAs type proprie; n lipsa clauzei se va ataa automattipul cel mai apropiat expresiei.

    expression combinaie de identificatori, constante, operatori (cu excepia Is) care produce un sir, numr sauobiect. Nu se pot utiliza variabile, funcii utilizator sau funcii VBA predefinite.

    n mod implicit, constantele sunt private. La nivel de procedur, sau de modul clas, domeniul lor nu poate fimodificat prin utilizarea clauzei Public. La nivel de modul standard vizibilitatea poate fi modificatprin Public.

    Constantele declarate n proceduri Sub, Function sau Property sunt locale procedurii, constantele declarate n afaraunei proceduri este definitn modulul respectiv.

    Mai multe declaraii de constante pot fi scrise pe o aceeai linie, separate prin virgule la nivel de atribuiri deexpresii. n acest caz, cuvintele Public sau Private care apar se aplicntregii linii.

    ExempleConst NrLinii = 15

    Public Const MesajInitial = "Tastati numarul de linii"

    Private Const NrLinii as Integer = 15

    Public Const NrLinii = 15, Pondere as Single = 1.21

    Este de remarcat c, n ultima linie, doar Pondere este de tip Single, n timp ce NrLinii este de tip Integer (n lipsaclauzei As type se atribuie tipul expresiei).

    Declararea variabilelorVariabilele, simple sau tablou, se definesc prin instruciunile Dim, Private, Public, ReDim sau Static. Numele uneivariabile trebuie srespecte regulile generale de formare a identificatorilor, tipul variabilei poate fi definit explicit(prin clauza As type) sau implicit (ca Variant).

    n cazul n care modulul conine instruciunea Option Explicit cu sintaxa

    Option Explicit

    i care trebuie saparnaintea oricrei proceduri din modul, toate variabilele trebuie sfie declarate prininstruciunile menionate. Lipsa instruciunii Option Explicit permite ca variabilele sfie definite acolo unde estenevoie de ele prin simpla menionare a unui nou identificator, tipul lor fiind stabilit implicit. Aceastultimposibilitate poate produce erori greu detectabile.

  • 5/22/2018 Curs VBA Excel

    10/83

    Sintaxa instruciunilor de declarare a variabilelor este urmtoarea i se observasemnarea clauzelor.

    Dim [WithEvents] varname[([subscripts])] [As [New] type]

    Private [WithEvents] varname[([subscripts])] [As [New] type]

    Public [WithEvents] varname[([subscripts])] [As [New] type]

    Static varname[([subscripts])] [As [New] type]

    ReDim [Preserve] varname(subscripts) [As type]

    varname numele variabilei (obligatoriu).subscripts dimensiunile tabloului de date (dacse declaro variabiltablou). Pot exista pnla 60 de indici,separai prin virgule, declararea dimensiunilor pentru un indice fiind de forma

    [lower To] upper

    Limita inferioareste, implicit, 0, dar poate fi controlatprin instruciunea Option Base.

    Dacnu se indiclimitele indicilor (dar parantezele sunt prezente), se definete o variabiltabloudinamic(nu i prin Static) ale crei dimensiuni pot fi precizate/redefinite prin instruciuneaReDim.

    New permite crearea implicita unui obiect (atunci cnd se declaro variabilde tip obiect). O nouinstanaobiectului este creatla prima referina variabilei definite. Clauza nu poate saparla declararea variabilelor detipuri intrinseci i nici la declararea instanelor obiectelor dependente.

    type tipul variabilei definite: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (nesuportatnc), Date, String (pentru iruri cu lungime variabil), String * length (pentru iruri cu lungime fix), Object,Variant, tip utilizator sau tip de obiect.

    Dacse definesc mai multe variabile ntr-o instruciune, definiiile se separprin virguliar clauza de tip nu esteextinsi la variabilele definite ulterior.

    Dei toate instruciunile permit declararea unor variabile (simple sau tablou), fiecare instruciune are un efectdistinct n ceea ce privete vizibilitatea variabilelor i persistena valorilor.

    Dim definete variabile att la nivel de modul ct i la nivel de procedur. Variabilele definite la nivel de modulsunt accesibile n procedurile acelui modul, iar variabilele de la nivel de procedursunt vizibile doar n procedurarespectiv.

    Private este utilizatla nivel de modul pentru a declara variabile accesibile doar n procedurile acelui modul.

    Public este utilizatpentru a declara variabile accesibile n toate procedurile din toate modulele i din toateaplicaiile. Prin includerea instruciunii Option Private Module este posibil ca variabilele publice sfie vizibile doarn proiectul n care sunt definite.

    Static este utilizatla nivel de procedurnestaticpentru a declara variabile care i pstreazvaloarea de la oexecuie a procedurii la alta, att timp ct modulul n care apare procedura nu este resetat sau repornit. Variabileledefinite prin Static sunt vizibile doar n procedura respectiv. Este de remarcat cse poate defini o ntreagprocedurutiliznd clauza Static (vezi definirea procedurilor), caz n care toate variabilele sunt statice.

    ReDim este utilizatla nivel de procedurpentru realocarea memoriei variabilelor tablou dinamice. Utilizareaclauzei Preserve permite doar modificarea ultimei dimensiuni i pstreazvalorile deja existente. (Pentru detalii

    vezi i VBA Help).Exemple

    Dim x As Double, ColtStanga As Integer

    Private I, J As Long

    Static Venit As Currency, NumPren As String

    Dim Retineri(5) As Currency

    Public indicatori(10) As Byte

    Dim matrice(1 To 3, 100 To 200) As String

    Public fntScris As Font

    Dim appWD As Word.Application

  • 5/22/2018 Curs VBA Excel

    11/83

    Proceduri

    Printr-o procedurse nelege, similar altor limbaje de programare, o mulime de instruciuni care este identificatprintr-un nume i care se executunitar printr-un singur apel. Ar trebui, pentru claritatea programului, ca oprocedursefectueze o prelucrare unitaridentificabiln logica programului.

    Existtrei tipuri principale de proceduri: Sub, Function i Property. Ultimul tip este caracteristic definirii unuiobiect i va fi prezentat ulterior. O procedurde tip Sub poate primi i transmite informaii prin intermediul unorvariabile publice sau/i a unor parametri. Numele procedurii nu are ataatnici o valoare. O procedurde tipFunction se deosebete prin aceea cnumele procedurii are ataato valoare (valoarea funciei) i poate fi utilizat

    ca orice altvariabildin proiect.

    Observaie.Orice instruciune executabiltrebuie saparinunei proceduri. Declaraiile pot sapari n afaraprocedurilor, la nivel de modul.

    Proceduri SubOrganizarea generala unei proceduri de tip Sub este

    [Private | Public] [Static] Sub name([arglist])

    [instruciuni]

    [Exit Sub]

    [instruciuni]

    End Sub

    Public, Private, Static determinvizibilitatea procedurii. Public = vizibilpentru toate procedurile i toatemodulele (n funcie de Option Private se definete vizibilitatea pentru alte proiecte). Private = vizibildoar pentruprocedurile din modulul unde procedura este declarat. Static = aratctoate variabilele locale i pstreazvalorile ntre apeluri.

    name numele procedurii.

    arglist lista de argumente, separate prin virgule.

    Prin instruciunea Exit Sub se poate iei din proceduri altminteri dect prin linia final.

    Argumentele se definesc dupsintaxa:

    [Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]

    Optional aratcparametrul nu este obligatoriu. Parametrii opionali trebuie sfie grupai la sfritul listei(apariia clauzei Optional cere ca toi parametrii care urmeazsaibaceeai clauz).

    ByVal aratcapelul paramatrului se face prin valoare (orice modificare a valorii transmise nu este regsitdupprsirea procedurii, calculele efectundu-se pe o copie a parametrului).

    ByRef aratcapelul paramatrului se face prin referin(orice modificare a valorii transmise este regsitdupprsirea procedurii). Acesta este modul implicit de transmitere a parametrilor.

    ParamArray folosit doar ca ultim argument n list, denotun tablou Optional de elemente de tip Variant.Clauza ParamArray permite definirea unui numr arbitrar de parametri. ParamArray nu poate fi utilizat mpreuncu ByVal, ByRef, sau Optional.

    varname numele argumentului. Daceste tablou se vor indica parantezele.

    type tipul parametrului transmis: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal, Date, String(doar lungime variabil), Object, Variant. Pentru parametrii obligatorii (frOptional) poate fi i un tip definit saude obiect.

    defaultvalue definete valoarea implicitpentru argumentele opionale. Poate fi orice expresie, dar pentru tipulObject se admite doar Nothing.

    Apelul unei proceduri SubPentru a executa o procedurde tip Sub din altprocedur(vezi i discuia privind vizibilitatea) se menioneaz, peo linie separat, numele procedurii urmat sau nu de parametri. Daceste necesar, datoritapelrii unui alt proiectsau modul, atunci apelul este dupmodelul:

    Nume_proiect.Nume_modul.Nume_procedurlistde argumente

  • 5/22/2018 Curs VBA Excel

    12/83

    unde lista de argumente poate sau nu sfie inclusntre paranteze. Argumentele efective sunt separate n listprinvirgule i trebuie srespecte ordinea (i tipul) argumentelor din definiia procedurii. n cazul procedurilor cu multeargumente, dintre care multe opionale, transferul poate provoca erori de scriere a codului (un argument opionalnecesittotui virgula sa, de unde o numrare atenta virgulelor etc.). Pentru asemenea situaii (n special) sepermite i transferul valorilor prin intermediul tehnicii de argumente denumite. Aceasta se realizeazalctuind listade argumente, la apelul procedurii, din intrri de forma

    nume_argument:=valoare_argument

    separate prin virgule i la care nu mai conteazordinea iniiala argumentelor. Se vor specifica doar parametrii

    care se transmit efectiv (adicvalorile opionale dorite i toate valorile neopionale).Pentru apelul unei proceduri se va studia i instruciunea Call.

    Proceduri FunctionO procedurde tip Function este similar, ca definiie, unei proceduri Sub, dar are particularitatea creturneazovaloare prin numele su (care se comportdeci ca o variabil).

    [Public | Private] [Static] Functionname [(arglist)] [Astype]

    [statements]

    [name = expression]

    [Exit Function]

    [statements][name = expression]

    End Function

    Este de remarcat cse poate ataa un tip numelui funciei (adicvalorii funciei) i se va remarca existenainstruciunilor prin care se atribuie funciei valorile calculate.

    Valoarea returnatde o funcie poate fi utilizatntr-o altexpresie prin includerea numelui funciei urmat, ntreparanteze, de valorile efective ale parametrilor.

    Dacapelul se face prin intermediul instruciunii Call, valoarea funciei nu poate fi utilizat. n asemenea situaii seactiveazde fapt doar prelucrrile colaterale (care, pentru claritatea codului, nici nu sunt recomandate).

    Exemple de proceduriPublic Function AriaCilindru (raza, inaltime) As Double

    Const Pi = 3.14159

    cilBaza = Pi*raza^2

    cilLaterala = 2*Pi*raza*inaltime

    AriaCilindru = 2*cilBaza + cilLaterala

    End Function

    Sub AriaCilindru (ByVal raza As Single, ByVal inaltime As Single, ByRef cilAria As Double)

    Const Pi As Single = 3.14159

    Dim cilBaza As Single, cilLaterala As Single

    cilBaza = Pi*raza^2

    cilLaterala = 2*Pi*raza*inaltime

    cilAria = 2*cilBaza + cilLaterala

    End

    Apelul funciei poate fi ntr-o instruciune de genulCostTotalPiesa = AriaCilindru (r1, h1) * CostUnitar

    n timp ce apelul subrutinei poate fi

    AriaCilindru inaltime:=h1, raza:=r1, cilAria:=AriePiesa

  • 5/22/2018 Curs VBA Excel

    13/83

    Organizarea generala unui proiect VBAObiectele i prelucrrile necesare realizrii unei aplicaii VBA (presupunnd cse dorete atingerea unui ansamblucoerent de scopuri) sunt gestionate sub forma unui proiect, care are un nume implicit sau dat de utilizator. La unanumit moment pot fi deschise mai multe proiecte, identificabile prin denumirile lor.

    Deoarece prelucrrile proiectate n VBA sunt ataate documentelor (aciunilor) unor aplicaii particulare (Word,Excel etc.), proiectele sunt salvate o datcu documentele pe care le nsoesc. Acest fapt nu reduce aria de problemeabordabile ntruct prelucrrile propriu-zise nu sunt limitate la documentul nsoit (se poate deschide astfel undocument Word alb i sse efectueze orice prelucrare dorit, fra avea obligaia de a scrie ceva n documentul

    deschis).ntr-un proiect VBA sunt identificabile urmtoarele componente:

    Module standard (denumite iniial module de cod). Conin declaraii i proceduri generale. Existde asemenea imodule care conin tratarea evenimentelor specifice documentului de care este ataat proiectul.

    Module de clas. Conin definirea obiectelor create de utilizator.

    Forme. Conin definiiile dialogurilor din interfaa proiectatde utilizator ca i codul program necesar controlriidialogurilor.

    Referine. ntr-un proiect este meninutlista altor proiecte, care sunt referite n proiectul curent.

    Un modul de cod poate ncepe cu o seciune de declaraii. Prin declaraii nelegem instruciuni neexecutabile princare se definesc constante, variabile i proceduri externe. Utiliznd Public, Static, Private se precizeazi domeniulde vizibilitate a entitilor definite.

    Gestionarea (crearea, editarea, tergerea etc.) obiectelor dintr-un proiect se face prin comenzi ale mediului VBA,care este prezentat ntr-o seciune separat.

    Domeniul unei variabile, constante sau proceduriDomeniul unei entiti reprezintmulimea instruciunilor unde poate fi referitacea entitate. Se poate vorbi astfelde vizibilitatea unei entiti. Domeniul este dependent de locul definirii entitii, de clauzele care apar la definire ide parametrii globali ai proiectului.

    Not.Este de remarcat cutilizarea unei denumiri n afara domeniului iniial prefigurat produce, nlipsa instruciunii Option Explicit, crearea unei noi entiti, frnici o legturcu cea precedent,sursde erori greu detectabile. Acesta este motivul pentru care se recomanddeclararea explicitatuturor variabilelor.

    Existtrei tipuri de domenii:

    la nivel de procedur;

    la nivel de modul, privat;

    la nivel de modul, public.

    Nivelul procedurO variabilsau constantdefinitntr-o procedureste vizibildoar n procedurrespectiv. Daco asemeneaentitate trebuie referiti n alte proceduri, atunci declararea ei se va efectua la nivel de modul, sau se va transmiteprocedurii prin intermediul argumentelor.

    Nivel de modul, privatVariabilele i constantele definite la nivel de modul (n seciunea Declarations) sunt Private n mod implicit, adicsunt vizibile doar n modulul respectiv. Utilizarea clauzei Private nu este deci necesar, dar este recomandat.

    Not. Dacse utilizeazinstruciunea Option Private Module (n seciunea Declarations a modulului) atuncivariabilele i procedurile publice vor fi vizibile doar n proiectul curent. n lipsa acestei declaraii, procedurilepublice (din toate modulele standard sau clas) sunt vizibile n toate proiectele care se referla proiectul curent.Procedurile, variabilele i constantele publice din alte module (cum ar fi modulele ataate formelor) sunt Privatepentru proiectul de definiie, deci ele nu sunt accesibile proiectelor care se referla proiectul unde sunt declarate.

  • 5/22/2018 Curs VBA Excel

    14/83

    Nivel de modul, publicVariabilele declarate la nivel de modul drept Public sunt vizibile n toate procedurile din proiect. Procedurile suntpublice n mod implicit, cu excepie procedurilor de tratare a evenimentelor, care sunt Private n mod implicit. A sevedea i nota anterioar.

    Viata unei variabilePrin viaa unei variabile se nelege timpul ct variabila are o valoare. Este evident cvaloarea unei variabile sepoate modifica pe durata vieii sale, dar definitoriu este faptul cvariabila are o anumitvaloare pe ntreaga durata vieii sale. La prsirea domeniului, variabila "moare" i nu mai are ataato valoare.

    La nceputul execuiei unei proceduri, toate variabilele sunt iniializate:

    Variabilnumeric 0 (zero)

    ir de lungime variabil "" (ir de lungime zero)

    ir de lungime fix Completat cu caracterul Chr(0)(avnd codul ASCII 0)

    VariabilVariant Empty

    Variabile de tip utilizator fiecare element este iniializatseparat, potrivit tipului primar

    VariabilObject Nothing (pnla asignarea uneireferine prin Set)

    Variabilele care nu sunt modificate i pstreazvaloarea iniial.

    Variabilele declarate prin Dim la nivel de procedurau valoare pnla terminarea execuiei procedurii (chiar dacse trece prin apel n alte proceduri).

    Variabilele declarate prin Static, la nivel de procedur, au aceeai viaca i variabilele declarate la nivel de modul

    i i pstreazvaloarea pnla terminarea execuiei codului (inclusiv de la un apel la altul). Includerea clauzeiStatic n instruciunea Sub sau Function are ca efect declararea tuturor variabilelor definite n procedura respectivdrept variabile statice (deci care i pstreazvalorile ntre apeluri).

    Variabilele declarate la nivel de modul standard i pstreazvaloarea pe tot timpul execuiei. Variabilele declaratela nivel de modul clasi pstreazvaloarea att timp ct existo instana clasei. Diferena fade variabileleStatic este aceea cmemoria este utilizatpermanent (nu se elibereazla prsirea domeniului).

    Variabile ObjectDeclararea unei variabile de tip obiect se poate efectua prin declararea tipului generic Object

    Dim myDoc As Object

    sau specificnd exact numele de clasdintr-o bibliotecde obiecte referit

    Dim myDoc As Word.Document

    n primul mod de definire (ca Object) nu se poate efectua la momentul compilrii existena obiectului, nu se poateverifica utilizarea corecta propriettilor i metodelor obiectului i nu se poate lega aceastinformaie de variabilaobiect definit. Ataarea unui obiect este, n acest caz, o legare trzie (late binding) la momentul execuiei i seefectueazprin instruciunea Set.

    Specificarea unei clase la definirea variabilei obiect produce o legare timpurie (earlybinding) care este mai rapid,se face la momentul compilrii i poate nltura mai rapid erori posibile n utilizarea metodelor i proprietilorobiectului.

    Instruciunea Set are sintaxa:

    Setobjectvar = {[New]objectexpression | Nothing}

    unde

  • 5/22/2018 Curs VBA Excel

    15/83

    objectvar este numele variabilei (sau proprietii)

    New permite crearea unei noi instane a clasei

    Objectexpression este o expresie constnd n numele unui obiect, altvariabildeclaratde acelai tip obiect, saufuncie ori metodcare returneazun obiect de acelai tip obiect

    Nothing permite deconectarea asocierii cu un obiect specific, elibernd resursele sistem i de memorie utilizate.

    n general, atunci cnd se utilizeazSet pentru a asigna o referinde obiect la o variabil, nu se creeazo copie a

    obiectului pentru acea variabil. Este creatdoar o referinla obiect. Astfel, mai multe variabile de tip obiect potsse refere la acelai obiect: orice schimbare a obiectului se va reflecta n toate variabilele care referobiectul.Utiliznd clauza New se va crea efectiv o copie (instan) a obiectului.

    ExemplePrin urmtoarele douinstruciuni se definete variabila objWord care este legattrziu de o aplicaie Word:

    Dim objWord As Object

    Set obhWord = CreateObject("Word.Application")

    Legarea timpurie se poate efectua prin

    Dim objWord As Word.Application

    Este de remarcat cinstruciunea Set apeleazo funcie care creeazi returneazo referinla un obiect ActiveX.

    Constante predefinite (builtin)Bibliotecile de obiecte din fiecare aplicaie Office furnizeazo mulime de constante predefinite, care pot fiutilizate pentru a stabili proprietti sau pentru a transmite argumente ctre proprieti sau metode. Constantele sunt,de regul, grupate n tipuri enumerate care reprezintvalorile posibile pentru o proprietate specific. Dei esteposibilsse utilizeze valoarea numerica constantei este recomandat sse utilizeze constanta numitntructdezvoltri ulterioare ale mediului Microsoft Office (ca i ale aplicaiilor din Visual Studio) tind spstrezecompatibilitatea ntre denumirile constantelor i nu ntre valorile efective.

    De exemplu se prefer

    Application.DisplayAlerts = wdAlertAll

    n loc de

    Application.DisplayAlerts = -1

    pentru a fixa ca Word safieze toate mesajele de alertla execuia unei proceduri. Codul scris astfel este i maiexplicit.

    Instruciunile VBAExisttrei categorii de instruciuni Visual Basic:

    instruciuni de declarare (prezentate la declararea variabilelor) prin care se denumesc i se declartipul pentruvariabile, constante i proceduri;

    instruciuni de atribuire (prezentate n continuare) prin care se atribuie valori variabilelor sau constantelor;

    instruciuni executabile (prezentate n continuare) care iniiazaciuni: executmetode sau proceduri, controleazfluxul execuiei codului.

    n mediul de dezvoltare VBA, sintaxa instruciunilor este verificatautomat dupce se trece la instruciuneaurmtoare (prin Enter).

    Continuarea instruciunilorO instruciune poate sfie scrispe mai multe linii prin utilizarea caracterului de continuare a liniei "_" precedat deun spaiu. De exemplu, crearea prin program a unui tabel ntr-un document Word:

    ActiveDocument.Tables.Add Range:=Selection.Range, _

    NumRows:=3, _

    NumColumns:= 3

    unde, pe lngcontinuarea liniilor se va remarca utilizarea argumentelor numite la apelul metodei de adugare aunui nou tabel la colecia de tabele a documentului.

  • 5/22/2018 Curs VBA Excel

    16/83

    Douinstruciuni pot fi scrise pe o aceeai linie dacsunt separate cu caracterul ":".

    Etichetarea liniilorO linie poate fi identificat:

    printr-o etichet: orice nume, care respectregulile generale, care ncepe n prima coloana liniei i se termincucaracterul ":"

    printr-un numr: orice combinaie de cifre, care ncepe n prima coloana liniei i este unic n modulul respectiv.

    Identificatorii de linii pot fi utilizai n instruciuni de control, desi codul astfel construit nu respectregulileprogramrii structurate..

    ComentariiTextele explicative (necesare documentrii codului) pot fi introduse pe linii separate sau n continuarea liniei decod.

    O linie de comentariu ncepe cu un apostrof (') sau cu cuvntul Remurmat de un spaiu.

    Comentariul de pe aceeai linie cu o instruciune se introduce printr-un apostrof urmat de comentariu.

    Operatorin formarea expresiilor de diverse tipuri, operatorii sunt cei utilizai aproape general n limbajele de programare denivel nalt. Pentru fixarea termenilor i notaiilor sunt totui prezentai, pe categorii, nsoii, acolo unde este cazulde scurte explicaii.

    Operatori aritmetici

    Operator Semnificaie Observaii

    ^ Ridicarea laputere

    rezultatul este Double sau Variant(Double) cu excepia: dacunoperand este Null, rezultatul este tot Null

    * nmulirea rezultatul este dat de cel "mai precis" factor, ordinea cresctoare a"preciziei" fiind, pentru nmulire, Byte, Integer, Long, Single,Currency, Double i Decimal. Daco expresie este Null, rezultatuleste Null. O expresie Empty este consideratca 0. Pentru excepii se

    va studia Help *(operator).

    / mprirea rezultatul este, n general, Double sau Variant(Double). Dacoexpresie este Null, rezultatul este Null. O expresie Empty esteconsideratca 0. Pentru excepii se va studia Help /(operator).

    \ mprireantreag

    nainte de mprire, operanzii sunt rotunjii la Byte, Integer sauLong. Rezultatul este Byte, Variant(Byte), Integer, Variant (Integer),Long, sau Variant(Long). Daco expresie este Null, rezultatul esteNull. O expresie Empty este consideratca 0.

    Mod Restul mpririi operanzii sunt rotunjii la ntregi i se obine restul mpririi.Rezultatul este Byte, Variant(Byte), Integer, Variant (Integer), Long,sau Variant(Long). Daco expresie este Null, rezultatul este Null. Oexpresie Empty este consideratca 0.

    + Adunareanumericsauconcatenareairurilor

    n general, operanzi numerici produc adunarea, iar operanzi iruriproduc concatenarea. n cazul numeric, rezultatul este de tipul cel"mai precis" al operanzilor, ordinea de "precizie" fiind pentruadunare i scdere: Byte, Integer, Long, Single, Double, Currency iDecimal. Deoarece operanzii pot fi orice expresie, pentru oinformare complet(de exemplu operanzi Variant) se va studia Help

  • 5/22/2018 Curs VBA Excel

    17/83

    +(operator).

    - Scderea sauinversareasemnului

    operanzii pot fi doar numerici. Rezultatul este de tipul cel "maiprecis" al operanzilor, ordinea de "precizie" fiind pentru adunare iscdere: Byte, Integer, Long, Single, Double, Currency i Decimal.Daco expresie este Null, rezultatul este Null. O expresie Emptyeste consideratca 0. Pentru excepii se va studia Help -(operator).

    Operatori de comparareRelaiile care existntre diferite tipuri de entiti se pot evidenia prin comparaii avnd una dintre formeleurmtoare:

    result = expression1 comparisonoperator expression2

    result = object1 Isobject2

    result = string Likepattern

    unde

    resulteste o variabilnumeric

    expressioneste o expresie oarecarecomparisonoperatoreste un operator relaional

    objecteste un nume de obiect

    stringeste o expresie ir oarecare

    patterneste o expresie String sau un domeniu de caractere.

    Operatorii de comparare sunt cei uzuali: < (mai mic), (mai mare), >= (mai mare sau egal),= (egal), (diferit, neegal).

    Rezultatul este True (daceste adevratrelaia), False (dacrelaia este neadevrat), Null (daccel puin unoperand este Null).

    Operatorul Isproduce True dacvariabilele se referla acelai obiect i False n caz contrar.

    Operatorul Likecompardouiruri cu observaia cal doilea tremen este un ablon. Prin urmare rezultatul esteTrue dacprimul ir operand este format dupablon, False n caz contrar. Atunci cnd un operand este Null,rezultatul este tot Null.

    Comportarea operatorului Like depinde de instruciunea Option Compare, care poate fi:

    Option Compare Binary, ordinea este cea a reprezentrii interne binare, determinatn Windows de codul depagin.

    Option Compare Text, compararea este insenzitivla capitalizarea textului, ordinea este determinatde setrilelocale ale sistemului.

    Construcia ablonului poate cuprinde caractere wildcard, liste de caractere, domenii de caractere:

    ? un caracter oarecare* oricte caractere (chiar nici unul)

    # o cifroarecare (09).

    [charlist] oricare dintre caracterele enumerate n list, un domeniu de litere poate fi dat prin utilizareacratimei.

    [!charlist] orice caracter care nu este n list

    Observaie. Pentru a utiliza n ablon caracterele speciale cu valoare de wildcard se vor utiliza construcii de tiplist: [[], [?] etc. Paranteza dreapta va fi indicatsingur: ].

    Pentru alte observaii utile se va studia Help Like operator.

  • 5/22/2018 Curs VBA Excel

    18/83

    Operatori de concatenarePentru combinarea irurilor de caractere se pot utiliza operatorii & i +.

    n sintaxa

    expression1 & expression2

    unde operanzii sunt expresii oarecare, rezultatul este

    de tip String, dacambii operanzi sunt String

    de tip Variant(String) n celelalte cazuri

    Null, dacambii operanzi sunt Null.

    nainte de concatenare, operanzii care nu sunt iruri se convertesc la Variant(String). Expresiile Null sau Emptysunt tratate ca iruri de lungime zero ("").

    Operatori logiciPentru operaiile logice sunt utilizai urmtorii operatori, uzuali n programare.

    Operator Semnificaie Observaii

    And conjuncia logic Null cu False dFalse, Null cu True sau cu Null dNull.Operatorul And realizeazi operaia de conjuncie bit cubit pentru expresii numerice.

    Eqv echivalena logic Daco expresie este Null, rezultatul este Null. Eqvrealizeazi compararea bit cu bit a douexpresiinumerice, poziionnd cifrele binare ale rezultatului dupregulile de calcul ale echivalenei logice: 0 Eqv 0 este 1etc.

    Imp implicaia logic True Imp Null este Null, False Imp * este True, Null ImpTrue este True, Null Imp False (sau Null) este Null.Operatorul Imp realizeazi compararea bit cu bit a douexpresii numerice, poziionnd cifrele binare alerezultatului dupregulile de calcul ale implicaiei logice: 1Imp 0 este 0, n rest rezultatul este 1.

    Not negaia logic Not Null este Null. Prin operatorul Not se poate inversa bitcu bit valorile unei variabile, poziionndu-secorespunztor un rezultat numeric.

    Or disjuncia logic Null Or True este True, Null cu False (sau Null) este Null.Operatorul Or realizeazi o comparaie bit cu bit a douexpresii numerice poziionnd biii corespunztori airezultatului dupregulile lui Or logic.

    Xor disjunciaexclusiv

    Dacun operand este Null, atunci rezultatul este Null. Sepoate efectua operaia de sau exclusiv i bit cu bit pentrudouexpresii numerice [b1+b2(mod 2)].

    Instruciuni de atribuireAtribuirea se poate efectua prin instruciunea Let (pentru valori atribuite variabilelor i proprietilor), Set (pentruatribuirea de obiecte la o variabilde tip obiect), Lset i Rset (pentru atribuiri speciale de iruri sau tipuri definitede utilizator).

  • 5/22/2018 Curs VBA Excel

    19/83

    Instruciunea LetAtribuie valoarea unei expresii la o variabilsau proprietate.

    [Let] varname =expression

    unde varnameeste nume de variabilsau de proprietate.

    Este de remarcat forma posibil(i de fapt general utilizat) frcuvntul Let.

    Observaii. Valoarea expresiei trebuie sfie compatibilca tip cu variabila (sau proprietatea): valori numerice nupot fi atribuite variabilelor de tip String i nici reciproc.

    Variabilele Variant pot primi valori numerice sau String, reciproc nu este valabil dect dacvaloarea expresieiVariant poate fi interpretatcompatibilcu tipul variabilei: orice Variant poate fi atribuit unei variabile de tipString (cu excepia Null), doar Variant care poate fi interpretat nuric poate fi atribuit unei variabile de tip numeric.

    La atribuirea valorilor numerice pot avea loc conversii la tipul numeric al variabilei.

    Atribuirea valorilor de tip utilizator poate fi efectuatdoar dacambii termeni au acelai tip definit. Pentru altesituaii se va utiliza instruciunea Lset.

    Nu se poate utiliza Let (cu sau frcuvntul Let) pentru legarea de obiecte la variabile obiect. Se va utiliza naceastsituaie instruciunea Set.

    Instruciunea LSetCopie, cu aliniere la stnga, un ir de caractere (valoarea expresiei din dreapta) ntr-o variabila de tip String.

    Deoarece copierea este binar, poate fi utilizatpentru atribuiri ntre tipuri utilizator diferite (rezultatul esteimpredictibil deoarece nu se face nici o verificare de tipuri/componente ale valorilor de tip record). Sintaxa este

    LSetstringvar =string

    LSetvarname1 =varname2

    unde

    stringvar, stringreprezintvariabila de tip String i expresia de acelai tip implicate ntr-o atribuire de iruri.

    varname1, varname2sunt denumiri de variabile, de tipuri definite de utilizator (vezi instruciunea Type) diferite.Zona de memorie alocatcelei de a doua variabile este copiat(aliniatla stnga) n zona de memorie a primeivariabile.

    Caracterele care rmn neocupate se completeazcu spaii, iar daczona de unde se copie este mai mare,

    caracterele din dreapta se pierd (sunt trunchiate).Instruciunea LSet

    Copie, cu aliniere la dreapta, un ir de caractere (valoarea expresiei din dreapta) ntr-o variabila de tip String.Sintaxa este

    RSet stringvar= string

    Caracterele rmase neocupate n variabilsunt completate ccu spaii. Instruciunea RSet nu se poate utiliza (analoglui LSet) pentru tipuri definite de utilizator.

    Instruciuni executabileExecuia unui program are loc, n lipsa oricrui control, instruciune cu instruciune, de la stnga la dreapta i de susn jos. Acest sens poate fi modificat, ntr-o oarecare msur, prin ordinea de precedena operaiilor n evaluarea

    expresiilor. Este evident co asemenea structursimplnu poate cuprinde toate aspectele programrii i din acestmotiv necesitatea structurilor de control a fluxului execuiei. Unele instruciuni au fost pstrate doar din motive decompatibilitate cu versiunile iniiale ale limbajului, n locul lor fiind preferate structuri mai evoluate sau similarealtor limbaje de programare.

    Instruciuni de transfer (GoSubReturn, GoTo, OnError,OnGoSub, OnGoTo)

    Aceastcategorie cuprinde instruciunile prin care controlul execuiei este transferat la o altinstruciune dinprocedur. n general, utilizarea acestor comenzi nu produce programe foarte structurate (n sensul programriistructurate) i prin urmare, pentru o mai mare claritate a codului, pot fi nlocuite cu alte structuri de programare.

  • 5/22/2018 Curs VBA Excel

    20/83

    GoSubReturnn cadrul unei proceduri un grup de instruciuni poate fi organizat ca o subrutin(similar unei proceduri on-line,nenumite) identificatprin linia de nceput. Transferul controlului la acest grup de instruciuni i revenirea la loculapelului se poate efectua prin GoSubReturn cu sintaxa

    GoSub line...

    line

    ...Return

    unde lineeste o etichetde linie sau un numr de linie din aceeai procedur.

    Pot exista mai multe instruciuni Return, prima executatproduce saltul la instruciunea care urmeazcelei mairecente instruciuni GoSub executate.

    GoToRealizeaztranferul controlului execuiei la o linie din aceeai procedur.

    GoTo lineunde lineeste o etichetde linie sau un numr de linie din aceeai procedur.

    On Error

    Permite controlul erorilor prin transferul controlului la rutine de tratare.Observaie.Este prezentatn seciunea dedicatcontrolului erorilor.

    OnGoSub, OnGoToPermit o ramificare multipl, dupvaloarea unei expresii. Se recomand, pentru claritatea codului, utilizareastructurii Select Case n locul acestor structuri.

    Onexpression GoSubdestinationlist

    Onexpression GoTodestinationlist

    unde

    expressioneste o expresie numericavnd valoare ntreag(dupo eventualrotunjire) ntre 0 i 255 inclusiv.

    destinationlisteste o listde etichete de linii sau numere de linii, separate prin virgule (elementele pot fi de ambelecategorii), din aceeai procedurcu instruciunea.

    Dacvaloarea expresiei este negativsau mai mare dect 255 se produce o eroare.

    Dacvaloarea expresiei, fie ea k, este n domeniul rangurilor listei, atunci se transfercontrolul la linia identificatde al k-lea element al listei.

    Dacvaloarea expresiei este 0 sau mai mare dect numrul de elemente din list, transferul se efectueazla liniacare urmeazinstruciunea On...GoSub sau On...GoTo.

    Instruciuni de terminare sau oprire a programului(DoEvents, End, Exit, Stop)

    Terminarea execuiei programului sau oprirea temporar(pauza) se pot realiza prin instruciunile enumerate aici.

    DoEventsDei nu este o instruciune VBA ci este o funcie, includerea ei este naturalprin aceea cpermite cedareacontrolului ctre sistemul de operare, care poate astfel sfuncioneze n regim de multitasking. Aciunea poate firealizati prin alte tehnici (de exemplu utilizarea unui Timer etc.). Sintaxa este

    DoEvents( )Funcia returneaz, n general, valoarea 0.

    Controlul este redat programului dupce sistemul de operare a terminat procesarea evenimentelor din coada deevenimente, ca i procesarea tuturor caracterelor din coada SendKeys.

    Observaie. Pentru alte observaii se va studia documentaia comenzii DoEvents.

  • 5/22/2018 Curs VBA Excel

    21/83

    EndTerminexecuia unei proceduri (sub forma prezentataici) sau indicsfritul codului unei structuri de tip bloc(cum ar fi End Function, End If etc., prezentate la structurile respective).

    Sintaxa, n ipostaza opririi execuiei, este:

    End

    Prin aceastinstruciune, care poate fi plasatoriunde n program, execuia este terminatimediat, fra se maiexecuta eventualele instruciuni scrise pentru tratarea unor evenimente specifice sfritului de program (Unload,

    Terminate etc.).Fiierele deschise prin Open sunt nchise i toate variabilele sunt eliberate. Obiectele create din modulele classuntdistruse, iar referinele din alte aplicaii la asemenea obiecte sunt invalidate. Memoria este eliberat.

    ExitPrin instruciunea Exit, sub una din multiplele ei forme, se ntrerupe o ramurde execuie (cum ar fi o procedur, ostructuriterativetc.) pentru a se continua nivelul apelant. Sintaxa este

    Exit Do

    Exit For

    Exit Function

    Exit Property

    Exit Sub

    i efectele sunt prezentate la structurile respective. Nu trebuie confundatcu instruciunea End.

    StopEfectul instruciunii este dependent de modul de execuiei a programului. Dacse executvarianta compilataprogramului (fiierul .exe) atunci instruciunea este similarinstruciunii End (suspendexecuia i nchide fiiereledeschise). Dacexecuia este din mediul VBA, atunci se suspendexecuia programului, dar nu se nchid fiiereledeschise i nu se terge valoarea variabilelor. Execuia poate fi reluatdin punctul de suspendare.

    Stop

    Instruciunea este similarintroducerii unui punct de oprire (Breakpoint) n codul surs.

    Structuri iterative (Do...Loop, For...Next, For Each...Next,While...Wend, With)Prin intermediul construciilor de tip bloc prezentate n aceastseciune se poate repeta, n mod controlat, un grupde instruciuni. n cazul unui numr nedefinit de repetiii, condiia de oprire poate fi testatla nceputul sau lasfritul unui ciclu, prin alegerea structurii adecvate.

    DoLoopSe vor utiliza structuri DoLoop pentru a executa un grup de instruciuni de un numr de ori nedefinit aprioric.Dacse cunoate numrul de cicluri, se va utiliza structura ForNext.

    nainte de continuare se va testa o condiie (despre care se presupune cpoate fi modificatn instruciunileexecutate). Diferitele variante posibile pentru DoLoop diferdupmomentul evalurii condiiei i decizia luat.

    Do [{While | Until}condition]

    [statements][ExitDo]

    [statements]

    Loop

    sau

    Do

    [statements]

    [Exit Do]

  • 5/22/2018 Curs VBA Excel

    22/83

    [statements]

    Loop [{While | Until} condition]

    unde

    condition este o expresie care valoare de adevr True sau False. O condiie care este Null se considerFalse.

    statementssunt instruciounile care se repetatta timp (while) sau pncnd (until) condiia devine True.

    Dacdecizia este de a nu continua ciclarea, atunci se va executa prima instruciune care urmeazntregii structuri(deci de duplinia care ncepe cu Loop).

    Se poate abandona ciclarea oriunde n corpul structurii prin utilizarea comenzii Exit Do (cu aceastsintax). Dacapare o comandExit Do se poate omite chiar i condiia din enunntruct execuia se va termina prin aceastdecizie.

    Structurile Do pot fi inserate (dar complet) unele n altele. O terminare (prin orice metod) a unei bucle transfercontrolul la nivelul Do imediat superior.

    Execuia structurilor este explicatn tabelul urmtor

    Do WhileLoop Testeazcondiia la nceputul buclei, executbucla numaidacrezultatul este True i continuastfel pncnd o nouevaluare produce False.

    Do UntilLoop Testeazcondiia la nceputul buclei, executbucla numaidacrezultatul este False i continuastfel pncnd o nouevaluare produce True.

    DoLoop While Se executntotdeauna bucla o dat, se testeazcondiia lasfritul buclei i se repetbucla att timp ct condiia esteTrue. Oprirea este pe condiie fals.

    DoLoop Until Se executntotdeauna bucla o dat, se testeazcondiia lasfritul buclei i se repetbucla att timp ct condiia esteFalse. Oprirea este pe condiie adevrat.

    ForNextAtunci cnd se cunoate numrul de repetri ale unui bloc de instruciuni, se va folosi structura ForNext.Structura utilizeazo variabilcontor, a crei valoare se modificla fiecare ciclu, oprirea fiind atunci cnd seatinge o valoare specificat. Sintaxa este:

    Forcounter = start Toend [Stepstep]

    [statements]

    [Exit For]

    [statements]

    Next [counter]unde

    countereste variabila contor (numrrepetrile), de tip numeric. Nu poate fi de tip Boolean sau element de tablou.

    starteste valoarea iniiala contorului.

    endeste valoarea finala contorului.

    stepeste cantitatea care se adunla contor la fiecare pas. n cazul n care nu se specificeste implicit 1. Poate fi inegativ.

    statementssunt instruciunile care se repet. Dacnu se specific, atunci singura aciune este cea de modificare acontorului de un numr specificat de ori.

  • 5/22/2018 Curs VBA Excel

    23/83

    Aciunea este dictatde pasul de incrementare i relaia dintre valoarea iniiali cea final.

    Instruciunile din corpul structurii se executdac

    counter = 0 sau

    counter >= end pentru step < 0.

    Dupce toate instruciunile s-au executat, valoarea step este adugatla valoarea contorului i instruciunile seexecutdin nou dupacelai test ca i prima dat, sau bucla ForNext este terminati se executprima

    instruciune de duplinia Next.Specificarea numelui contorului n linia Next poate clarifica textul surs, mai ales n cazul cnd existstructuriForNext mbricate.

    Corpul unei bucle ForNext poate include (complet) o altstructurForNext. n asemenea situaii, structurilembricate trebuie saibvariabile contor diferite.

    Instruciunile Exit For pot fi plasate oriunde n corpul unei bucle i provoacabandonarea ciclrii. Controlulexecuiei se transferla prima instruciune de duplinia Next.

    For EachNextSimilarstructurii ForNext, structura For EachNext repetun grup de instruciuni pentru fiecare element dintr-o colecie de obiecte sau dintr-un tablou (cu excepia celor de un tip utilizator). Este utilatunci cnd nu secunoate numrul de elemente sau dacse modific, n timpul execuiei, coninutul coleciei.

    Sintaxa este:

    For Eachelement Ingroup

    [statements]

    [Exit For]

    [statements]

    Next[element]

    unde

    elementeste variabila utilizatpentru parcurgerea elementelor. Dacse parcurge o colecie deobiecte, atunci elementpoate fi Variant, o variabilgenericde tip Object, sau o variabilobiect

    specificpentru biblioteca de obiecte referit. Pentru parcurgerea unui tablou, elementpoate fi doaro variabilde tip Variant.

    groupeste numele coleciei de obiecte sau al tabloului.

    statementseste grupul de istruciuni executate pentru fiecare element.

    Execuia unei structuri For EachNext este

    1. Se definete elementca numind primul element din grup (dacnu existnici un element, setransfercontrolul la prima instruciune de dupNext se prsete bucla frexecutareainstruciunilor).

    Se executinstruciunile din corpul buclei For.

    Se testeazdac

    element este ultimul element din grup. Dac

    rspunsul este afirmatif, se p

    rsete bucla.

    2. Se definete elementca numind urmtorul element din grup.

    Se repetpaii 2 pnla 4.

    Instruciunile Exit For sunt explicate la ForNext.

    Buclele ForEach...Next pot fi mbricate cu condiia ca elementele utilizate la iterare sfie diferite.

    Observaie. Pentru tergerea tuturor obiectelor dintr-o colecie se va utiliza ForNext i nu For EachNext. Seva utiliza ca numr de obiecte colecie.Count.

    WhileWendExecutun grup de instruciuni att timp ct este adevrato condiie. Sintaxa

  • 5/22/2018 Curs VBA Excel

    24/83

    Whilecondition

    [statements]

    Wend

    Este recomandat sse utilizeze o structurDoLoop n locul acestei structuri.

    WithProgramarea orientatpe obiecte produce, datoritcalificrilor succesive, construcii foarte complexe atunci cndse numesc proprietile unui obiect. n cazul modificrilor succesive ale mai multor proprieti ale aceluiai obiect,

    repetarea zonei de calificare poate produce erori de scriere i conduce la un text greu de citit. Codul este simplificatprin utilizarea structurii WithEnd With. O asemenea structurexecuto serie de instruciuni pentru un obiect saupentru o variabilde tip utilizator. Sintaxa este:

    Withobject

    [statements]

    End With

    unde

    objecteste numele unui obiect sau a unui tip definit de utilizator

    statementssunt instruciunile care se executpentru entitatea precizat.

    Permind omiterea recalificrilor din referinele la obiectul precizat, orice construcie de tipul".nume" este interpretatn instruciunile structurii drept "object.nume".

    ntr-un bloc With nu se poate schimba obiectul procesat.

    La plasarea unui bloc With n interiorul altui bloc With, obiectul extern este mascat complet, deci calificrileeventuale la acest obiect vor fi efectuate.

    Nu se recomandsaltul n i dintr-un bloc With.

    Structuri de decizie (IfThenElse, Select Case)Ramificarea firului execuiei duprezultatul verificrii unei condiii este o necesitate frecventn oriceimplementare.

    Pe lngstructurile prezentate, se pot utiliza trei funcii care realizeazalegeri n mod liniarizat (pe o linie de cod):

    Choose(), Iif(), Switch().IfThenElse

    O asemenea structur, ntlnitde altfel n toate limbajele de programare, executun grup de instruciuni carspuns la ndeplinirea unei condiii (compussau nu din mai multe condiii testate secvenial). Sintaxa permite omare varietate de forme:

    Ifcondition Then[statements] [Elseelsestatements]

    sau

    Ifcondition Then

    [statements]

    [ElseIfcondition-n Then

    [elseifstatements]...

    [Else

    [elsestatements]]

    End If

    unde

    conditionare una din formele: expresie numericsau ir care se poate evalua True sau False (Null este interpretatFalse);expresie de forma TypeOfobjectnameIsobjecttype, evaluatTrue dacobjectname este de tipul obiect specificatn objecttype.

  • 5/22/2018 Curs VBA Excel

    25/83

    statements, elsestatements, elseifstatementssunt blocurile de instruciuni executate atunci cnd condiiilecorespunztoare sunt True.

    La utilizarea primei forme, frclauza Else, este posibil sse scrie mai multe instruciuni, separate de ":", peaceeai linie.

    Verificarea condiiilor implicevaluarea tuturor subexpresiilor, chiar dacprin jocul operanzilor i operatorilorrezultatul poate fi precizat mai nainte (de exemplu OR cu primul operand True).

    Select Case

    Instruciunea Select Case se poate utiliza n locul unor instruciuni ElseIf multiple (dintr-o structurIfThenElseIf) atunci cnd se comparaceeai expresie cu mai multe valori, diferite ntre ele. InstruciuneaSelect Case furnizeaz, prin urmare, un sistem de luare a deciziilor similar instruciunii IfThenElseIf. Totui,Select Case produce un un cod mai eficient i mai inteligibil. Sintaxa este:

    Select Casetestexpression

    [Caseexpressionlist-n

    [statements-n]] ...

    [Case Else

    [elsestatements]]

    End Select

    undetestexpressioneste o expresie numericsau ir.

    expressionlist-neste lista, separatprin virgule, a uneia sau mai multe expresii de forma:

    expression.

    expression To expression. Cuvntul Tointroduce un interval de valori, valoarea minimfiindprima specificat.

    Is comparisonoperator expression. Se va utiliza Iscu operatori de comparare (exceptnd Isi Like)pentru a specifica un domeniu de valori.

    statements-nreprezintuna sau mai multe instruciuni care se vor executa dactestexpressioneste egalcu un

    element din expressionlist-n.elsestatementsreprezintuna sau mai multe instruciuni care se vor executa dactestexpressionnu este egalcunici un element din listele liniilor Case.

    Dactestexpression se potrivete cu un element dintr-o listCase, se vor executa instruciunile care urmeazaceastclauzCase pnla urmtoarea clauzCase, sau pnla End Select. Control execuiei trece apoi lainstruciunea care urmeazliniei finale End Select. Rezultcdactestexpression se regsete n mai multe liste,doar prima potrivire este considerat.

    Clauza Case Else are semnificaia uzual"altfel, n rest, n caz contrar etc.", adicintroduce instruciunile care seexecutatunci cnd expresia de test nu se potrivete nici unui element din listele clauzelor Else. Dacaceasta estesituaia i nu este specificato clauzCase Else, atunci execuia urmeazcu prima instruciune de dupEnd Select.

    Instruciunile Select Case pot fi scufundate unele n altele, structurile interioare fiind complete (fiecare structurare

    End Select propriu, includerea este complet).Apeluri de proceduri i programe

    n aceastseciune se prezintdoar funcia Shell(), deoarece despre proceduri i apelul lor s-a discutat n capitolul1.

    Funcia Shell()Executun program executabil i returneazun Variant(Double) reprezentnd ID-ul de task al programului n cazde succes; n caz contrar returneazzero. Sintaxa este

    Shell(pathname[,windowstyle])

    unde

  • 5/22/2018 Curs VBA Excel

    26/83

    pathnameeste Variant (String). Conine numele programului care se execut, argumentelenecesare i poate da calea complet(daceste nevoie).

    windowstyleeste Variant (Integer) i precizeazstilul ferestrei n care se va executa programul(implicit este minimizat, cu focus).

    Valorile posibile pentru argumentul windowstyle sunt

    Constanta numit Valoarea Semnificaia

    VbHide 0 Fereastra este ascunsiar focus-ul este pefereastra ascuns.

    VbNormalFocus 1 Fereastra are focus-ul i este dimensionati poziionatnormal.

    VbMinimizedFocus 2 Fereastra este afiatca o icoan(minimizat) dar are focus-ul.

    VbMaximizedFocus 3 Fereastrmaximizat, cu focus.

    VbNormalNoFocus 4 Fereastra este normal(restauratlamrimea i poziia cea mai recent) dar nuare focus-ul. Fereastra activcurentipstreazfocus-ul.

    VbMinimizedNoFocus 6 Fereastrminimizat, frfocus. Fereastraactivcurenti pstreazfocus-ul.

    Dacfuncia Shell nu poate porni programul specificat se va semnala eroare. Programul pornit prin Shell se executasincron, deci nu existcertitudinea cacest program se terminnainte de execuia instruciunilor care urmeazliniei Shell.

    Operaiuni de intrare-ieiren categoria operaiunilor de I/O se pot deosebi

    schimbul de informaii cu utilizatorul: acesta se poate desfura prin intermediul unor formulare (forms) predefinite(InputBox, MsgBox) sau prin intermediul unor formulare definite de dezvoltatorul proiectului VBA.

    schimbul de informaii cu fiiere i/sau baze de date: acesta se realizeazprin intermediul unor instruciuni dedicateacestor operaii.

    Dialogul standard cu utilizatoruln general, utilizatorul rspunde la apariia unei boxe de dialog prin acionarea butonului adecvat rspunsului sui/sau prin nscrierea unei informaii ntr-o zondedicatacestui scop. Informaia nscriseste transferatprogramului ca valoare a funciei care iniiazdialogul grafic.

    Funcia InputBoxApelul funciei InputBox afieazo boxde dialog care conine un mesaj, doubutoane (OK i Cancel) i o zontext n care se poate tasta un rspuns (de tip String, chiar dacse transmite o valoare numeric). Se ateaptcautilizatorul sintroducun text n zona rezervatsau sacioneze un buton. Textul introdus este transmis cavaloare a funciei la acionarea butonului OK (sau Enter), iar acionarea butonului Cancel (ca i nchidereadialogului ca fereastr) transmite un ir de lungime zero (indiferent de valoarea zonei text. Sintaxa este

    InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])

    unde

    prompt este expresia String cu mesajul afiat n dialog (max. 1024 caractere). Mesajul poate fi aranjat pe mai multelinii prin combinaii de caractere Chr(13) carriage return, Chr(10) linefeed, Chr(13)&Chr(10) CR+LF.

  • 5/22/2018 Curs VBA Excel

    27/83

    title este expresia de tip String cu titlul ferestrei dialogului. Daceste omis se va folosi titlul aplicaiei.

    default este expresia de tip String, opional, coninnd textul afiat iniial n zona text rezervatutilizatorului.Textul este, n lipsa modificrii lui, retransmis ca rspuns (acionnd butonul OK).

    xpos este expresia numericspecificnd poziia orizontala dialogului (n twips, de la latura stnga a ecranului).n lipsa argumentului, boxa de dialog este centratorizontal.

    ypos este expresia numericspecificnd poziia verticala dialogului (n twips, de la latura de sus a ecranului).n lipsa argumentului, boxa de dialog este poziionatla aproximativ o treime de ecran.

    helpfileeste expresia de tip String care identificfiierul Help utilizat.Daceste indicat helpfile,trebuie sfieprecizat i context. Textul de ajutor poate fi vzut prin tasta F1, anumite aplicaii afieazi un buton Help.

    contextExpresie numericcu numrul de context Help al intrrii corespunztoare dialogului afiat. Apareobligatoriu mpreuncu helpfile.

    Dacvaloarea funciei nu este atribuit(sau utilizatntr-o altexpresie), este evident cse pierde, frsemnalareavreunei erori.

    Funcia MsgBoxUn dialog mai simplu dect InputBox este realizat prin forma predefinitafiatde funcia MsgBox. Se afieazunmesaj ntr-o boxde dialog i se ateaptca utilizatorul sacioneze unul dintre butoanele existente (numrul itipul lor lor este fixat la proiectarea aplicaiei). Funcia returneazun ntreg indicnd care buton a fost acionat.Sintaxa este

    [intvariable=]MsgBox(prompt[, buttons] [, title] [, helpfile, context])unde

    prompt este textul mesajului (Vezi InputBox)

    buttonseste o expresie numericegalcu suma valorilor care specificnumrul, tipul i atributele butoanelor. Aicise fixeazi modalitatea ferestrei (Vezi constantele predefinite din tabelul care urmeaz). Valoarea impliciteste 0.

    title,helpfile, context identice cu argumentele similare descrise la InputBox.

    Constantele recomandate pentru formarea argumentului buttonssunt

    Constanta Valoare Descriere

    VbOKOnly 0 Numai butonul OK

    VbOKCancel 1 OK i Cancel

    VbAbortRetryIgnore 2 Abort, Retry i Ignore

    VbYesNoCancel 3 Yes, No i Cancel

    VbYesNo 4 Yes i No

    VbRetryCancel 5 Retry i Cancel

    VbCritical 16 Icoana de Critical Message

    VbQuestion 32 Icoana de Warning Query

    VbExclamation 48 Icoana Warning Message

    VbInformation 64 Icoana de Information Message

  • 5/22/2018 Curs VBA Excel

    28/83

    VbDefaultButton1 0 Primul buton este cel implicit (echivalentcu Enter)

    VbDefaultButton2 256 Al doilea buton este cel implicit

    VbDefaultButton3 512 Al treilea buton este cel implicit

    VbDefaultButton4 768 Al patrulea buton este cel implicit

    VbApplicationModal 0 Application modal: aplicatia curentesteopritpncnd rspunde utilizatorul

    VbSystemModal 4096 System modal: toate aplicaiile sunt opritepncnd utilizatorul rspunde la dialog

    Valorile 0-5 descriu butoanele, 16,32,48 i 64 descriu stilul icoanei afiate, 0, 256 i 512 determinbutonulimplicit, iar ultimul grup (0 i 4096) determinmodalitatea boxei de dialog. La formarea argumentului Buttons seva adundoar cte un numr din fiecare grup.

    Pentru a utiliza valoarea returnatde funcie, aceasta trebuie inclusntr-o expresie (eventual atribuituneivariabile ntregi).

    Valorile returnate de funcie i care pot fi testate, n expresii logice, pentru a alege ramura de prelucrare doritdeutilizator sunt

    Constanta Valoare Descriere

    VbOK 1 OK

    VbCancel 2 Cancel

    VbAbort 3 Abort

    VbRetry 4 Retry

    VbIgnore 5 Ignore

    VbYes 6 Yes

    VbNo 7 No

    Acionarea tastei Esc este echivalentcu acionarea butonului Cancel (dacacesta este prezent). Dacn dialog esteprezent butonul Help, acionarea lui nu termindialogul.

    Utilizarea fiierelorProcesrile tipice programate n VBA prelucreazinformaii din doumari categorii de fiiere:

    fiiere ale aplicaiilor server (.doc n Word, .xls n Excel etc.)

    fiiere utilizator (create i/sau gestionate de proiect pentru date de intrare, temporare sau de ieire).

    Accesarea directa fiierelor din prima categorie (frapelul aplicaiei server specifice) poate produce

    coruperea fiierului, astfel nct nu mai este recunoscut de aplicaia mam. Prelucrarea acestor fiiere

    trebuie sfie executatn aplicaiile care le-au creat.

  • 5/22/2018 Curs VBA Excel

    29/83

    Pentru lucrul cu un fiier utilizator (n continuare prin fiier se va nelege, fralte precizri, un fiier utilizator)acesta trebuie mai nti deschis (instruciunea Open), operaiunea producnd i crearea fiierului n cazul unui fiierinexistent (nou). Duputilizare fiierul trebuie sfie nchis (operaiune efectuat, la terminarea normalaprogramului, n mod automat).

    Un fiier are ataat un numr de identificare, unic pentru un proces. Identificare fiierului se poate efectua, nprogram, prin numele su sau prin numrul ataat. Numrul poate fi n domeniul 1255 pentru fiierele propriiaplicaiei i n domeniul 256511 pentru fiiere accesibile din alte aplicaii. Un numr neutilizat (liber) poate fifurnizat de apelul la funcia FreeFile().

    Existtrei moduri de acces la nregistrrile unui fiier, acces definit la deschiderea acestuia.acces secvenial (modurile Input, Output i Append), utilizat de regulpentru scrierea fiierelor text (rapoarte,jurnale etc.);

    acces raandom (aleator) (modul Random), n cazul cnd este necesar sse scrie i sse citeascnregistrrile ntr-oordine nedefinit, operaiunile de intrare/ieire fiind amalgamate ntre ele;

    acces binar (modul Binary), utilizat la citirea/scrierea fiierelor byte cu byte (de exemplu fiiere bitmap).

    Un fiier deschis cu un mod de acces trebuie exploatat n acest mod pncnd este nchis i deschis n alt mod(dacstructura lui permite aa ceva).

    Instruciunile tipice pentru accesul la informaiile dintr-un fiier sunt

    Modul de acces Scriere Citire

    Secvenial Print #, Write # Input #

    Random Put Get

    Binar Put Get

    Deoarece gestionarea fiierelor nu se rezumdoar la scriere/citire, n tabelul urmtor este un rezumat alprincipalelor operaiuni pe care le suportfiierele, cu instruciunile care faciliteazrespectiva aciune.

    Aciune Instruciuni

    Citire Get, Input, Input #,Line Input #

    Controlul ieirilor Format, Print, Print #,Spc, Tab,Width#

    Copierea unui fiier FileCopy

    Creare, acces Open

    Fixarea atributelor FileAttr, GetAttr, SetAttr

    Fixarea poziiei active decitire/scriere

    Seek

    Inchidere Close, Reset

    Informaii despre un fiier EOF,FileAttr, FileDateTime, FileLen,FreeFile, GetAttr, Loc, LOF,Seek

  • 5/22/2018 Curs VBA Excel

    30/83

    Lungimea unui fiier FileLen

    Operaii asupra fiierelor Dir, Kill, Lock, Unlock, Name

    Scriere Print #, Put, Write #

    Doar instruciunile i funciile des utilizate sunt prezentate n continuare, pentru celelalte se va studia intrarea

    corespunztoare din Help (n mediul VBA).Open

    Deschide un fiier n sensul crezervo zontampon (buffer) pentru fiier i determinmodul de acces utilizat. Nuse pot efectua instruciuni de I/O pe un fiier dacacesta nu este deschis n prealabil. Sintaxa:

    Openpathname Formode [Accessaccess] [lock]As[#]filenumber[Len=reclength]

    unde

    pathname expresie String care specificnumele fiierului (poate include ntreaga cale unitate, directoare etc.,dupregulile uzuale);

    mode cuvnt cheie care specificmodul de acces la fiier:Append, Binary, Input, OutputsauRandom; dacnu sespecificnimic se va considera accesRandom;

    access clauzopionalspecificnd operaiunile I/O permise pentru fiier:Read, Write sau Read Write;

    lock clauzopionalspecificnd operaiile asupra fiierului permise altor procese care se execut(cnd fiieruleste deschis): Shared, Lock Read, Lock Writei Lock Read Write.

    filenumber numrul de fiier pentru fiierul deschis (ntre 1 i 511, vezi observaia din partea introductiv);funcia FreeFile furnizeazurmtorul numr disponibil;

    reclength numr (

  • 5/22/2018 Curs VBA Excel

    31/83

    Pentru observaiile privind aciunea instruciunii Get, separat pentru modul Random i Binary, se va studia Help -Get. Observaiile sunt utile atunci cnd se opereaz, n special, cu tipurile Variant i cu tablouri.

    PutScrie valoarea unei variabile date ntr-un fiier deschis n prealabil. Datele scrise cu Put sunt, n general, citite dinfiier cu Get.

    Put [#]filenumber, [recnumber], varname

    unde

    filenumber este numrul fiierului unde se scriu datele (fiierul trebuie sfie deschis);recnumber numr opional n format Variant (Long), reprezintnumrul nregistrrii (modulRandom) saunumrul octetului (modul Binary) unde ncepe scrierea. Prima poziie este 1.

    varname numele variabilei a crei valoare se scrie n fiier.

    Dacnu se specificnumrul nregistrrii se va scrie n poziia activde dupultima instruciune Get, Put sauSeek. Argumentul lipseste indicat prin virgule: Put #4,,FileBuffer.

    Pentru observaiile privind aciunea instruciunii Put, separat pentru modul Random i Binary, se va studia Help -Put. Observaiile sunt utile atunci cnd se opereaz, n special, cu tipurile Variant i cu tablouri.

    Input #Citete date dintr-un fiier secvenial i le transfern variabilele specificate.

    Instruciunea se va utiliza doar cu fiierele deschise n modul Input sau Binary, datele citite cu Input # sunt scrise,de regul, cu Write #.

    Input #filenumber, varlist

    unde

    filenumber numrul fiierului (deschis n prealabil);

    varlist listde variabile, delimitate de virgule, pentru care se citesc valorile din fiier. Nu se pot include nume detablouri sau variabile Object, dar se acceptelemente de tablou i variabiel de tipuri utilizator.

    Pentru situaiile uzuale (tipuri numerice sau String standarde) asignarea valorilor se efectueazfrmodificri.Pentru alte situaii:

    Informaia citit Valoarea asignat

    Virgulsau linie goal Empty

    #NULL# Null

    #TRUE# sau #FALSE# True sau False

    #yyyy-mm-dd hh:mm:ss# Data i/sau timpul reprezentat de expresie

    #ERROR errornumber# errornumber (variabila este un Variantconsiderat drept eroare)

    Ghilimelele duble (" ") sunt ignorate n irul de intrare.

    Pentru o citire corect, datele din fiier trebuie saparn aceeai ordine i de acelai tip cu variabilele din list. Ovariabilnumericprimete valoarea 0 dacintrarea corespunztoare nu este numeric. Atingerea sfritului defiier cnd operaiunea de citire nu este ncheiat, provoaceroare.

    ntruct utilizarea fiierelor este, n mod uzual, aceea de memorare controlata unor informaii (i nu aceea de adescifra informaii scrise ntr-o structurnecunoscut), se recomandscrierea cu Write # n cazul utilizriiulterioare a comenzii Input #.

    Funcia Input()

  • 5/22/2018 Curs VBA Excel

    32/83

    Citete i returneazun ir de caractere citite dintr-un fiier deschis n mod Input sau Binary. Datele citite prinaceastfuncie sunt scrise, de regul, prin Print # sau Put.

    Input(number, [#]filenumber)

    unde

    number orice expresie numericspecificnd numrul de caractere care se citesc.

    filenumber numr de fiier (deschis).

    Spre deosebire de instruciunea Input #, funcia Input returneaztoate caracterele citite (inclusiv virgule, CR, LF,ghilimele i spaii de nceput).

    Pentru fiierele deschise pentru acces Binary, ncercarea de a citi prin funcia Input pncnd EOF returneazTruegenereazeroare (procedeul este valid pentru citirea din f