Programarea aplicatiilor MS Office (Visual Basic pentru Aplicatii)

Embed Size (px)

DESCRIPTION

VBA (Visual Basic for Applications) este un limbaj de programare creat de Microsoft pentru automatizarea aplicatiilor. Atasat initial componentelor din Microsoft Office, în prezent sunt raportate peste 200 de aplicatii care include VBA (CorelDraw, AutoCAD etc.).VBA este parte a familiei de limbaje Visual Basic, situandu-se sub VB, dar peste VBScript. Totusi, VBA este acum un element esential in versiunea completa VB, oferind suport pentru limbaj, interfata pentru forme, controale, obiecte, tehnologii de accesare a datelor.Se prezinta mediul de dezvoltare Visual Basic for Applications integrat in Microsoft Office.

Citation preview

  • Programarea aplicaiilor Microsoft Office (Visual Basic for Applications)

    Introducere VBA (Visual Basic for Applications) este un limbaj de programare creat de Microsoft pentru automatizarea aplicaiilor. Ataat iniial componentelor din Microsoft Office, n prezent sunt raportate peste 200 de aplicaii care include VBA (CorelDraw, AutoCAD etc.). VBA este parte a familiei de limbaje Visual Basic, situndu-se sub VB, dar peste VBScript. Totui, VBA este acum un element esenial n versiunea complet VB, oferind suport pentru limbaj, interfaa pentru forme, controale, obiecte, tehnologii de accesare a datelor. Atunci cnd este gzduit de alt aplicaie, cum ar fi Excel, VBA ofer mijloacele de interaciune cu obiectele aplicaiei gazd. In acest caz, VBA permite dezvoltatorilor s furnizeze soluii complete care extind i/sau integreaz aplicaiile gazd. Pentru a programa n VBA trebuie totui reinut c o cerin supli-mentar fa de alte limbaje este aceea c trebuie s se cunoasc aplicaia gazd (Word, Excel, PowerPoint, Access etc.). Scurt istoric

    1993 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 liceniaz VBA pentru utilizarea n alte aplicaii software

    Editorul Visual Basic n aceast seciune se prezint mediul 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 program asociat cu documente Microsoft Office. Proiectele dezvoltate n VBE, dei sunt asociate aplicaiilor din Office, nu pot fi reduse, ca problematic, la procesarea de texte (Word), calcul tabelar (Excel), prezentri electronice (PowerPoint) sau baze de date (Access). Este corect s se considere aceste proiecte drept aplicaii similare celor dezvoltate n alte medii de programare, avnd ns la dispoziie componentele aplicaiilor din Office. Cu alte cuvinte, nu este vorba de o limitare a posibilitilor de prelucrare, ci o potenare a acestora prin apelul posibil la obiectele din Office. O obiecie la utilizarea VBA este aceea c proiectul 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 n dezvoltarea proiectului compenseaz acest neajuns. n plus nu trebuie uitat c orice aplicaie necesit o interfa utilizator (puternic n Microsoft Office) i c aplicaiile de baz sunt ntreinute i completate de Microsoft, astfel nct proiectele noastre se vor actualiza i ele o dat cu componentele Office. Un ultim argument este acela c mediul VBE este identic cu mediul de dezvoltare din Microsoft Visual Studio (Visual Basic, C++ etc.) astfel c practica n VBA poate fi considerat introductiv ctre alte aplicaii RAD. Interfaa grafic VBE Pentru a deschide editorul VB, mai nti se va porni o aplicaie din Microsoft Office, apoi se poate aciona

    combinaia Alt+F11 (dac nu a fost atribuit altei operaiuni), sau butonul Visual Basic Editor de pe bara de unelte Visual Basic (meniul View, Toolbars etc.) vizualizat ntr-o aplicaie Office, sau

    Meniul Tools, Macro, Visual Basic Editor.

  • Interfaa grafic VBE este suficient de complex, asemntoare mediilor de programare din Visual Studio. Pe lng obiectele grafice uzuale (Menu Bar, bare de unelte) sunt disponibile ferestre specializate pentru lucrul cu anumite categorii 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 surs al proiectului activ;

    Locals Window care permite vizualizarea variabilelor locale cu valorile lor;

    Immediate Window care permite executarea imediat a unei linii de cod;

    Watch Window unde se afieaz valorile unor expresii specificate (utile n depanarea programelor). Properties Window

    Prin proprietate a unui obiect se nelege o caracteristic a respectivului obiect (cum ar fi culoarea sau vizibilitatea etc.). Fixarea valorii proprietii se reflect n aparena obiectului sau n comportamentul lui (de exemplu, fixarea proprietii ShowSpellingErrors la valoarea True arat n document erorile de scriere). Fereastra Properties poate fi utilizat, n momentul proiectrii, pentru a vizualiza toate proprietile obiectului activ i a modifica valorile dorite. n partea superioar este cutia de obiecte n care se poate selecta un obiect (sau mai multe) dintre cele vizibile. n fia Alphabetic se listeaz proprietile modificabile ale obiectului selectat, n ordine alfabetic. Se poate modifica valoarea unui atribut prin selectarea numelui proprietii i tastarea sau selectarea noii valori. n fia Categorized sunt listate proprietile dup categorii, ntr-un control de tip Explorer, in care ramurile pot fi expandate sau. Fereastra Properties poate fi artat (cnd nu este vizibil), prin

    comanda Properties Window din meniul View. Project Explorer

    Codul surs asociat cu un workbook, document, template sau prezentare este asociat ntr-un proiect, care este memorat i salvat n mod automat o dat cu caietul Excel, documentul Word, ablonul sau prezentarea 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, obiectele care recunosc evenimente, formele, modulele, referinele. Pentru a vedea codul dintr-un modul sau codul asociat unui obiect, se selecteaz respectivul modul sau obiect i se apas butonul View Code (primul din stnga). Pentru a vedea interfaa utilizator pentru un obiect sau form se selecteaz i se apas butonul View Object (cel din mijloc). Pentru a vedea organizarea n foldere a elementelor listate n Project Explorer se va apsa butonul Toggle Folders. Fiecare element este nsoit, n arborele de structur, de icoana specific elementului: proiect, folder, referin, obiect etc.

    Code Window

  • Fereastra principal a Editorului Visual Basic este cea n care se poate scrie codul surs. Deoarece procedurile sunt asociate unor obiecte de interfa, sau aparin unui modul, mai nti se va selecta, din Project Explorer, modulul sau forma vizat i apoi se va apsa butonul View Code. Pentru a vedea mai mult de o procedur n fereastra de cod, se va selecta boxa de control Default to Full Module View n fia Editor din Options (meniul Tools) (n caz contrar se va vedea doar cte o procedur).

    n partea de sus a ferestrei se gsesc dou boxe: Object Box unde se poate selecta obiectul pentru care se afieaz procedurile asociate; Procedures/Events Box unde se poate selecta procedura pentru care se vizualizeaz/editeaz codul. Procedurile pot fi de tip eveniment, dac obiectul selectat este o form utilizator. Selectarea unei proceduri produce o defilare a textului astfel nct pointerul s fie la prima linie a procedurii.

    Pot fi deschise mai multe ferestre de editare, textul poate fi mutat/copiat ntre ferestre, ferestrele se pot diviza utiliznd bara de divizare etc. Acionarea butonului Procedure View Icon (primul din stnga, pe bara de jos a ferestrei) sau a butonului Full Module View Icon produce alegerea ntre vizualizarea unei singure proceduri sau a tuturor procedurilor din modul.

    Locals Window Util n procesul de punere la punct a programului, fereastra Locals servete la afiarea automat a tuturor variabilelor declarate n procedura curent. Coninutul ferestrei este actualizat de fiecare dat cnd se trece din modul Run n modul Break sau atunci cnd se navigheaz n stiva de apeluri. Pentru o descriere a ferestrei se va vedea seciunea dedicat depanrii programelor.

    Immediate Window Permite scrierea i execuia imediat a unei linii de cod. Linia poate fi copiat n i dintr-o fereastr de cod. n modul de execuie Break, instruciunea din fereastra Immediate este executat n contextul procedurii afiate n Procedure Box. Pentru aciunile posibile n fereastra Immediate, se va studia Help Immediate Window Keyboard Shortcuts.

    Watch Window Este fereastra unse sunt afiate automat valorile expresiilor urmrite n etapa de depanare a proiectului. Pentru o descriere a ferestrei Watch se va vedea seciunea dedicat depanrii programelor.

    Scrierea procedurilor Instruciunile unui proiect se pot nscrie, dup modul lor de creare, n dou mari categorii:

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

    scrise ntr-o fereastr de cod de ctre utilizator (proiectant), cu asistena mediului VBE. nregistrarea unui macro

    Aciunea este util att prin aceea c operaiuni simple pot fi traduse uor n instruciuni VBA, procedurile pot fi editate din VBE, iar pentru proceduri mai complexe (cum ar fi operatiuni de cutare/nlocuire sau formatri de

  • obiecte grafice) codul generat automat ofer un bun model de utilizare a obiectelor, proprietilor i metodelor aplicaiei. Pentru a nregistra un macro:

    Se afieaz bara de unelte Visual Basic (meniul View - Toolbars i selectarea barei dorite). Pe bara Visual Basic se acioneaz butonul Record Macro. n dialogul Record Macro se nlocuiete numele dat implicit n boxa Macro Name i apoi OK.

    Se poate utiliza boxa Store macro pentru a alege locul de memorare a codului.

    Se execut aciunile menite s fie nregistrate/traduse n VB, n succesiunea dorit.

    Pe bara Stop Recording (aprut la iniierea procesului de nregistrare) se apas butonul Stop Recording.

    Pentru a vedea liniile de cod generate, se deschide n aplicaia de baz meniul Tools, comanda Macro, apoi Macros, se selecteaz dup denumire i se apas butonul Edit. Codul surs poate fi vzut i prin navigarea n VBE prin Project Explorer, ferestre de cod etc. Din punctul de vedere al programrii se poate spune c un macro este o procedur public fr argumente, deci poate fi scris i direct n fereastra de cod a unui document. Din punct de vedere formal, toate procedurile care pot fi executate din dialogul Macros (Tools - Macro - Macros) sunt macro-uri.

    Scrierea unei proceduri Dac se dorete scrierea unor proceduri generale, care nu sunt asociate unui obiect sau eveniment specific, se ca crea o procedur ntr-un modul standard. Pentru a crea un modul standard nou (gol), se merge n Project Explorer n proiectul unde se adaug modulul nou creat i se d comanda Module din meniul Insert. Pentru a deschide un modul standard existent, se va selecta modulul din Project Explorer i se apas butonul View Code (sau dublu click). Pentru a aduga o procedur la un modul, se selecteaz modulul n Project Explorer, se deschide meniul Insert i se d comanda Procedure. Se deschide dialogul Add Procedure unde se vor selecta opiunile definitorii (subrutin sau funcie, public sau nu etc.) i se d OK. Dup aceasta se pot aduga liniile de cod ale procedurii.

    Scrierea unei proceduri de eveniment (event procedure) Dac se dorete scrierea de cod surs care s se execute automat atunci cnd are loc un anumit eveniment (cum ar fi deschiderea unui document, acionarea unui buton etc.), trebuie s se scrie o procedur asociat evenimentului respectiv. O asemenea procedur se va numi procedura evenimentului. Anumite obiecte din aplicaiile Microsoft Office recunosc un set predefinit de evenimente, care pot fi declanate de ctre sistem sau de ctre utilizator. Evenimentele specifice fiecrui obiect trebuie s fie studiate separat (se va studia seciunea din Help pentru fiecare aplicaie), doa principalele obiecte, cu proprietile, metodele si evenimentele lor, sunt prezentate i n acest curs, n capitole separate. Modul cum aplicaia rspunde la evenimentele recunoscute poate fi controlat prin scrierea procedurilor de eveniment. O asemenea procedur se va scrie n fereastra Code asociat obiectului. De fiecare dat cnd apare evenimentul se execut procedura evenimentului respectiv. De exemplu, dac se scrie o procedur asociat cu evenimentul Open al unui document Word, procedura se va executa automat la fiecare deschidere a acelui documentului. O procedur de eveniment este memorat n documentul, caietul, foaia de calcul, diapozitivul, forma utilizator etc. unde poate fi declanat evenimentul. Pentru a vedea codul surs al procedurii, se va selecta obiectul n Project Explorer i click pe butonul View Code pentru a deschide fereastra de cod asociat. Dintr-o fereastr de cod deschis, asociat, se va selecta obiectul vizat, din boxa de obiecte, i n boxa de proceduri vor fi listate atunci toate procedurile evenimentelor, chiar dac ele nu sunt efectiv scrise. Selectarea unui eveniment va scrie (dac nu 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 de caracterul "_" i de numele evenimentului asociat. De exemplu, Document_Open este numele procedurii care se execut la deschiderea unui document.

  • Pentru controale ActiveX, numele este legat de numele codului controlului. Schimbarea numelui codului dup ce 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. Dac se dorete ca o procedur s fie asociat cu un document specific, dar nu cu un eveniment specific, atunci procedura se va scrie n seciunea (General) a documentului respectiv (de exemplu o rutin care s poat fi apelat din mai multe proceduri de eveniment).

    Unelte VBE pentru scrierea instruciunilor Deoarece multe dintre denumirile obiectelor, proprietilor sau metodelor care apar n codul VBA sunt complexe, mediul de dezvoltare ofer o serie de unelte pentru completarea automat a cuvintelor cheie, pentru oferirea de ajutor n reamintirea denumirilor etc. Dac s-au tastat suficient de multe caractere nct VB poate recunoate un cuvnt, atunci prin CTRL+SPACE, sau click pe butonul Complete Word de pe bara de unelte Edit, completeaz cuvntul. n dialogul Options (meniul Tools) se pot activa urmtoarele aciuni, executate automat la completarea unei linii de cod:

    verificarea automat a sintaxei Auto Syntax Check;

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

    afiarea unei liste cu informaii utile (logice la poziia curent a cursorului) la completarea instruciunii Auto List 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 automat a 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 exist cteva butoane, care ajut la completarea cuvintelor i expresiilor n timpul scrierii instruciunilor:

    List Properties/Methods deschide o cutie n fereastra Code cu proprietile i metodele permise pentru obiectul care precede caracterul punct ("."), util atunci cnd se opereaz cu obiecte. List Constants deschide n fereastra de cod, la punctul de inserie, o cutie cu constantele permise pentru proprietatea care precede semnul egal ("=") n instruciunea curent. Quick Info ofer, ca ajutor, sintaxa pentru o variabil, funcie etc. prin analiza locului punctului de inserie pe linia curent.

    Parameter Info arat o cutie, la punctul de inserie, cu informaia despre parametrii funciei n care este pointerul.

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

    Comment Block care transform n comentarii liniile selectate.

    Uncomment Block nltur semnul de comentarii la liniile selectate.

    Executarea unei proceduri Sub O procedur poate s se execute:

    automat, ca rspuns la declanarea unui eveniment (procedura evenimentului); din VBE, dac punctul de inserie este n procedur i se acioneaz butonul Run Sub/UserForm de

    pe bara de unelte Standard sau Debug; ca un macro, Run din dialogul Macros (Tools - Macro) al aplicaiei de baz;

  • apelat din alt procedur.

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

    Instruciunile VBA Tipuri de date Variabilele i constantele utilizate ntr-un program VBA pot avea diverse tipuri, specifice datelor memorate. Spre deosebire de alte limbaje de programare, exist un tip universal tipul Variant , care poate conine aproape orice alt tip de date. Acest tip este asignat n mod implicit tuturor variabilelor nedeclarate altfel, nct declararea explicit poate fi utilizat atunci cnd se dorete economisirea memoriei (tipul Variant aloc mai mult memorie), vitez n execuie sau atunci cnd se scriu date ntr-un fiier n acces direct.

    Boolean Domeniu de valori: True sau False (valorile logice) Memorie: 2 bytes Declarator de tip: Observaii. Convertirea valorilor numerice la tipul Boolean: 0 produce False, valorile nenule produc True. Convertirea valorilor de tip Boolean la alte tipuri numerice: False devine 0, True devine -1.

    Byte Domeniu de valori: 0255 (numere ntregi, fr semn) Memorie: 1 byte Declarator de tip: Observaii.

    Currency Domeniu 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 foarte important). Valorile sunt memorate n format ntreg, scalate prin 10 000, pentru a obine 15 cifre la partea ntreag i 4 cifre la partea zecimal (reprezentare n virgul fix).

    Date Domeniu de valori: 1 ianuarie 100 31 decembrie 9999, 0:00:00 23:59:59 Memorie: 8 bytes Declarator de tip: Observaii. Informaiile de tip dat calendaristic i/sau timp orar sunt memorate drept numere flotante, partea ntreag reprezentnd data calendaristic, partea fracionar reprezentnd timpul. La convertiri, miezul nopii este 0, miezul zilei este .5, numerele negative reprezint date nainte de 30 decembrie 1899. Poate fi atribuit ca valoare de tip date orice literal care reprezint o dat calendaristic recunoscut ca atare, literalul trebuind s fie cuprins ntre simboluri #, de exemplu #1 Jan 99#.

    Decimal Domeniu de valori: (vezi observaiile) Memorie: 12 bytes Declarator de tip: Observaii. Valorile de tip Decimal sunt memorate ca ntregi fr semn nsoii de un factor de scal, ntre 0 i 28, specificnd numrul de zecimale. Pentru scala=0 (fr parte zecimal), cea mai

  • mare valoare posibil este +/-79,228,162,514,264,337,593,543,950,335. Cu scala=28 cea mai mare valoare este +/-7.9228162514264337593543950335 iar cea mai mic valoare nenul este +/-0.0000000000000000000000000001. Not: Deocamdat, tipul Decimal poate fi utilizat doar ca subtip n Variant, adic nu se pot declara variabile ca fiind de tip Decimal. Acestea pot fi create ca Variant cu subtipul Decimal prin funcia Cdec (funcia foreaz o expresie s fie de un tip specificat, din aceeai categorie de funcii fiind i CBool, CByte etc.).

    Double Domeniu de valori: numere negative de la -1.79769313486232E308 pn la -4.94065645841247E-324; numere pozitive de la 4.94065645841247E-324 pn la 1.79769313486232E308 (numere flotante n dubl precizie). Memorie: 8 bytes Declarator de tip: # Observaii.

    Integer Domeniu de valori: -32 768 32 767. Memorie: 2 bytes Declarator de tip: % Observaii.

    Long Domeniu de valori: -2 147 483 648 2 147 483 647. Memorie: 4 bytes Declarator de tip: & Observaii.

    Object Domeniu de valori: (vezi observaiile) Memorie: 4 bytes Declarator de tip: Observaii. Adrese pe 32 de bii care se refer la obiecte. Prin instruciunea Set se atribuie unei variabile declarate de tip Object referina la obiectul dorit. Not. Prin declararea unei variabile de tip Object, referirea la un obiect prin Set produce o ataare trzie (la timpul execuiei run-time binding). Pentru o ataare timpurie (la timpul compilrii compile-time binding) se va utiliza o variabil declarat cu numele clasei respective.

    Single Domeniu de valori: numere negative de la -3.402823E38 pn la -1.401298E-45; numere pozitive de la 1.401298E-45 pn la 3.402823E38. Memorie: 4 bytes Declarator de tip: ! Observaii.

    String Domeniu de valori: ir de lungime variabil: pn la 2^31 caractere; ir de lungime fix: pn la 2^16 caractere. Memorie: 2 bytes Declarator de tip: $ Observaii. Un ir de lungime fix declarat Public nu poate fi utilizat ntr-un modul de clas.

  • Variant (default) Domeniu de valori: aceleai cu domeniile specificate la tipurile precedente i care pot fi subtipuri ale tipului Variant, cu meniunea c toate subtipurile numerice au domeniul de la Double. Memorie: n funcie de subtipul valorii: valorile numerice ocup 16 bytes, valorile de tip String necesit 22 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 diferenele de tip ale argumentelor la apelul procedurilor). Cu excepia datelor de tip String cu lungime fix i a datelor cu tipuri definite de utilizator, tipul Variant poate conine orice alt tip de dat. n plus poate s conin valorile speciale Empty, Error, Nothing i Null. Tipul considerat pentru o dat coninut ntr-un Variant poate fi determinat cu funcia VarType sau TypeName. Valorile unei variabile Variant pot s-i converteasc valorile automat. n general, datele numerice sunt memorate n tipul de origine, dar este posibil ca ele s fie promovate la tipul superior dac rezultatul unei operaii necesit acest fapt. De exemplu o valoare declarat iniial drept Integer i atribuit unui Variant va fi memorat ca un ntreg pn cnd, ridicnd-o de exemplu la o putere, valoarea ei excede domeniul tipului Integer. n acest caz are loc promovarea (ca mod de reprezentare) la tipul superior adecvat (Long sau Double). Dac depirea domeniului are loc pentru subtipurile Currency, Decimal sau Double, atunci se va semnala eroare. Utilizarea tipului Variant permite o tratare mai difereniat a irurilor de cifre: n operaii numerice vor 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 cu iruri este irul de lungime zero.

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

    Error este valoarea utilizat pentru a arta ndeplinirea unei condiii de eroare (prin convertirea unui real cu funcia CVErr). Procesarea se va efectua de ctre utilizator, tratarea automat a erorilor nu este activat la setarea acestor valori.

    Nothing este utilizat pentru disocierea unei variabile de tip Object de un obiect efectiv. Tipuri definite de utilizator Un tip de dat definit de utilizator reprezint echivalentul unei nregistrri dintr-un fiier (baz de date), adic o grupare de entiti de tipuri diferite. Definirea are loc la nivel de modul, prin instruciuni Type. Pentru clauzele care apar se va vedea discuia de la domeniul variabilelor. [Private | Public] Type varname elementname [([subscripts])] As type [elementname [([subscripts])] As type] . . .

    End Type unde varname este numele dat tipului definit, iar prin elementname se definesc componentele tipului. Se pot utiliza i componente de tipuri utilizator deja definite. Componentele pot fi i tablouri, caz n care apar definiiile specifice (vezi declararea variabilelor). Declararea constantelor, variabilelor i tablourilor

    Nume La denumirea procedurilor, constantelor, variabilelor i argumentelor ntr-un modul Visual Basic se cere respectarea urmtoarelor reguli:

  • primul caracter trebuie s fie o liter;

    nu se utilizeaz spaiu, punct (.), semnul exclamrii(!), sau caracterele @, &, $, # lungimea denumirii nu poate depi 255 de caractere;

    la acelai nivel de existen nu pot s existe denumiri identice. Pot s existe totui, n acelai modul, o variabil privat i o variabil la nivel de procedur care s poarte acelai nume.

    n general, nu se recomand definirea unor denumiri identice cu nume de funcii, instruciuni sau metode existente n Visual Basic. Dac s-a ajuns totui la aceast situaie, atunci utilizarea funciei intrinseci limbajului, a instruciunii sau metodei care intr n conflict cu un nume asignat necesit calificarea ei n raport de biblioteca asociat. De exemplu, VBA.Left este apelul la funcia Left atunci cnd este definit de utilizator i o variabil Left. Not. Visual Basic nu este case-sensitive, deci denumirea unei entiti nu are ca atribut distinctiv capitalizarea literelor, dar mediul de programare VBA pstreaz capitalizarea din instruciunea unde este definit un nume.

    Declararea constantelor Definirea unei constante se realizeaz prin instruciunea Const, n care se poate specifica tipul, domeniul i valoarea constantei. 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 toate procedurile din toate modulele. Nu este permis n proceduri. Private cuvnt cheie, opional, utilizat la nivel de modul pentru a declara constante recunoscute n toate procedurile 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 (nc nu este suportat), Date, String, sau Variant. Fiecare constant presupune o clauz As type proprie; n lipsa clauzei se va ataa automat tipul cel mai apropiat expresiei. expression combinaie de identificatori, constante, operatori (cu excepia Is) care produce un sir, numr sau obiect. 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 fi modificat prin utilizarea clauzei Public. La nivel de modul standard vizibilitatea poate fi modificat prin Public. Constantele declarate n proceduri Sub, Function sau Property sunt locale procedurii, constantele declarate n afara unei proceduri este definit n modulul respectiv. Mai multe declaraii de constante pot fi scrise pe o aceeai linie, separate prin virgule la nivel de atribuiri de expresii. n acest caz, cuvintele Public sau Private care apar se aplic ntregii linii.

    Exemple Const 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 lipsa clauzei As type se atribuie tipul expresiei). Declararea variabilelor Variabilele, simple sau tablou, se definesc prin instruciunile Dim, Private, Public, ReDim sau Static. Numele unei variabile trebuie s respecte 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 s apar naintea oricrei proceduri din modul, toate variabilele trebuie s fie declarate prin instruciunile menionate. Lipsa instruciunii Option Explicit permite ca variabilele s fie definite acolo unde este nevoie de ele prin simpla menionare a unui nou identificator, tipul lor fiind stabilit implicit. Aceast ultim posibilitate poate produce erori greu detectabile.

  • Sintaxa instruciunilor de declarare a variabilelor este urmtoarea i se observ asemnarea 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 (dac se declar o variabil tablou). Pot exista pn la 60 de indici, separai prin virgule, declararea dimensiunilor pentru un indice fiind de forma

    [lower To] upper Limita inferioar este, implicit, 0, dar poate fi controlat prin instruciunea Option Base. Dac nu se indic limitele indicilor (dar parantezele sunt prezente), se definete o variabil tablou dinamic (nu i prin Static) ale crei dimensiuni pot fi precizate/redefinite prin instruciunea ReDim.

    New permite crearea implicit a unui obiect (atunci cnd se declar o variabil de tip obiect). O nou instan a obiectului este creat la prima referin a variabilei definite. Clauza nu poate s apar la declararea variabilelor de tipuri intrinseci i nici la declararea instanelor obiectelor dependente. type tipul variabilei definite: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (nesuportat nc), Date, String (pentru iruri cu lungime variabil), String * length (pentru iruri cu lungime fix), Object, Variant, tip utilizator sau tip de obiect. Dac se definesc mai multe variabile ntr-o instruciune, definiiile se separ prin virgul iar clauza de tip nu este extins i la variabilele definite ulterior. Dei toate instruciunile permit declararea unor variabile (simple sau tablou), fiecare instruciune are un efect distinct 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 modul sunt accesibile n procedurile acelui modul, iar variabilele de la nivel de procedur sunt vizibile doar n procedura respectiv.

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

    Public este utilizat pentru a declara variabile accesibile n toate procedurile din toate modulele i din toate aplicaiile. Prin includerea instruciunii Option Private Module este posibil ca variabilele publice s fie vizibile doar n proiectul n care sunt definite.

    Static este utilizat la nivel de procedur nestatic pentru a declara variabile care i pstreaz valoarea de la o execuie a procedurii la alta, att timp ct modulul n care apare procedura nu este resetat sau repornit. Variabilele definite prin Static sunt vizibile doar n procedura respectiv. Este de remarcat c se poate defini o ntreag procedur utiliznd clauza Static (vezi definirea procedurilor), caz n care toate variabilele sunt statice. ReDim este utilizat la nivel de procedur pentru realocarea memoriei variabilelor tablou dinamice. Utilizarea clauzei Preserve permite doar modificarea ultimei dimensiuni i pstreaz valorile 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

  • Proceduri Printr-o procedur se nelege, similar altor limbaje de programare, o mulime de instruciuni care este identificat printr-un nume i care se execut unitar printr-un singur apel. Ar trebui, pentru claritatea programului, ca o procedur s efectueze o prelucrare unitar identificabil n logica programului. Exist trei tipuri principale de proceduri: Sub, Function i Property. Ultimul tip este caracteristic definirii unui obiect i va fi prezentat ulterior. O procedur de tip Sub poate primi i transmite informaii prin intermediul unor variabile publice sau/i a unor parametri. Numele procedurii nu are ataat nici o valoare. O procedur de tip Function se deosebete prin aceea c numele procedurii are ataat o valoare (valoarea funciei) i poate fi utilizat ca orice alt variabil din proiect. Observaie. Orice instruciune executabil trebuie s aparin unei proceduri. Declaraiile pot s apar i n afara procedurilor, la nivel de modul.

    Proceduri Sub Organizarea general a unei proceduri de tip Sub este [Private | Public] [Static] Sub name ([arglist]) [instruciuni] [Exit Sub] [instruciuni] End Sub Public, Private, Static determin vizibilitatea procedurii. Public = vizibil pentru toate procedurile i toate modulele (n funcie de Option Private se definete vizibilitatea pentru alte proiecte). Private = vizibil doar pentru procedurile din modulul unde procedura este declarat. Static = arat c toate variabilele locale i pstreaz valorile ntre apeluri. name numele procedurii. arglist lista de argumente, separate prin virgule. Prin instruciunea Exit Sub se poate iei din procedur i altminteri dect prin linia final. Argumentele se definesc dup sintaxa: [Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue] Optional arat c parametrul nu este obligatoriu. Parametrii opionali trebuie s fie grupai la sfritul listei (apariia clauzei Optional cere ca toi parametrii care urmeaz s aib aceeai clauz). ByVal arat c apelul paramatrului se face prin valoare (orice modificare a valorii transmise nu este regsit dup prsirea procedurii, calculele efectundu-se pe o copie a parametrului). ByRef arat c apelul paramatrului se face prin referin (orice modificare a valorii transmise este regsit dup prsirea procedurii). Acesta este modul implicit de transmitere a parametrilor. ParamArray folosit doar ca ultim argument n list, denot un tablou Optional de elemente de tip Variant. Clauza ParamArray permite definirea unui numr arbitrar de parametri. ParamArray nu poate fi utilizat mpreun cu ByVal, ByRef, sau Optional. varname numele argumentului. Dac este 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 (fr Optional) poate fi i un tip definit sau de obiect. defaultvalue definete valoarea implicit pentru argumentele opionale. Poate fi orice expresie, dar pentru tipul Object se admite doar Nothing.

    Apelul unei proceduri Sub Pentru a executa o procedur de tip Sub din alt procedur (vezi i discuia privind vizibilitatea) se menioneaz, pe o linie separat, numele procedurii urmat sau nu de parametri. Dac este necesar, datorit apelrii unui alt proiect sau modul, atunci apelul este dup modelul: Nume_proiect.Nume_modul.Nume_procedur list de argumente

  • unde lista de argumente poate sau nu s fie inclus ntre paranteze. Argumentele efective sunt separate n list prin virgule i trebuie s respecte ordinea (i tipul) argumentelor din definiia procedurii. n cazul procedurilor cu multe argumente, dintre care multe opionale, transferul poate provoca erori de scriere a codului (un argument opional necesit totui virgula sa, de unde o numrare atent a virgulelor etc.). Pentru asemenea situaii (n special) se permite i transferul valorilor prin intermediul tehnicii de argumente denumite. Aceasta se realizeaz alctuind lista de argumente, la apelul procedurii, din intrri de forma nume_argument:=valoare_argument separate prin virgule i la care nu mai conteaz ordinea iniial a argumentelor. Se vor specifica doar parametrii care se transmit efectiv (adic valorile opionale dorite i toate valorile neopionale). Pentru apelul unei proceduri se va studia i instruciunea Call.

    Proceduri Function O procedur de tip Function este similar, ca definiie, unei proceduri Sub, dar are particularitatea c returneaz o valoare prin numele su (care se comport deci ca o variabil). [Public | Private] [Static] Function name [(arglist)] [As type] [statements] [name = expression] [Exit Function] [statements] [name = expression] End Function Este de remarcat c se poate ataa un tip numelui funciei (adic valorii funciei) i se va remarca existena instruciunilor prin care se atribuie funciei valorile calculate. Valoarea returnat de o funcie poate fi utilizat ntr-o alt expresie prin includerea numelui funciei urmat, ntre paranteze, de valorile efective ale parametrilor. Dac apelul se face prin intermediul instruciunii Call, valoarea funciei nu poate fi utilizat. n asemenea situaii se activeaz de fapt doar prelucrrile colaterale (care, pentru claritatea codului, nici nu sunt recomandate). Exemple de proceduri Public 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 genul CostTotalPiesa = AriaCilindru (r1, h1) * CostUnitar

    n timp ce apelul subrutinei poate fi AriaCilindru inaltime:=h1, raza:=r1, cilAria:=AriePiesa

  • Organizarea general a unui proiect VBA Obiectele i prelucrrile necesare realizrii unei aplicaii VBA (presupunnd c se dorete atingerea unui ansamblu coerent de scopuri) sunt gestionate sub forma unui proiect, care are un nume implicit sau dat de utilizator. La un anumit 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 dat cu documentele pe care le nsoesc. Acest fapt nu reduce aria de probleme abordabile ntruct prelucrrile propriu-zise nu sunt limitate la documentul nsoit (se poate deschide astfel un document Word alb i s se efectueze orice prelucrare dorit, fr a 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. Exist de asemenea i module 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 proiectat de utilizator ca i codul program necesar controlrii dialogurilor.

    Referine. ntr-un proiect este meninut lista altor proiecte, care sunt referite n proiectul curent. Un modul de cod poate ncepe cu o seciune de declaraii. Prin declaraii nelegem instruciuni neexecutabile prin care se definesc constante, variabile i proceduri externe. Utiliznd Public, Static, Private se precizeaz i domeniul de 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 proceduri Domeniul unei entiti reprezint mulimea instruciunilor unde poate fi referit acea entitate. Se poate vorbi astfel de vizibilitatea unei entiti. Domeniul este dependent de locul definirii entitii, de clauzele care apar la definire i de parametrii globali ai proiectului.

    Not. Este de remarcat c utilizarea unei denumiri n afara domeniului iniial prefigurat produce, n lipsa instruciunii Option Explicit, crearea unei noi entiti, fr nici o legtur cu cea precedent, surs de erori greu detectabile. Acesta este motivul pentru care se recomand declararea explicit a tuturor variabilelor.

    Exist trei tipuri de domenii:

    la nivel de procedur;

    la nivel de modul, privat;

    la nivel de modul, public.

    Nivelul procedur O variabil sau constant definit ntr-o procedur este vizibil doar n procedur respectiv. Dac o asemenea entitate trebuie referit i n alte proceduri, atunci declararea ei se va efectua la nivel de modul, sau se va transmite procedurii prin intermediul argumentelor.

    Nivel de modul, privat Variabilele i constantele definite la nivel de modul (n seciunea Declarations) sunt Private n mod implicit, adic sunt vizibile doar n modulul respectiv. Utilizarea clauzei Private nu este deci necesar, dar este recomandat. Not. Dac se utilizeaz instruciunea Option Private Module (n seciunea Declarations a modulului) atunci variabilele i procedurile publice vor fi vizibile doar n proiectul curent. n lipsa acestei declaraii, procedurile publice (din toate modulele standard sau clas) sunt vizibile n toate proiectele care se refer la proiectul curent. Procedurile, variabilele i constantele publice din alte module (cum ar fi modulele ataate formelor) sunt Private pentru proiectul de definiie, deci ele nu sunt accesibile proiectelor care se refer la proiectul unde sunt declarate.

  • Nivel de modul, public Variabilele declarate la nivel de modul drept Public sunt vizibile n toate procedurile din proiect. Procedurile sunt publice n mod implicit, cu excepie procedurilor de tratare a evenimentelor, care sunt Private n mod implicit. A se vedea i nota anterioar.

    Viata unei variabile Prin viaa unei variabile se nelege timpul ct variabila are o valoare. Este evident c valoarea unei variabile se poate modifica pe durata vieii sale, dar definitoriu este faptul c variabila are o anumit valoare pe ntreaga durat a vieii sale. La prsirea domeniului, variabila "moare" i nu mai are ataat o valoare. La nceputul execuiei unei proceduri, toate variabilele sunt iniializate:

    Variabil numeric 0 (zero)

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

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

    Variabil Variant Empty

    Variabile de tip utilizator fiecare element este iniializat separat, potrivit tipului primar

    Variabil Object Nothing (pn la asignarea unei referine prin Set)

    Variabilele care nu sunt modificate i pstreaz valoarea iniial. Variabilele declarate prin Dim la nivel de procedur au valoare pn la terminarea execuiei procedurii (chiar dac se trece prin apel n alte proceduri). Variabilele declarate prin Static, la nivel de procedur, au aceeai via ca i variabilele declarate la nivel de modul i i pstreaz valoarea pn la terminarea execuiei codului (inclusiv de la un apel la altul). Includerea clauzei Static n instruciunea Sub sau Function are ca efect declararea tuturor variabilelor definite n procedura respectiv drept variabile statice (deci care i pstreaz valorile ntre apeluri). Variabilele declarate la nivel de modul standard i pstreaz valoarea pe tot timpul execuiei. Variabilele declarate la nivel de modul clas i pstreaz valoarea att timp ct exist o instan a clasei. Diferena fa de variabilele Static este aceea c memoria este utilizat permanent (nu se elibereaz la prsirea domeniului). Variabile Object Declararea unei variabile de tip obiect se poate efectua prin declararea tipului generic Object Dim myDoc As Object

    sau specificnd exact numele de clas dintr-o bibliotec de 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 poate verifica utilizarea corect a propriettilor i metodelor obiectului i nu se poate lega aceast informaie de variabila obiect definit. Ataarea unui obiect este, n acest caz, o legare trzie (late binding) la momentul execuiei i se efectueaz prin instruciunea Set. Specificarea unei clase la definirea variabilei obiect produce o legare timpurie (early binding) care este mai rapid, se face la momentul compilrii i poate nltura mai rapid erori posibile n utilizarea metodelor i proprietilor obiectului. Instruciunea Set are sintaxa: Set objectvar = {[New] objectexpression | Nothing} unde

  • objectvar este numele variabilei (sau proprietii) New permite crearea unei noi instane a clasei

    Objectexpression este o expresie constnd n numele unui obiect, alt variabil declarat de acelai tip obiect, sau funcie ori metod care returneaz un 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 utilizeaz Set pentru a asigna o referin de obiect la o variabil, nu se creeaz o copie a obiectului pentru acea variabil. Este creat doar o referin la obiect. Astfel, mai multe variabile de tip obiect pot s se refere la acelai obiect: orice schimbare a obiectului se va reflecta n toate variabilele care refer obiectul. Utiliznd clauza New se va crea efectiv o copie (instan) a obiectului.

    Exemple Prin urmtoarele dou instruciuni se definete variabila objWord care este legat trziu 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 c instruciunea Set apeleaz o funcie care creeaz i returneaz o referin la un obiect ActiveX.

    Constante predefinite (builtin) Bibliotecile de obiecte din fiecare aplicaie Office furnizeaz o mulime de constante predefinite, care pot fi utilizate pentru a stabili proprietti sau pentru a transmite argumente ctre proprieti sau metode. Constantele sunt, de regul, grupate n tipuri enumerate care reprezint valorile posibile pentru o proprietate specific. Dei este posibil s se utilizeze valoarea numeric a constantei este recomandat s se utilizeze constanta numit ntruct dezvoltri ulterioare ale mediului Microsoft Office (ca i ale aplicaiilor din Visual Studio) tind s pstreze compatibilitatea 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 s afieze toate mesajele de alert la execuia unei proceduri. Codul scris astfel este i mai explicit.

    Instruciunile VBA Exist trei categorii de instruciuni Visual Basic:

    instruciuni de declarare (prezentate la declararea variabilelor) prin care se denumesc i se declar tipul pentru variabile, constante i proceduri;

    instruciuni de atribuire (prezentate n continuare) prin care se atribuie valori variabilelor sau constantelor; instruciuni executabile (prezentate n continuare) care iniiaz aciuni: execut metode sau proceduri, controleaz fluxul execuiei codului.

    n mediul de dezvoltare VBA, sintaxa instruciunilor este verificat automat dup ce se trece la instruciunea urmtoare (prin Enter).

    Continuarea instruciunilor O instruciune poate s fie scris pe mai multe linii prin utilizarea caracterului de continuare a liniei "_" precedat de un 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 lng continuarea liniilor se va remarca utilizarea argumentelor numite la apelul metodei de adugare a unui nou tabel la colecia de tabele a documentului.

  • Dou instruciuni pot fi scrise pe o aceeai linie dac sunt separate cu caracterul ":". Etichetarea liniilor

    O linie poate fi identificat:

    printr-o etichet: orice nume, care respect regulile generale, care ncepe n prima coloan a liniei i se termin cu caracterul ":"

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

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

    Comentarii Textele explicative (necesare documentrii codului) pot fi introduse pe linii separate sau n continuarea liniei de cod. O linie de comentariu ncepe cu un apostrof (') sau cu cuvntul Rem urmat de un spaiu. Comentariul de pe aceeai linie cu o instruciune se introduce printr-un apostrof urmat de comentariu.

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

    Operatori aritmetici Operator Semnificaie Observaii

    ^ Ridicarea la putere

    rezultatul este Double sau Variant(Double) cu excepia: dac un operand 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. Dac o expresie este Null, rezultatul este Null. O expresie Empty este considerat ca 0. Pentru excepii se va studia Help *(operator).

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

    \ mprirea ntreag

    nainte de mprire, operanzii sunt rotunjii la Byte, Integer sau Long. Rezultatul este Byte, Variant(Byte), Integer, Variant (Integer), Long, sau Variant(Long). Dac o expresie este Null, rezultatul este Null. O expresie Empty este considerat ca 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). Dac o expresie este Null, rezultatul este Null. O expresie Empty este considerat ca 0.

    + Adunarea numeric sau concatenarea irurilor

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

  • +(operator).

    - Scderea sau inversarea semnului

    operanzii pot fi doar numerici. Rezultatul este de tipul cel "mai precis" al operanzilor, ordinea de "precizie" fiind pentru adunare i scdere: Byte, Integer, Long, Single, Double, Currency i Decimal. Dac o expresie este Null, rezultatul este Null. O expresie Empty este considerat ca 0. Pentru excepii se va studia Help -(operator).

    Operatori de comparare Relaiile care exist ntre diferite tipuri de entiti se pot evidenia prin comparaii avnd una dintre formele urmtoare:

    result = expression1 comparisonoperator expression2 result = object1 Is object2 result = string Like pattern unde result este o variabil numeric expression este o expresie oarecare comparisonoperator este un operator relaional object este un nume de obiect string este o expresie ir oarecare pattern este 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 (dac este adevrat relaia), False (dac relaia este neadevrat), Null (dac cel puin un operand este Null). Operatorul Is produce True dac variabilele se refer la acelai obiect i False n caz contrar. Operatorul Like compar dou iruri cu observaia c al doilea tremen este un ablon. Prin urmare rezultatul este True dac primul ir operand este format dup ablon, 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, determinat n Windows de codul de pagin.

    Option Compare Text, compararea este insenzitiv la capitalizarea textului, ordinea este determinat de setrile locale ale sistemului.

    Construcia ablonului poate cuprinde caractere wildcard, liste de caractere, domenii de caractere: ? un caracter oarecare * oricte caractere (chiar nici unul) # o cifr oarecare (09). [charlist] oricare dintre caracterele enumerate n list, un domeniu de litere poate fi dat prin utilizarea cratimei. [!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 tip list: [[], [?] etc. Paranteza dreapta va fi indicat singur: ]. Pentru alte observaii utile se va studia Help Like operator.

  • Operatori de concatenare Pentru combinarea irurilor de caractere se pot utiliza operatorii & i +. n sintaxa expression1 & expression2 unde operanzii sunt expresii oarecare, rezultatul este

    de tip String, dac ambii operanzi sunt String

    de tip Variant(String) n celelalte cazuri Null, dac ambii operanzi sunt Null.

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

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

    Operator Semnificaie Observaii

    And conjuncia logic Null cu False d False, Null cu True sau cu Null d Null. Operatorul And realizeaz i operaia de conjuncie bit cu bit pentru expresii numerice.

    Eqv echivalena logic Dac o expresie este Null, rezultatul este Null. Eqv realizeaz i compararea bit cu bit a dou expresii numerice, poziionnd cifrele binare ale rezultatului dup regulile de calcul ale echivalenei logice: 0 Eqv 0 este 1 etc.

    Imp implicaia logic True Imp Null este Null, False Imp * este True, Null Imp True este True, Null Imp False (sau Null) este Null. Operatorul Imp realizeaz i compararea bit cu bit a dou expresii numerice, poziionnd cifrele binare ale rezultatului dup regulile de calcul ale implicaiei logice: 1 Imp 0 este 0, n rest rezultatul este 1.

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

    Or disjuncia logic Null Or True este True, Null cu False (sau Null) este Null. Operatorul Or realizeaz i o comparaie bit cu bit a dou expresii numerice poziionnd biii corespunztori ai rezultatului dup regulile lui Or logic.

    Xor disjuncia exclusiv

    Dac un operand este Null, atunci rezultatul este Null. Se poate efectua operaia de sau exclusiv i bit cu bit pentru dou expresii numerice [b1+b2(mod 2)].

    Instruciuni de atribuire Atribuirea se poate efectua prin instruciunea Let (pentru valori atribuite variabilelor i proprietilor), Set (pentru atribuirea de obiecte la o variabil de tip obiect), Lset i Rset (pentru atribuiri speciale de iruri sau tipuri definite de utilizator).

  • Instruciunea Let Atribuie valoarea unei expresii la o variabil sau proprietate. [Let] varname = expression unde varname este nume de variabil sau de proprietate. Este de remarcat forma posibil (i de fapt general utilizat) fr cuvntul Let. Observaii. Valoarea expresiei trebuie s fie compatibil ca tip cu variabila (sau proprietatea): valori numerice nu pot fi atribuite variabilelor de tip String i nici reciproc. Variabilele Variant pot primi valori numerice sau String, reciproc nu este valabil dect dac valoarea expresiei Variant poate fi interpretat compatibil cu tipul variabilei: orice Variant poate fi atribuit unei variabile de tip String (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 efectuat doar dac ambii termeni au acelai tip definit. Pentru alte situaii se va utiliza instruciunea Lset. Nu se poate utiliza Let (cu sau fr cuvntul Let) pentru legarea de obiecte la variabile obiect. Se va utiliza n aceast situaie instruciunea Set.

    Instruciunea LSet Copie, cu aliniere la stnga, un ir de caractere (valoarea expresiei din dreapta) ntr-o variabila de tip String. Deoarece copierea este binar, poate fi utilizat pentru atribuiri ntre tipuri utilizator diferite (rezultatul este impredictibil deoarece nu se face nici o verificare de tipuri/componente ale valorilor de tip record). Sintaxa este LSet stringvar = string LSet varname1 = varname2 unde stringvar, string reprezint variabila de tip String i expresia de acelai tip implicate ntr-o atribuire de iruri. varname1, varname2 sunt denumiri de variabile, de tipuri definite de utilizator (vezi instruciunea Type) diferite. Zona de memorie alocat celei de a doua variabile este copiat (aliniat la stnga) n zona de memorie a primei variabile. Caracterele care rmn neocupate se completeaz cu spaii, iar dac zona 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 variabil sunt completate ccu spaii. Instruciunea RSet nu se poate utiliza (analog lui LSet) pentru tipuri definite de utilizator. Instruciuni executabile Execuia unui program are loc, n lipsa oricrui control, instruciune cu instruciune, de la stnga la dreapta i de sus n jos. Acest sens poate fi modificat, ntr-o oarecare msur, prin ordinea de preceden a operaiilor n evaluarea expresiilor. Este evident c o asemenea structur simpl nu poate cuprinde toate aspectele programrii i din acest motiv necesitatea structurilor de control a fluxului execuiei. Unele instruciuni au fost pstrate doar din motive de compatibilitate cu versiunile iniiale ale limbajului, n locul lor fiind preferate structuri mai evoluate sau similare altor limbaje de programare.

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

    Aceast categorie cuprinde instruciunile prin care controlul execuiei este transferat la o alt instruciune din procedur. n general, utilizarea acestor comenzi nu produce programe foarte structurate (n sensul programrii structurate) i prin urmare, pentru o mai mare claritate a codului, pot fi nlocuite cu alte structuri de programare.

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

    GoSub line ...

    line ...

    Return unde line este o etichet de linie sau un numr de linie din aceeai procedur. Pot exista mai multe instruciuni Return, prima executat produce saltul la instruciunea care urmeaz celei mai recente instruciuni GoSub executate.

    GoTo Realizeaz tranferul controlului execuiei la o linie din aceeai procedur.

    GoTo line unde line este o etichet de linie sau un numr de linie din aceeai procedur.

    On Error Permite controlul erorilor prin transferul controlului la rutine de tratare. Observaie. Este prezentat n seciunea dedicat controlului erorilor.

    OnGoSub, OnGoTo Permit o ramificare multipl, dup valoarea unei expresii. Se recomand, pentru claritatea codului, utilizarea structurii Select Case n locul acestor structuri. On expression GoSub destinationlist On expression GoTo destinationlist unde expression este o expresie numeric avnd valoare ntreag (dup o eventual rotunjire) ntre 0 i 255 inclusiv. destinationlist este o list de etichete de linii sau numere de linii, separate prin virgule (elementele pot fi de ambele categorii), din aceeai procedur cu instruciunea. Dac valoarea expresiei este negativ sau mai mare dect 255 se produce o eroare. Dac valoarea expresiei, fie ea k, este n domeniul rangurilor listei, atunci se transfer controlul la linia identificat de al k-lea element al listei. Dac valoarea expresiei este 0 sau mai mare dect numrul de elemente din list, transferul se efectueaz la linia care urmeaz instruciunea 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. DoEvents

    Dei nu este o instruciune VBA ci este o funcie, includerea ei este natural prin aceea c permite cedarea controlului ctre sistemul de operare, care poate astfel s funcioneze n regim de multitasking. Aciunea poate fi realizat i prin alte tehnici (de exemplu utilizarea unui Timer etc.). Sintaxa este

    DoEvents( ) Funcia returneaz, n general, valoarea 0. Controlul este redat programului dup ce sistemul de operare a terminat procesarea evenimentelor din coada de evenimente, ca i procesarea tuturor caracterelor din coada SendKeys. Observaie. Pentru alte observaii se va studia documentaia comenzii DoEvents.

  • End Termin execuia unei proceduri (sub forma prezentat aici) sau indic sfritul 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 aceast instruciune, care poate fi plasat oriunde n program, execuia este terminat imediat, fr a se mai executa 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 clas sunt distruse, iar referinele din alte aplicaii la asemenea obiecte sunt invalidate. Memoria este eliberat.

    Exit Prin instruciunea Exit, sub una din multiplele ei forme, se ntrerupe o ramur de execuie (cum ar fi o procedur, o structur iterativ etc.) 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 confundat cu instruciunea End.

    Stop Efectul instruciunii este dependent de modul de execuiei a programului. Dac se execut varianta compilat a programului (fiierul .exe) atunci instruciunea este similar instruciunii End (suspend execuia i nchide fiierele deschise). Dac execuia este din mediul VBA, atunci se suspend execuia programului, dar nu se nchid fiierele deschise i nu se terge valoarea variabilelor. Execuia poate fi reluat din punctul de suspendare. Stop Instruciunea este similar introducerii 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 aceast seciune se poate repeta, n mod controlat, un grup de instruciuni. n cazul unui numr nedefinit de repetiii, condiia de oprire poate fi testat la nceputul sau la sfritul unui ciclu, prin alegerea structurii adecvate.

    DoLoop Se vor utiliza structuri DoLoop pentru a executa un grup de instruciuni de un numr de ori nedefinit aprioric. Dac se cunoate numrul de cicluri, se va utiliza structura ForNext. nainte de continuare se va testa o condiie (despre care se presupune c poate fi modificat n instruciunile executate). Diferitele variante posibile pentru DoLoop difer dup momentul evalurii condiiei i decizia luat. Do [{While | Until} condition]

    [statements] [Exit Do] [statements]

    Loop sau

    Do [statements] [Exit Do]

  • [statements] Loop [{While | Until} condition] unde condition este o expresie care valoare de adevr True sau False. O condiie care este Null se consider False. statements sunt instruciounile care se repet atta timp (while) sau pn cnd (until) condiia devine True. Dac decizia este de a nu continua ciclarea, atunci se va executa prima instruciune care urmeaz ntregii structuri (deci de dup linia care ncepe cu Loop). Se poate abandona ciclarea oriunde n corpul structurii prin utilizarea comenzii Exit Do (cu aceast sintax). Dac apare o comand Exit Do se poate omite chiar i condiia din enun ntruct execuia se va termina prin aceast decizie. Structurile Do pot fi inserate (dar complet) unele n altele. O terminare (prin orice metod) a unei bucle transfer controlul la nivelul Do imediat superior. Execuia structurilor este explicat n tabelul urmtor

    Do WhileLoop Testeaz condiia la nceputul buclei, execut bucla numai dac rezultatul este True i continu astfel pn cnd o nou evaluare produce False.

    Do UntilLoop Testeaz condiia la nceputul buclei, execut bucla numai dac rezultatul este False i continu astfel pn cnd o nou evaluare produce True.

    DoLoop While Se execut ntotdeauna bucla o dat, se testeaz condiia la sfritul buclei i se repet bucla att timp ct condiia este True. Oprirea este pe condiie fals.

    DoLoop Until Se execut ntotdeauna bucla o dat, se testeaz condiia la sfritul buclei i se repet bucla att timp ct condiia este False. Oprirea este pe condiie adevrat.

    ForNext Atunci cnd se cunoate numrul de repetri ale unui bloc de instruciuni, se va folosi structura ForNext. Structura utilizeaz o variabil contor, a crei valoare se modific la fiecare ciclu, oprirea fiind atunci cnd se atinge o valoare specificat. Sintaxa este: For counter = start To end [Step step]

    [statements] [Exit For] [statements]

    Next [counter] unde counter este variabila contor (numr repetrile), de tip numeric. Nu poate fi de tip Boolean sau element de tablou. start este valoarea iniial a contorului. end este valoarea final a contorului. step este cantitatea care se adun la contor la fiecare pas. n cazul n care nu se specific este implicit 1. Poate fi i negativ. statements sunt instruciunile care se repet. Dac nu se specific, atunci singura aciune este cea de modificare a contorului de un numr specificat de ori.

  • Aciunea este dictat de pasul de incrementare i relaia dintre valoarea iniial i cea final. Instruciunile din corpul structurii se execut dac

    counter = 0 sau

    counter >= end pentru step < 0.

    Dup ce toate instruciunile s-au executat, valoarea step este adugat la valoarea contorului i instruciunile se execut din nou dup acelai test ca i prima dat, sau bucla ForNext este terminat i se execut prima instruciune de dup linia Next. Specificarea numelui contorului n linia Next poate clarifica textul surs, mai ales n cazul cnd exist structuri ForNext mbricate. Corpul unei bucle ForNext poate include (complet) o alt structur ForNext. n asemenea situaii, structurile mbricate trebuie s aib variabile contor diferite. Instruciunile Exit For pot fi plasate oriunde n corpul unei bucle i provoac abandonarea ciclrii. Controlul execuiei se transfer la prima instruciune de dup linia Next.

    For EachNext Similar structurii ForNext, structura For EachNext repet un grup de instruciuni pentru fiecare element dintr-o colecie de obiecte sau dintr-un tablou (cu excepia celor de un tip utilizator). Este util atunci cnd nu se cunoate numrul de elemente sau dac se modific, n timpul execuiei, coninutul coleciei. Sintaxa este: For Each element In group

    [statements] [Exit For] [statements]

    Next [element] unde

    element este variabila utilizat pentru parcurgerea elementelor. Dac se parcurge o colecie de obiecte, atunci element poate fi Variant, o variabil generic de tip Object, sau o variabil obiect specific pentru biblioteca de obiecte referit. Pentru parcurgerea unui tablou, element poate fi doar o variabil de tip Variant. group este numele coleciei de obiecte sau al tabloului. statements este grupul de istruciuni executate pentru fiecare element.

    Execuia unei structuri For EachNext este

    1. Se definete element ca numind primul element din grup (dac nu exist nici un element, se transfer controlul la prima instruciune de dup Next se prsete bucla fr executarea instruciunilor).

    Se execut instruciunile din corpul buclei For.

    Se testeaz dac element este ultimul element din grup. Dac rspunsul este afirmatif, se prsete bucla.

    2. Se definete element ca numind urmtorul element din grup.

    Se repet paii 2 pn la 4.

    Instruciunile Exit For sunt explicate la ForNext. Buclele ForEach...Next pot fi mbricate cu condiia ca elementele utilizate la iterare s fie diferite. Observaie. Pentru tergerea tuturor obiectelor dintr-o colecie se va utiliza ForNext i nu For EachNext. Se va utiliza ca numr de obiecte colecie.Count.

    WhileWend Execut un grup de instruciuni att timp ct este adevrat o condiie. Sintaxa

  • While condition [statements]

    Wend Este recomandat s se utilizeze o structur DoLoop n locul acestei structuri.

    With Programarea orientat pe obiecte produce, datorit calificrilor succesive, construcii foarte complexe atunci cnd se 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 simplificat prin utilizarea structurii WithEnd With. O asemenea structur execut o serie de instruciuni pentru un obiect sau pentru o variabil de tip utilizator. Sintaxa este: With object

    [statements] End With unde object este numele unui obiect sau a unui tip definit de utilizator statements sunt instruciunile care se execut pentru entitatea precizat. Permind omiterea recalificrilor din referinele la obiectul precizat, orice construcie de tipul ".nume" este interpretat n 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 calificrile eventuale la acest obiect vor fi efectuate. Nu se recomand saltul n i dintr-un bloc With.

    Structuri de decizie (IfThenElse, Select Case) Ramificarea firului execuiei dup rezultatul verificrii unei condiii este o necesitate frecvent n orice implementare. Pe lng structurile prezentate, se pot utiliza trei funcii care realizeaz alegeri n mod liniarizat (pe o linie de cod): Choose(), Iif(), Switch().

    IfThenElse O asemenea structur, ntlnit de altfel n toate limbajele de programare, execut un grup de instruciuni ca rspuns la ndeplinirea unei condiii (compus sau nu din mai multe condiii testate secvenial). Sintaxa permite o mare varietate de forme: If condition Then [statements] [Else elsestatements] sau

    If condition Then [statements]

    [ElseIf condition-n Then [elseifstatements] ...

    [Else [elsestatements]]

    End If unde condition are una din formele: expresie numeric sau ir care se poate evalua True sau False (Null este interpretat False); expresie de forma TypeOf objectname Is objecttype, evaluat True dac objectname este de tipul obiect specificat n objecttype.

  • statements, elsestatements, elseifstatements sunt blocurile de instruciuni executate atunci cnd condiiile corespunztoare sunt True. La utilizarea primei forme, fr clauza Else, este posibil s se scrie mai multe instruciuni, separate de ":", pe aceeai linie. Verificarea condiiilor implic evaluarea tuturor subexpresiilor, chiar dac prin jocul operanzilor i operatorilor rezultatul 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 structur IfThenElseIf) atunci cnd se compar aceeai expresie cu mai multe valori, diferite ntre ele. Instruciunea Select 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 Case testexpression [Case expressionlist-n [statements-n]] ... [Case Else [elsestatements]] End Select unde testexpression este o expresie numeric sau ir. expressionlist-n este lista, separat prin virgule, a uneia sau mai multe expresii de forma:

    expression.

    expression To expression. Cuvntul To introduce un interval de valori, valoarea minim fiind prima specificat.

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

    statements-n reprezint una sau mai multe instruciuni care se vor executa dac testexpression este egal cu un element din expressionlist-n. elsestatements reprezint una sau mai multe instruciuni care se vor executa dac testexpression nu este egal cu nici un element din listele liniilor Case. Dac testexpression se potrivete cu un element dintr-o list Case, se vor executa instruciunile care urmeaz aceast clauz Case pn la urmtoarea clauz Case, sau pn la End Select. Control execuiei trece apoi la instruciunea care urmeaz liniei finale End Select. Rezult c dac testexpression se regsete n mai multe liste, doar prima potrivire este considerat. Clauza Case Else are semnificaia uzual "altfel, n rest, n caz contrar etc.", adic introduce instruciunile care se execut atunci cnd expresia de test nu se potrivete nici unui element din listele clauzelor Else. Dac aceasta este situaia i nu este specificat o clauz Case Else, atunci execuia urmeaz cu prima instruciune de dup End Select. Instruciunile Select Case pot fi scufundate unele n altele, structurile interioare fiind complete (fiecare structur are End Select propriu, includerea este complet). Apeluri de proceduri i programe n aceast seciune se prezint doar funcia Shell(), deoarece despre proceduri i apelul lor s-a discutat n capitolul 1.

    Funcia Shell() Execut un program executabil i returneaz un Variant(Double) reprezentnd ID-ul de task al programului n caz de succes; n caz contrar returneaz zero. Sintaxa este Shell(pathname[,windowstyle]) unde

  • pathname este Variant (String). Conine numele programului care se execut, argumentele necesare i poate da calea complet (dac este nevoie). windowstyle este Variant (Integer) i precizeaz stilul 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 ascuns iar focus-ul este pe fereastra ascuns.

    VbNormalFocus 1 Fereastra are focus-ul i este dimensionat i poziionat normal.

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

    VbMaximizedFocus 3 Fereastr maximizat, cu focus.

    VbNormalNoFocus 4 Fereastra este normal (restaurat la mrimea i poziia cea mai recent) dar nu are focus-ul. Fereastra activ curent i pstreaz focus-ul.

    VbMinimizedNoFocus 6 Fereastr minimizat, fr focus. Fereastra activ curent i pstreaz focus-ul.

    Dac funcia Shell nu poate porni programul specificat se va semnala eroare. Programul pornit prin Shell se execut asincron, deci nu exist certitudinea c acest program se termin nainte de execuia instruciunilor care urmeaz liniei Shell.

    Operaiuni de intrare-ieire n 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 realizeaz prin intermediul unor instruciuni dedicate acestor operaii.

    Dialogul standard cu utilizatorul n general, utilizatorul rspunde la apariia unei boxe de dialog prin acionarea butonului adecvat rspunsului su i/sau prin nscrierea unei informaii ntr-o zon dedicat acestui scop. Informaia nscris este transferat programului ca valoare a funciei care iniiaz dialogul grafic.

    Funcia InputBox Apelul funciei InputBox afieaz o box de dialog care conine un mesaj, dou butoane (OK i Cancel) i o zon text n care se poate tasta un rspuns (de tip String, chiar dac se transmite o valoare numeric). Se ateapt ca utilizatorul s introduc un text n zona rezervat sau s acioneze un buton. Textul introdus este transmis ca valoare a funciei la acionarea butonului OK (sau Enter), iar acionarea butonului Cancel (ca i nchiderea dialogului 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 multe linii prin combinaii de caractere Chr(13) carriage return, Chr(10) linefeed, Chr(13)&Chr(10) CR+LF.

  • title este expresia de tip String cu titlul ferestrei dialogului. Dac este omis se va folosi titlul aplicaiei. default este expresia de tip String, opional, coninnd textul afiat iniial n zona text rezervat utilizatorului. Textul este, n lipsa modificrii lui, retransmis ca rspuns (acionnd butonul OK). xpos este expresia numeric specificnd poziia orizontal a dialogului (n twips, de la latura stnga a ecranului). n lipsa argumentului, boxa de dialog este centrat orizontal. ypos este expresia numeric specificnd poziia vertical a dialogului (n twips, de la latura de sus a ecranului). n lipsa argumentului, boxa de dialog este poziionat la aproximativ o treime de ecran. helpfile este expresia de tip String care identific fiierul Help utilizat.Dac este indicat helpfile, trebuie s fie precizat i context. Textul de ajutor poate fi vzut prin tasta F1, anumite aplicaii afieaz i un buton Help. context Expresie numeric cu numrul de context Help al intrrii corespunztoare dialogului afiat. Apare obligatoriu mpreun cu helpfile. Dac valoarea funciei nu este atribuit (sau utilizat ntr-o alt expresie), este evident c se pierde, fr semnalarea vreunei erori.

    Funcia MsgBox Un dialog mai simplu dect InputBox este realizat prin forma predefinit afiat de funcia MsgBox. Se afieaz un mesaj ntr-o box de dialog i se ateapt ca utilizatorul s acioneze unul dintre butoanele existente (numrul i tipul lor lor este fixat la proiectarea aplicaiei). Funcia returneaz un ntreg indicnd care buton a fost acionat. Sintaxa este [intvariable=]MsgBox(prompt[, buttons] [, title] [, helpfile, context]) unde prompt este textul mesajului (Vezi InputBox) buttons este o expresie numeric egalcu suma valorilor care specific numrul, tipul i atributele butoanelor. Aici se fixeaz i modalitatea ferestrei (Vezi constantele predefinite din tabelul care urmeaz). Valoarea implicit este 0. title,helpfile, context identice cu argumentele similare descrise la InputBox. Constantele recomandate pentru formarea argumentului buttons sunt

    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

  • VbDefaultButton1 0 Primul buton este cel implicit (echivalent cu 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 curent este oprit pn cnd rspunde utilizatorul

    VbSystemModal 4096 System modal: toate aplicaiile sunt oprite pn cnd utilizatorul rspunde la dialog

    Valorile 0-5 descriu butoanele, 16,32,48 i 64 descriu stilul icoanei afiate, 0, 256 i 512 determin butonul implicit, iar ultimul grup (0 i 4096) determin modalitatea boxei de dialog. La formarea argumentului Buttons se va adun doar cte un numr din fiecare grup. Pentru a utiliza valoarea returnat de funcie, aceasta trebuie inclus ntr-o expresie (eventual atribuit unei variabile ntregi). Valorile returnate de funcie i care pot fi testate, n expresii logice, pentru a alege ramura de prelucrare dorit de utilizator 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 echivalent cu acionarea butonului Cancel (dac acesta este prezent). Dac n dialog este prezent butonul Help, acionarea lui nu termin dialogul.

    Utilizarea fiierelor Procesrile tipice programate n VBA prelucreaz informaii din dou mari 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 direct a fiierelor din prima categorie (fr apelul aplicaiei server specifice) poate produce coruperea fiierului, astfel nct nu mai este recunoscut de aplicaia mam. Prelucrarea acestor fiiere trebuie s fie executat n aplicaiile care le-au creat.

  • Pentru lucrul cu un fiier utilizator (n continuare prin fiier se va nelege, fr alte precizri, un fiier utilizator) acesta trebuie mai nti deschis (instruciunea Open), operaiunea producnd i crearea fiierului n cazul unui fiier inexistent (nou). Dup utilizare fiierul trebuie s fie nchis (operaiune efectuat, la terminarea normal a programului, n mod automat). Un fiier are ataat un numr de identificare, unic pentru un proces. Identificare fiierului se poate efectua, n program, prin numele su sau prin numrul ataat. Numrul poate fi n domeniul 1255 pentru fiierele proprii aplicaiei i n domeniul 256511 pentru fiiere accesibile din alte aplicaii. Un numr neutilizat (liber) poate fi furnizat de apelul la funcia FreeFile(). Exist trei moduri de acces la nregistrrile unui fiier, acces definit la deschiderea acestuia.

    acces secvenial (modurile Input, Output i Append), utilizat de regul pentru scrierea fiierelor text (rapoarte, jurnale etc.); acces raandom (aleator) (modul Random), n cazul cnd este necesar s se scrie i s se citeasc nregistrrile ntr-o ordine 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 pn cnd este nchis i deschis n alt mod (dac structura 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 rezum doar la scriere/citire, n tabelul urmtor este un rezumat al principalelor operaiuni pe care le suport fiierele, cu instruciunile care faciliteaz respectiva 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 de citire/scriere

    Seek

    Inchidere Close, Reset

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

  • 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 c rezerv o zon tampon (buffer) pentru fiier i determin modul de acces utilizat. Nu se pot efectua instruciuni de I/O pe un fiier dac acesta nu este deschis n prealabil. Sintaxa: Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength] unde pathname expresie String care specific numele fiierului (poate include ntreaga cale unitate, directoare etc., dup regulile uzuale); mode cuvnt cheie care specific modul de acces la fiier: Append, Binary, Input, Output sau Random; dac nu se specific nimic se va considera acces Random; access clauz opional specificnd operaiunile I/O permise pentru fiier: Read, Write sau Read Write; lock clauz opional specificnd operaiile asupra fiierului permise altor procese care se execut (cnd fiierul este deschis): Shared, Lock Read, Lock Write i Lock Read Write. filenumber numrul de fiier pentru fiierul deschis (ntre 1 i 511, vezi observaia din partea introductiv); funcia FreeFile furnizeaz urmtorul numr disponibil; reclength numr (

  • 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.

    Put Scrie valoarea unei variabile date ntr-un fiier deschis n prealabil. Datele scrise cu Put sunt, n general, citite din fiier cu Get. Put [#]filenumber, [recnumber], varname unde filenumber este numrul fiierului unde se scriu datele (fiierul trebuie s fie deschis); recnumber numr opional n format Variant (Long), reprezint numrul nregistrrii (modul Random) sau numrul octetului (modul Binary) unde ncepe scrierea. Prima poziie este 1. varname numele variabilei a crei valoare se scrie n fiier. Dac nu se specific numrul nregistrrii se va scrie n poziia activ de dup ultima instruciune Get, Put sau Seek. Argumentul lips este 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 transfer n 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 list de variabile, delimitate de virgule, pentru care se citesc valorile din fiier. Nu se pot include nume de tablouri sau variabile Object, dar se accept elemente de tablou i variabiel de tipuri utilizator. Pentru situaiile uzuale (tipuri numerice sau String standarde) asignarea valorilor se efectueaz fr modificri. Pentru alte situaii:

    Informaia citit Valoarea asignat

    Virgul sau 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 Variant considerat drept eroare)

    Ghilimelele duble (" ") sunt ignorate n irul de intrare. Pentru o citire corect, datele din fiier trebuie s apar n aceeai ordine i de acelai tip cu variabilele din list. O variabil numeric primete valoarea 0 dac intrarea corespunztoare nu este numeric. Atingerea sfritului de fiier cnd operaiunea de citire nu este ncheiat, provoac eroare. ntruct utilizarea fiierelor este, n mod uzual, aceea de memorare controlat a unor informaii (i nu aceea de a descifra informaii scrise ntr-o structur necunoscut), se recomand scrierea cu Write # n cazul utilizrii ulterioare a comenzii Input #.

    Funcia Input()

  • Citete i returneaz un ir de caractere citite dintr-un fiier deschis n mod Input sau Binary. Datele citite prin aceast funcie sunt scrise, de regul, prin Print # sau Put. Input(number, [#]filenumber) unde number orice expresie numeric specificnd numrul de caractere care se citesc. filenumber numr de fiier (deschis). Spre deosebire de instruciunea Input #, funcia Input returneaz toate caracterele citite (inclusiv virgule, CR, LF, ghilimele i spaii de nceput). Pentru fiierele deschise pentru acces Binary, ncercarea de a citi prin funcia Input pn cnd EOF returneaz True genereaz eroare (procedeul este valid pentru citirea din fiiere binare cu Get). Se vor utiliza funciile LOF and Loc pentru detectarea sfritului de fiier. Observaie. Pentru date pe octei din fiiere text se va utiliza funcia InputB, cu o sintax similar, unde number specific numrul de octei de returnat (n loc de numrul de caractere). A se vedea i Help Returning Strings from Functions.

    Line Input # Citete o singur linie dintr-un fiier secvenial (deschis) i asigneaz irul obinut unei variabile de tip String. O linie este considerat terminat la ntlnirea caracterului CR (Chr(13)) sau a combinaiei CR+LF (Chr(13)&Chr(10)). Caracterele CR i/sau LF nu sunt adugate irului asignat (se poate considera c secvena lor a fost srit). Line Input #filenumber, varname unde filenumber numrul ataat fiierului (deschis), varname nume de variabil String sau Variant. Datele citite cu Line Input # sunt, de regul, scrise cu Print #.

    Write # Scrie o nregistrare ntr-un fiier secvenial. Datele scrise prin Write # sunt citite, de regul, cu Input #. Utilizarea scrierii cu Write # asigur o delimitare corect a fiecrui cmp scris, ceea ce permite regsirea corect (fr alte artificii) a informaiilor la citirea cu Input #. n acelai timp, informaiile sunt regsite corect indiferent de configurrile locale. Sintaxa este Write #filenumber, [outputlist] unde

    filenumber numrul ataat fiierului (deschis n prealabil), outputlist o list de expresii numerice sau ir, separate prin virgule, spaii sau punct-virgul, ale cror valori se scriu n fiier.

    Specificarea unei virgule dup filenumber fr outputlist produce o linie goala n fiier. Sunt respectate urtmtoarele reguli de scriere:

    datele numerice sunt scrise cu punct ca separator zecimal (indiferent de setrile locale); datel