Automation este cel mai puternic și eficient mod de a comunica între aplicații. Fiecare aplicație care acceptă Automation oferă unul sau mai multe obiecte Component Object Model (COM) pe care le puteți accesa prin program - de obicei, un obiect care reprezintă aplicația, un obiect care reprezintă diferitele tipuri de fișiere pe care le utilizează aplicația, obiecte care reprezintă componentele sale majore, și așa mai departe.
Pentru orice tranzacție Automation, există o aplicație server application care furnizează informații sau instrumente și o aplicație client application care le primește sau le utilizează. (Există, de asemenea, o altă pereche de termeni care fac distincția între două aplicații de comunicare: aplicația server este, de asemenea, uneori cunoscută sub numele de object application, iar aplicația client este cunoscut sub numele de controlling application.)
Automation permite aplicației client să valorifice capacitățile încorporate ale aplicațiilor serverului. De exemplu, Excel are caracteristici de calcul mai bune decât Word și poate genera diagrame utile, hărți de date și așa mai departe pe baza calculelor și datelor sale. Utilizând Automation, Word poate împrumuta motorul de calcul Excel și apoi să introducă rezultatele într-un document Word. Sau, Word ar putea utiliza Excel pentru a crea o diagramă pe care apoi o inserează într-un document. Word poate, de asemenea, să întreprindă acțiuni mai limitate, cum ar fi să determine ca Excel să deschidă un registru de lucru, să copieze un grup de celule dintr-o foaie de calcul din acesta și să le lipească într-un document.
Pentru a utiliza automatizarea prin VBA, creați un obiect în VBA care face referire la aplicația cu care doriți să lucrați. Utilizați funcția CreateObject pentru a crea un obiect nou în altă aplicație și funcția GetObject pentru a regăsi un obiect existent într-o altă aplicație.
Când utilizați Automation, puteți alege dacă să afișați aplicația server sau să o păstrați ascunsă de utilizator. Pentru anumite proceduri, va trebui să o afișați, de exemplu, utilizatorul trebuie să aleagă un fișier sau un folder sau să facă o altă alegere care necesită intervenția directă.
În alte situații, cel mai bine ar fi să păstrați aplicația server ascunsă, astfel încât utilizatorul să nu fie distras de o aplicație care se lansează brusc spontan și robotic, efectuând acțiuni în fața ochilor uimiți ai utilizatorului. Acest lucru poate incomoda unii utilizatori, ca și cum computerul a scăpat de sub control.
Dar chiar dacă vă decideți să ascundeți o aplicație de server de utilizator atunci când procedura se execută, în cele mai multe cazuri, este util pentru să afișați aplicația server în timpul scrierii codului și testării procedurii. Asta vă permite să vedeți ce se întâmplă greșit în cazul în care codul nu funcționează cum era de așteptat.
Înţelegerea Early și Late Binding
Când utilizați Automation pentru a accesa o altă aplicație, aveți posibilitatea să alegeți legătura (binding) pe care o veți utiliza - adică să stabiliți conexiunea dintre aplicația client și aplicația server.
Legarea timpurie (Early binding) implică adăugarea unei referințe la biblioteca de obiecte a aplicației utilizând caseta de dialog References (Tools > References) și apoi declararea unui obiect la începutul codului utilizând o instrucțiune Dim care declară tipul de clasă obiect specific, în locul declarației generice a obiectului ca Object.
De exemplu, următorul cod se conectează la un diapozitiv dintr-o prezentare PowerPoint utilizând legarea timpurie:
Dim myPowerPoint As PowerPoint.Application
Dim myPresentation As Presentation
Dim mySlide As Slide
Set myPowerPoint = CreateObject("PowerPoint.Application")
Set myPresentation = myPowerPoint.Presentations.Add
Set mySlide = myPresentation.Slides.Add(Index:=1, Layout:=ppLayoutTitleOnly)
Cu legarea ulterioară (Late Binding), creați un obiect care face referire la cealaltă aplicație din zbor atunci când se execută codul. Dacă declarați obiectul în mod explicit, îl declarați ca obiect generic — As Object — în loc să-l declarați ca un anumit tip de clasă de obiecte.
De exemplu, următoarele declarații declară variabila Object myOutlook și apoi îi atribuie o referință la un obiect Outlook.Application:
Dim myOutlook As Object
Set myOutlook = CreateObject("Outlook.Application")
Legarea timpurie nu este universală
Nu toate aplicațiile care acceptă Automation acceptă legarea timpurie. Unele aplicații nu pot oferi acces direct la funcțiile lor la momentul proiectării (în timp ce scrieți codul), necesare pentru legarea timpurie. Acestea oferă acces la funcțiile lor numai în timpul execuției (atunci când codul este executat). Cu astfel de aplicații, nu aveți de ales. Trebuie să utilizați legarea ulterioară.
Dacă aplicația server pe care o utilizați acceptă Early Binding, utilizați-o în locul legăturii Late Binding. Există trei avantaje pentru legarea timpurie:
Pe de altă parte, legarea târzie poate evita problemele de bibliotecă de obiecte, cum ar fi posibilitatea de a face referințele corecte și alte probleme de versiune bibliotecă.
Crearea unui obiect cu funcția CreateObject
Funcția CreateObject creează și returnează o referință la un obiect Automation expus la alte aplicații. Sintaxa este următoarea:
CreateObject(class [,servername])
Aici, class este un argument obligatoriu care specifică clasa (definiția formală) a obiectului de creat. Argumentul clasei constă în numele bibliotecii care va furniza obiectul și tipul de obiect care trebuie furnizat și arată astfel:
applicationname.objecttype
De exemplu, pentru a specifica obiectul Excel Application ca și clasă, utilizați un argument de clasă a Excel.Application. Aici, Excel este numele aplicației care furnizează obiectul, iar Application este tipul de obiect pe care dorim să îl furnizeze Excel. De asemenea, Excel.Sheet ar specifica un obiect foaie de lucru în Excel.
servername este un șir opțional de tip Variant care specifică numele serverului de rețea pe care se creează obiectul. Dacă doriți doar să vă conectați la o aplicație aflată pe computerul utilizatorului (cu alte cuvinte, dacă ambele aplicații — aplicațiile client și server - se află pe același hard disk), omiteți numele serverului sau specificați un șir gol. Pentru a vă conecta la o aplicație situată pe un computer server la distanță, trebuie să aveți Instalat DCOM (Distributed Component Object Model), iar obiectul de pe computerul server trebuie să fie configurat pentru a permite crearea la distanță.
De obicei, veți utiliza o funcție CreateObject cu o instrucțiune Set pentru a atribui obiectul pe care îl creați unei variabile obiect. De exemplu, următoarele declarații declară un obiect variabil numit myNewSheet și i se atribuie un obiect foaie de lucru Excel la acesta:
Dim myNewSheet As Object
Set myNewSheet = CreateObject("Excel.Sheet")
CreateObject poate fi utilizat cu orice obiect COM
Aveți posibilitatea să utilizați funcția CreateObject cu orice obiect COM de pe sistemul computerului, nu doar cu obiecte de aplicație.
Returnarea unui obiect cu funcția GetObject
Funcția GetObject returnează o referință la un obiect Automation existent. Sintaxa este următoarea:
GetObject([pathname] [, class])
Aveți posibilitatea să oferiți oricare dintre argumente, dar trebuie să furnizați unul dintre ele. Aici, pathname este o variantă șir opțională care specifică calea completă și numele fișierului care conține obiectul pe care doriți să îl regăsiți. Argumentul pathname este opțional, dar dacă nu îl specificați, trebuie să specificați argumentul class (care este opțional dacă specificați pathname, dar necesar dacă nu îl specificați) este o variantă șir care specifică clasa obiectului pe care doriți să îl returnați.
Ca și în cazul CreateObject, de obicei, veți utiliza o funcție GetObject cu o instrucțiune Set pentru a atribui unei variabile obiect obiectul pe care îl returnați cu funcția GetObject. De exemplu, în a doua din următoarele declarații, funcția GetObject returnează un obiect constând din registrul de lucru Z:\Finante\Venituri.xlsm. Instrucțiunea Set atribuie acest obiect variabilei obiect denumită Venituri declarată în prima instrucțiune:
Dim Venituri As Object
Set Venituri = GetObject("Z:\Finante\Venituri.xlsm")
Aici, registrul de lucru este asociat cu Excel. Când se execută acest cod, VBA pornește Excel dacă nu rulează deja și activează registrul de lucru. Apoi puteți face referire la obiect referindu-vă la variabila obiectului; în acest exemplu, aveți posibilitatea să manipulați obiectul Venituri pentru a afecta registrul de lucru Z:\Finante\Venituri.xlsm.
Exemple de utilizare a Automation cu aplicațiile Office
Următoarele secțiuni afișează trei exemple de utilizare Automation cu aplicații Office.
Transferul informațiilor dintr-o foaie de calcul Excel într-un document Word
Acest exemplu transferă informații dintr-o foaie de calcul Excel într-un document Word.
Mai întâi, trebuie să adăugați la proiectul Word țintă (proiectul client care va conține codul care accesează Excel) o referință la biblioteca de obiecte Excel. Urmați acești pași:
După ce ați adăugat referința, puteți utiliza browserul de obiecte al editorului VBA pentru a răsfoi obiectele din Excel. Afișați browserul de obiecte ca de obicei apăsând F2 sau selectând View > Object Browser, apoi alegeți Excel în lista verticală Project/Library a browserului de obiecte.
Browserul de obiecte va afișa conținutul bibliotecii de obiecte din Excel, așa se arată în figura următoare. Aveți posibilitatea să afișați ajutorul (exemple de cod, sintaxa) pentru un obiect Excel selectat făcând clic pe butonul Help (pictograma cu semnul întrebării) din Browserul de obiecte.
După ce ați încărcat biblioteca de obiecte Excel, aveți posibilitatea să vizualizați conținutul său în browserul de obiecte din sesiunea VBA Editor lansată din aplicația gazdă (în acest caz, Microsoft Word).
Pentru a crea și testa următorul exemplu de cod, configurați mai întâi în Excel condițiile preliminare la care se așteaptă această procedură: și anume, un obiect Range denumit SalesTotal. Pentru aceasta, deschideți Excel și faceți clic dreapta pe o celulă oriunde în foaia afișată în Book1 (numele implicit al primei foi de lucru necompletate). Dacă nu vedeți un registru de lucru numit Book1, alegeți File > New, apoi faceți clic pe pictograma registru de lucru necompletat din șabloanele afișate.
În meniul contextual care se deschide atunci când faceți clic cu butonul din dreapta pe o celulă din Book1, alegeți opțiunea Definire nume (Define Name). În caseta de dialog New Name care se deschide, tastați SalesTotal în câmpul Name. Apoi faceți clic pe OK pentru a închide caseta de dialog.
Acum, faceți dublu clic pe aceeași celulă pe care tocmai ați numit-o și tastați în 145 sau altă valoare. Această valoare este cea pe care macrocomanda din Word o va prelua din acest registru de lucru. Acum faceți clic pe fila File de pe Panglică, alegeți Save As și salvați acest registru de lucru ca Bookl.xlsx în subdirectorul C:\temp. (Rețineți că îl salvați ca fișier .xlsx.) Acum puteți fie să lăsați Excel să ruleze, fie să îl închideți. Nu va conta, deoarece macrocomanda va deschide fișierul de pe hard disk.
Acum, în Word VBA Editor, adăugați codul. Deoarece ați utilizat legarea timpurie, aveți la dispoziție caracteristicile de asistență IntelliSense ale editorului și de completare a codului. Creați procedura afișată în Listarea 30.1. Această procedură utilizează funcția GetObject pentru a regăsi informațiile din celula specificată din foaia de calcul Excel pe care ați creat-o anterior și inserați aceste date în documentul Word activ la punctul de inserare curent (unde este cursorul intermitent).
Preluarea datelor dintr-o celulă Excel și inserarea lor în Word
1. Sub Returnare_unei_Valori_din_Excel()
2.
3. Dim mySpreadsheet As Excel.Workbook
4.Dim strSalesTotal As String
5.
6. Set mySpreadsheet = _
7. GetObject("C:\Temp\Book1.xlsx")
8.
9. strSalesTotal = mySpreadsheet.Application.Range("SalesTotal").Value
10.
11. Set mySpreadsheet = Nothing
12.
13. Selection.TypeText "Total vanzari: $" & strSalesTotal & "."
14.
15. Selection.TypeParagraph
16.
17. End Sub
Această macrocomandă preia informații dintr-o foaie de calcul Excel care se află pe hard disk în directorul C:\temp. Iată ce se întâmplă în macrocomandă:
Dacă aveți probleme la folosirea acestui exemplu în practică, verificați de două ori următoarele:
Set mySpreadsheet = _
GetObject("C:\Temp\Book1.xlsx")
Ori ați scris greșit această cale în cod (de exemplu, ați scris C:\Docs în loc de C:\ Temp), ori nu ați salvat un fișier Excel denumit Book1.xlsx în acest folder.
strSalesTotal = mySpreadsheet.Application.Range("SalesTotal").Value
Dacă acest cod nu funcționează, fie aveți o greșeală de scriere în cod, cum ar fi specificarea greșită a numelui zonei, fie nu există nicio zonă cu numele SalesTotal în registrul de lucru Excel pe care îl deschideți. Încercați să redenumiți celula și să o redenumiți în cod. Apoi salvați din nou registrul de lucru. Rețineți că registrul de lucru este deschis de această macrocomandă ca fișier pe hard disk – nu este accesat chiar în aplicația Excel.
Transferul informațiilor dintr-un document Word într-un registru de lucru Excel
În secțiunea anterioară am reușit să trimitem date din Excel în Word. Acum să mergem în partea cealaltă.
Procedura următoarese execută ca o macrocomandă în Word. Procedura necesită ca Excel să se execute, astfel încât macrocomanda verifică posibilitatea ca Excel să nu execute și, dacă este necesar, să gestioneze problema în sine deschizând Excel, dacă este necesar. Procedura creează un registru de lucru Excel nou, apoi transferă informații din Word în registrul de lucru.
Pentru ca acest exemplu să funcționeze, trebuie să stocați un fișier Word de tip .docm, denumit test.docm în directorul C:\temp.
Ca și înainte, crearea acestei proceduri este mai simplă dacă adăugați mai întâi în documentul Word curent o referință la biblioteca de obiecte Excel. (Consultați secțiunea anterioară pentru instrucțiuni.)
Trimiterea datelor din Word în Excel
1. Sub Trimiterea_Word_Count_in_Registru_Excel()
2.
3. Dim WordCount As Variant
4. Dim strPath As String
5. Dim strFile As String
6. Dim docCurDoc As Document
7. Dim myXL As Excel.Application
8. Dim myXLS As Excel.Workbook
9. Const errExcelNotRunning = 429
10. Const errDocNotAvailable = 5174
11.
12. On Error GoTo Handle
13.
14. ' open the Word document:
15. strPath = "C:\temp"
16. strFile = ''test.docm''
17. Set docCurDoc = Documents.Open(strPath & "\" _
18. & strFile, AddToRecentFiles:=False)
19.
20.
21. 'Excel este deja pornit?
22. Set myXL = GetObject(, "Excel.application")
23.
24. myXL.Visible = True
25. Set myXLS = myXL.Workbooks.Add
26. myXL.ActiveCell.Range("A1").Select
27. myXL.ActiveCell = "Word Count"
28.
29. WordCount = docCurDoc _
30. .BuiltInDocumentProperties(wdPropertyWords)
31.
32. myXL.ActiveCell.Range("A2").Select
33. myXL.ActiveCell = WordCount
34.
35. docCurDoc.Close SaveChanges:=wdDoNotSaveChanges
36.
37. Shutdown:
38. Set myXL = Nothing
39. Set myXLS = Nothing
40.
41. Exit Sub
42.
43. Handle:
44. If Err.Number = errExcelNotRunning Then
45. 'Daca nu este pornita nicio instanta Excel, se porneste una:
46. Set myXL = CreateObject("Excel.Application")
47. Err.Clear
48. Resume Next
49. ElseIf Err.Number = errDocNotAvailable Then
50. MsgBox "Nu am gasit niciun document Word numit Test.docm"
51. GoTo Shutdown
52. Else
53. Resume Next
54. End If
55.
56. End Sub
Iată ce se întâmplă în codul de mai sus:
Plasarea unui diapozitiv PowerPoint într-un mesaj Outlook
Următoarea procedură arată cum se comunică între PowerPoint și Outlook. Această procedură, care se execută în PowerPoint, returnează instanța existentă de Outlook sau (dacă nu există nici una) creează o instanță nouă. Procedura utilizează apoi PowerPoint pentru a trimite un mesaj care oferă detalii desenate din prezentare.
Codul de mai jos arată procedura. Există o complicație: Deoarece PowerPoint nu are un proiect central de stocare a macrocomenzilor, cum ar fi Normal.dotm word sau Personal Macro Workbook din Excel, codul trebuie stocat într-o prezentare deschisă. Aceasta ar putea fi prezentarea care face obiectul e-mailului, dar este mult mai convenabil să mențineți o prezentare doar cu cod pe care o deschideți la începutul tuturor sesiunilor PowerPoint care necesită utilizarea codului. Acesta devine propriul sistem personal de stocare macrocomenzi.
În orice caz, aveți nevoie de unele diapozitive din care să alegeți informații care vor fi trimise (și, de asemenea, trebuie să furnizați adresa de e-mail), astfel încât să urmați acești pași pentru a configura condițiile necesare pentru exemplul următor.
Mai întâi, pregătiți proiectul PowerPoint țintă (proiectul care va conține codul care accesează Outlook și care conține diapozitivele pe care le accesați):
Acum, introduceți codul de mai jos în modulul pe care l-ați inserat în pasul 3. Asigurați-vă că înlocuiți adresa de e-mail din linia 23 cu adresa dvs. de e-mail.
Plasarea unui diapozitiv PowerPoint într-un mesaj Outlook
1. Sub Notify_of_New_Presentation()
2.
3. Dim myPresentation As Presentation
4. Dim strPresentationFilename As String
5. Dim strPresentationTitle As String
6. Dim strPresentationPresenter As String
7. Dim myOutlook As Outlook.Application
8. Dim myMessage As Outlook.MailItem
9. Const errOutlookNotRunning = 429
10.
11. On Error GoTo ErrorHandler
12.
13. Set myPresentation = ActivePresentation
14. With myPresentation
15. strPresentationFilename = .FullName
16. strPresentationTitle = _
.Slides(1).Shapes(3).TextFrame.TextRange.Text
17. strPresentationPresenter = _
.Slides(1).Shapes(1).TextFrame.TextRange.Text
18. End With
19.
20. Set myOutlook = GetObject(, "Outlook.Application")
21. Set myMessage = myOutlook.CreateItem(ItemType:=olMailItem)
22. With myMessage
' înlocuiți următoarea linie cu adresa de e-mail:
23. .To = "adresa_email@site.com"
24.
25. .Subject = "Prezentare pentru revizuire: " & strPresentationTitle
26. .BodyFormat = olFormatHTML
27. .Body = "Va rugam revizuiti urmatoarea prezentare:" & _
vbCr & vbCr & "Titlu: " & strPresentationTitle & vbCr & _
"Prezentator: " & strPresentationPresenter & vbCr & vbCr & "Prezentarea este în fișierul: " & _
strPresentationFilename
28. .Send
29. End With
30.
31. myOutlook.Quit
32.
33. Set myMessage = Nothing
34. Set myOutlook = Nothing
35. Exit Sub
36. ErrorHandler:
37. If Err.Number = errOutlookNotRunning Then
38. Set myOutlook = CreateObject("Outlook.Application")
39. Err.Clear
40. Resume Next
41. Else
42. MsgBox Err.Number & vbCr & Err.Description, vbOKOnly + _
vbCritical, "A aparut o eroare"
43. End If
44.
45.End Sub
Iată ce se întâmplă în codul de mai sus:
Dacă testați acest exemplu, asigurați-vă că ați modificat adresa de e-mail de pe linia 23. Când procedura se încheie, căutați noul mesaj de poștă electronică în Inbox din Outlook.