Ce este un obiect?

Aplicațiile care înglobează VBA activ (și alte aplicații moderne) sunt formate dintr-un număr de obiecte, fiecare din ele având propriile caracteristici și proprietăți.

Beneficiile OOP

Construirea unei aplicații din obiecte se numește programare orientată pe obiecte (OOP). Teoretic, programarea orientată pe obiecte oferă un număr de beneficii programatorilor - de exemplu, codul este mai ușor de construit și menținut (actualizat), deoarece este despărțit în obiecte de o dimensiune gestionabilă.

Programele orientate pe obiecte ar trebui să fie, de asemenea, mai ușor de înțeles decât programele monolit, deoarece este mai puțin dificil pentru majoritatea oamenilor să înțeleagă conceptul de obiecte individuale cu caracteristici și acțiuni asociate decât să-și amintească o listă mult mai lungă de capabilități pentru aplicația în ansamblu.

Stabilirea comenzilor care vor fi folosite pentru a atinge obiectivele de programare poate fi și mai rapid datorită taxonomiei OOP. De exemplu, un tabel în Word este reprezentat de un obiect Table și o coloană este reprezentată de un obiect Column. Obiectul Column are pentru lățime proprietatea Width care își stabilește sau returnează lățimea. Aceste informații sunt mai simplu de gestionat atunci când sunt împărțite în bucăți mici, în loc să se lucreze cu o comandă mai complexă, cum ar fi WordTableSetColumnWidth sau WordTableGetColumnWidth.

Un al treilea beneficiu al programării orientate pe obiecte este că limbajul VBA însuși poate fi extins. Programatorul poate construi obiecte personalizate pentru a implementa funcționalități pe care limbajul în sine nu le conține inițial. De exemplu, VBA se poate folosi pentru a crea obiecte proprii care fac lucruri pe care aplicațiile Office nu le pot face.

O altă utilizare, destul de diferită, pentru OOP este că OOP poate fi de ajutor atunci când un grup de programatori colaborează într-un singur program. Se poate urmări modul de lucru al celorlalți în diferite moduri. La final se va descrie modul în care se utilizează OOP pentru a preveni unele probleme în programarea echipei.

Obiectele pot să conțină alte obiecte. De obicei, obiectele dintr-o aplicație orientată pe obiecte sunt aranjate într-o ierarhie numită modelul obiect al aplicației. Această ierarhie permite să se afle mai ușor unde - într-o mare bibliotecă de obiecte – poate fi găsit un anumit obiect care trebuie folosit în macrocomenzi. Acest lucru este similar cu modul în care este probabil să se găsească o biografie în zona nonfiction a bibliotecii.

Majoritatea aplicațiilor VBA, inclusiv toate aplicațiile mari Office, au un obiect Application care reprezintă aplicația ca un întreg. Obiectul Application însuși are proprietăți și metode pentru lucrurile care se pot aplica aplicației ca un întreg. De exemplu, multe aplicații au metoda Quit care închide aplicația și proprietatea Visible care controlează dacă aplicația este vizibilă sau este ascunsă.

Într-un model de obiect tipic, obiectul Application conține în esență toate celelalte obiecte (și colecții-grupuri-obiecte) care alcătuiesc aplicația. De exemplu, Excel are un obiect Application care reprezintă aplicația Excel, un obiect registru de lucru - Workbook (grupat în colecția Workbooks) care reprezintă un registru de lucru și un obiect foaie de lucru Worksheet (grupat în colecția foi de lucru - Sheets) care reprezintă o foaie de lucru. Obiectul Workbook este conținut în obiectul Application deoarece, în mod normal, este necesar ca aplicația Excel să fie deschisă pentru a lucra cu un registru de lucru Excel.

La fel, obiectul Worksheet este conținut în obiectul Workbook deoarece trebuie ca registrul de lucru Excel să fie deschis pentru a utiliza o foaie de lucru. Mergând mai departe în jos pe modelul obiect, obiectul Worksheet conține alte obiecte, de exemplu obiecte Row care reprezintă rândurile individuale din foaia de lucru, obiecte Column care reprezintă coloanele în foaia de lucru și obiecte interval - Range care reprezintă un interval de celule. Și aceste obiecte, la rândul lor, conțin și alte obiecte.

Pentru a ajunge la un obiect, de obicei se merge prin ierarhia modelului de obiect până se ajunge la obiectul căutat.

Pentru a ajunge la un obiect Range din Excel, de exemplu, se trece de la obiectul Application la obiectul Workbook, apoi de la obiectul Workbook la obiectul Sheet corespunzător și la final la obiectul Range. Următoarea declarație arată cum se poate selecta intervalul A1 din prima foaie de lucru, aflată în primul registru de lucru deschis (mai multe despre acesta mai jos):

Application.Workbooks(1).Sheets(1).Range("A1").Select 

Înțelegerea obiectelor create

Totuși obiectul Application este opțional și, de obicei, este lăsat în afara codului. De ce? Deoarece va trebui să treceți prin obiectul Application pentru a obține aproape orice în aplicație, majoritatea aplicațiilor expun (pun la dispoziție) un număr de obiecte care pot creea. Se poate accesa ceva fără a trebui tastat cuvântul Aplicație în cod. Cuvântul se subînțelege. Acest lucru este similar cu faptul că nu trebuie inclus cuvântul Pământ la adresa destinatarului pe un plic. Există doar o singură posibilitate. Deocamdată.

Aceste obiecte care pot creea sunt, de obicei, cele mai utilizate obiecte pentru aplicație și, trecând prin ele, se poate accesa majoritatea celorlalte obiecte fără a fi nevoie să se facă referire la obiectul Application. De exemplu, Excel expune colecția Workbooks ca pe un obiect creat, astfel încât se poate utiliza următoarea declarație, care nu necesită introducerea cuvântului Application.

Să se compare cu exemplul alternativ câteva paragrafe de mai sus în acest capitol.

Workbooks(1).Sheets(1).Range("A1").Select

Orice obiect poate avea proprietăți și metode. Următoarele secțiuni discută aceste elemente mai detaliat.

Proprietăți

În VBA, o proprietate este un atribut sau o caracteristică a unui obiect. Se poate asocia cu o calitate a unui obiect, cum ar fi culoarea lui. Majoritatea obiectelor au mai multe proprietăți cu ajutorul cărora se specifică fiecare aspect al acelui obiect.

Fiecare proprietate are un tip specific de date pentru informațiile pe care le stochează. De exemplu, obiectele care reprezintă fișiere (cum ar fi documente, registre de lucru sau prezentări) au, de obicei, o proprietate booleană numită Saved, care stochează o valoare care denotă dacă toate modificările obiectului au fost salvate - valoarea True - sau nu - valoarea False). Aceste două valori acoperă întreaga gamă de posibilități pentru starea salvată a obiectului: poate conține modificări nesalvate sau nu conține modificări nesalvate. Nu există o a treia stare. De aceea, poate fi folosit un tip de date boolean deoarece acel tip are doar două valori posibile.

În mod similar, majoritatea obiectelor care reprezintă fișiere au o proprietate Name care conține numele fișierului în cauză. Proprietatea Name conține un tip de date String deoarece trebuie să conțină text. Acest text poate fi despre orice, fiind limitat doar de 255 de caractere (inclusive calea) pe care Windows o permite pentru fișiere și de anumite caractere - de exemplu, două puncte și caracterele (|) - pe care Windows le interzice în numele de fișiere.

Pentru a lucra cu o proprietate, aceasta se obține (preia sau returnează) pentru a afla valoarea curentă a ei sau se setează (modifică) cu valoarea aleasă. Multe proprietăți sunt citite / scrise, ceea ce înseamnă că se pot obține și seta valorile lor, dar unele proprietăți sunt doar pentru citire, ceea ce înseamnă se pot vedea valorile, dar nu se pot schimba.

Proprietatea Saved poate fi citită / scrisă de majoritatea aplicațiilor, deci poate fi modificată. Aceasta înseamnă că se poate spune aplicației că un fișier conține modificări nesalvate, când de fapt nu există sau că nu conține modificări nesalvate atunci când sunt. (Schimbarea proprietății Saved poate fi utilă atunci când manipulați un fișier fără ca utilizatorul să știe acest lucru.) Proprietatea Name a unui obiect de fișier este doar în citire - de obicei numele este ales când se emite comanda Save As după care numele nu se mai poate modifica din cadrul aplicației în timp ce fișierul este deschis. Prin urmare, proprietatea Name se poate obține (citi, returna sau prelua), dar nu se poate modifica. De asemenea, unele proprietăți sunt numai pentru scriere (write-only properties), proprietăți care pot fi setate, dar nu pot fi obținute.

Atunci când un obiect conține un alt obiect sau o colecție, acesta are de obicei o proprietate care se apelează (invocă - invoke) pentru a returna obiectul sau colecția conținută. De exemplu, obiectul Word Document include o proprietate PageSetup care returnează obiectul PageSetup pentru document (obiectul PageSetup conține setări cum ar fi dimensiunea hârtiei, orientarea, numărul de linii pe pagină și marginile documentului) și o proprietate Tables care se apelează pentru a returna colecția Tables. Iată cum se poate apela obiectul PageSetup (care este conținut în obiectul Document):

Sub GetLinesPage()
  Dim sngLinesPerPage As Single
  sngLinesPerPage = ActiveDocument.PageSetup.LinesPage
  MsgBox sngLinesPerPage
End Sub

Fiecare obiect de același tip are același set de proprietăți, dar stochează propriile valori particulare pentru ele. De exemplu, când se execută PowerPoint și sunt trei obiecte Presentation deschise, fiecare are propria proprietate Name. Valoarea din fiecare proprietate Name este specifică fiecărui obiect Presentation. Cu alte cuvinte, valoarea unei proprietăți dintr-un obiect nu are nimic de-a face cu valoarea acelei proprietăți dintr-un alt obiect: Fiecare obiect este independent de celelalte obiecte.

Metode

O metodă este o acțiune pe care o poate efectua un obiect, o capacitate pe care o are un obiect. De exemplu, obiectul Document din diverse aplicații are o metodă de salvare care salvează documentul. Se poate folosi metoda Save la diferite obiecte Document – Documents(1).Save salvează primul obiect Document din colecția Documente și Documents(2). Save salvează cel de-al doilea obiect Document - dar metoda Save face același lucru în fiecare caz. Un obiect poate avea una sau mai multe metode asociate cu acesta. Unele obiecte au câteva zeci de metode pentru a implementa toate funcționalitățile de care au nevoie.

Metoda Save este foarte frecventă. Apare în multe obiecte din aplicații, ca și alte metode, cum ar fi SaveAs (care salvează fișierul cu un alt nume, altă locație sau ambele) și Close (care închide fișierul).

Alte metode sunt unice pentru fiecare aplicație. De exemplu, obiectul Presentation din PowerPoint are o metodă AddBaseline care aplică o linie de bază (fie la prezentarea activă, fie la un fișier de prezentare specificat) care permite urmărirea modificărilor pentru o îmbinare.

Obiectul Document din Word nu are nicio metodă AddBaseline, dar are o metodă AcceptAllRevisions care acceptă toate revizuirile din document. PowerPoint nu are o metodă AcceptAllRevisions.

Așa cum metodele precum Save sunt comune mai multor aplicații, unele metode se găsesc în mai multe obiecte. De exemplu, metoda de ștergere este asociată cu multe obiecte diferite. După cum sugerează și numele, metoda Delete șterge, de obicei, obiectul specificat. Cu toate acestea, alte implementări ale metodei de ștergere se comportă oarecum diferit, în funcție de obiectul cu care lucrează. Prin urmare, înainte de a folosi o anumită metodă, trebuie verificat că va avea efectul scontat atunci când se folosește cu un alt obiect.

Unele metode nu au argumente. Alte metode au unul sau mai multe argumente (pentru a furniza informațiile necesare). La fel ca în funcțiile VBA încorporate, cum ar fi MsgBox, sunt necesare câteva argumente, în timp ce altele sunt opționale.

Când o metodă se aplică la mai multe obiecte, poate avea sintaxă diferită pentru obiecte diferite. Din nou, trebuie verificat exact ce face o metodă cu obiectul pentru care va fi folosită.

Pentru a utiliza o metodă, mai întâi se accesează prin obiectul implicat. De exemplu, pentru a închide obiectul ActivePresentation, care reprezintă prezentarea activă în PowerPoint, se folosește metoda Close (dar trebuie specificat obiectul ActivePresentation, astfel):

ActivePresentation.Close 

Scenariu din lumea reală

Câinele Max: Vizualizarea obiectelor, metodelor și a proprietăților

Dacă sunt dificultăți în a înțelege obiectele cu proprietățile și metodele lor, se poate face o comparație între obiectele virtuale, proprietățile și metodele din VBA și obiectele fizice, proprietățile și acțiunile din lumea reală. Să luăm un exemplu.

Presupunem că avem un câine numit Max - un câine de munte, alb, de 200 de kilograme, de patru ani, de sex masculin, care nu este fix.

Max efectuează toate acțiunile obișnuite ale câinilor - doarme, aleargă, mănâncă, latră, mârâie, roade diverse lucruri și alte acțiuni - dar are și câteva acțiuni neobișnuite (pentru câini) construite, cum ar fi salivatul la comandă, trântește oamenii jos și rupe ziarele.

Dacă Max ar fi fost implementat în VBA, ar fi un obiect Caine din colecția Caini Obiectul Caine pentru Max ar avea proprietăți precum:

Mai departe, Max ar putea avea metode cum ar fi Salivează, Latră, PuneLaPământ, Intimidează, Roade, Aleargă etc. Unele metode cer și argumente. Metoda Salivează are nevoie de argumente, folosind constante specific colecției Dog, care încep cu specificarea Caini:

Caini("Max").Saliveaza PeCe:="GenunchiulMeu", Cum:= Dezgustator

Obiectul Caine poate conține și alte obiecte care reprezintă alte componente ale câinelui - urechi, ochi, limbă, creier, stomac, picioare, coadă etc. Fiecare din aceste obiecte au la rândul lor propriile proprietăți și metodele corespunzătoare. De exemplu, obiectul Coada ar putea avea metoda SeMisca (acțiunea de a da din coadă), care ar putea fi invocată (call) astfel:

Dogs("Max").Coada.SeMisca Directie:=dogSeMiscaPeOrizontala, Frecventa:=200