Folosirea Automation pentru a transfera informații

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:

  • După ce ați adăugat la proiect referința la biblioteca de obiecte a aplicației, puteți lucra dinamic în cod cu obiectele, proprietățile și metodele aplicației din afara (serverului) prin intermediul Editorului VBA din aplicația client. Acest lucru facilitează utilizarea caracteristicilor IntelliSense încorporate ale Editorului pentru a găsi obiectele, proprietățile și metodele de care aveți nevoie în aplicația la care vă referiți și pentru a evita greșelile, cum ar fi greșelile de scriere și argumentele lipsă.
  • Deoarece specificați tipul special de obiect atunci când declarați variabila obiect, este mai puțin probabil să încercați să lucrați cu un obiect greșit.
  • Deoarece VBA poate compila mai multe informații despre obiect, elementele metodelor și proprietăților sale nu trebuie rezolvate în timpul runtime. Deci, se execută mai repede.

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:

  1. Porniți sau activați Word, apoi apăsați Alt+F11 pentru a lansa VBA Editor.
  2. În Project Explorer, faceți clic pe proiectul la care doriți să adăugați referința. De exemplu, dacă procedura sau procedurile se află în șablonul Normal.dotm, selectați proiectul Normal din Project Explorer înainte de a adăuga referința. Sau, alegeți Insert > Module pentru a crea un modul nou-nouț cu care să vă jucați.
  3. Alegeți Tools > References pentru a afișa caseta de dialog References.
  4. Selectați caseta de selectare pentru elementul Microsoft Excel 16.0 Object Library.
  5. Clic pe butonul OK pentru a închide caseta de dialog References.

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ă:

  • Linia 3 declară variabila obiect mySpreadsheet de tipul Excel.Workbook. Linia 4 declară variabila strSalesTotal de tip String.
  • Linia 6 folosește o comandă Set și funcția GetObject pentru a face referința mySpreadsheet la foaia de lucru C:\Temp\Book1.xlsm.
  • Linia 9 atribuie variabilei strSalesTotal de tip String proprietatea Value (datele reale) a obiectului Range numit SalesTotal din obiectul Excel Application. Ați definit zona SalesTotal ca o singură celulă, astfel încât strSalesTotal primește valoarea celulei respective.
  • Linia 11 atribuie obiectului mySpreadsheet valoarea specială Nothing, eliberând memoria pe care a ocupat-o. (Deoarece procedura se termină aproape imediat după aceea, această declarație nu este necesară aici. VBA o va distruge la sfârșitul executării procedurii. Dar, este o bună practică pentru a elibera memoria atribuită unui obiect atunci când nu mai este nevoie să utilizați obiectul, doar pentru a vă face un obicei din asta.)
  • Linia 13 folosește metoda TypeText a obiectului Selection din Word pentru a introduce un șir de text și șirul strSalesTotal la selecția curentă. Linia 14 utilizează metoda TypeParagraph pentru a insera un paragraf după text.

Dacă aveți probleme la folosirea acestui exemplu în practică, verificați de două ori următoarele:

  • Alegeți Tools > References din VBA Editor pentru a se asigura că caseta de selectare de lângă Microsoft Excel 16.0 Object Library este bifată.
  • Dacă vedeți mesajul de eroare "Run-time error '432': File name or class name not found during Automation operation," înseamnă că e ceva în neregulă în această linie de cod.:
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.

  • Dacă vedeți mesajul de eroare "Run-time error '1004': Method 'Range' of object '_ Application' failed," aceasta înseamnă că este o eroare în următoarea linie de cod:
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:

  • Linia 2 este goală. De fapt, toate liniile goale sunt doar distanțiere - așa că nu vor mai fi menționate.
  • Linia 3 declară variabila Variant care va primi numărul de cuvinte dintr-un document Word. Mai târziu, în linia 33, aceeași variabilă atribuie valoarea sa unei celule din Excel. Linia 4 declară variabila strPath de tip String care va deține calea fișierului la documentul Word și linia 5 declară variabila strFile de tip String care va deține numele de fișier al documentului Word.
  • Linia 6 declară variabila Document numită docCurDoc; va indica spre documentul Word când este deschis utilizând metoda Open a obiectului Documents. Linia 7 declară o variabilă obiect Excel.Application numită myXL și linia 8 declară o variabilă obiect Excel.Workbook numită myXLS.
  • Linia 9 declară constanta errExcelNotRunning, setând valoarea ei la 429. Acest număr de eroare indică faptul că procedura a încercat să manipuleze Excel în timp ce nu se executa în prezent nicio instanță de Excel. Linia 10 declară o constantă errDocNotAvailable, cu valorea 5174. Acest număr de eroare indică faptul că documentul Word pe care procedura a încercat să îl deschidă nu s-a găsit.
  • Linia 12 pornește tratarea erorilor pentru procedură, direcționând executarea la codul de sub eticheta Handle în cazul unei erori.
  • Linia 17 deschide documentul Word specificat de strPath, o bară oblică inversă și strFile, atribuind obiectul documentului variabilei docCurDoc. Dacă documentul nu este disponibil, apare o eroare și executarea este transferată la codul de rutină de tratare a erorilor care pornește în linia 43. Acest număr de eroare are aceeași valoare cu a constantei definite în procedură ca errDocNotAvailable, astfel încât o casetă de mesaj informează utilizatorul că documentul Word nu a fost găsit. Apoi executarea este transferată la eticheta Shutdown în cazul în care cele două variabile obiect sunt distruse și procedura este închisă.
  • Linia 22 poate declanșa, de asemenea, o condiție de eroare. Linia încearcă să atribuie o instanță de executare în prezent variabilei obiect myXL din Excel. Cu toate acestea, dacă această încercare nu reușește, executarea este transferată la eticheta Handle. Dacă Excel nu se execută în acest moment, apare eroarea 429 ("ActiveX component cannot create object"), astfel încât linia 44 în rutina de tratare a erorilor verifică această eroare utilizând eroarea constantă excelnotRunning. Dacă se potrivește cu numărul de eroare, linia 46 atribuie myXL o nouă instanță de Excel pe care o creează utilizând funcția CreateObject. Linia 47 apoi utilizează o instrucțiune Err.Clear pentru a șterge eroarea și linia 48 conține o instrucțiune Resume Next pentru a determina VBA să reia executarea înapoi la următoarea instrucțiune după instrucțiunea care a generat eroarea.
  • Oricum ar fi, va fi executată linia 24, myXL se referă la o instanță în executare a Excel. Linia 24 setează proprietatea Visible a myXL la True astfel încât să apară pe ecran.
  • Linia 25 atribuie myXLS un registru de lucru nou creat utilizând metoda Add a obiectului Workbooks din myXL.
  • Linia 26 poziționează indicatorul de inserare în prima celulă.
  • Linia 27 atribuie celulei active din myXL textul Word Count.
  • Linia 29 atribuie valoarea numărului de cuvinte a documentului variabilei WordCount. Această valoare este accesată utilizând proprietatea wdPropertyWords din colecția BuiltInDocumentProperties a docCurDoc.
  • Linia 32 mută cursorul de inserare pe un rând în Excel în celula A2, iar linia 33 afișează numărul de cuvinte în acea celulă.
  • În cele din urmă, linia 35 închide documentul Word fără a salva modificările care i-au fost aduse în timp ce acesta a fost deschis pentru inspecție.
  • Linia 41 conține o comandă Exit Sub pentru a ieși din procedură în acest moment — pentru nu permite ca executarea să continue în zona în care se află declarațiile de gestionare a erorilor. Utilizarea unei comenzi Exit Sub este obișnuită atunci când o procedură include la sfârșit o rutină de tratare a erorilor.

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):

  1. Porniți PowerPoint. În câmpul de căutare din partea de sus a paginii de start din PowerPoint, tastați Photo Album apoi apăsați tasta Enter. Clic pe prezentarea Contemporary Photo Album, apoi clic pe butonul Create pentru a încărca prezentarea în PowerPoint.
  2. Deschideți VBA Editor apăsînd tastele Alt+F11.
  3. În VBA Editor, alegeți Insert > Module pentru a deschide un modul de cod unde să puteți pune macrocomanda.
  4. Alegeți Tools > References pentru a afișa caseta de dialog References.
  5. Bifați caseta pentru elementul Microsoft Outlook 16.0 Object Library.
  6. Clic OK pentru a închide caseta de dialog References.

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:

  • Linia 3 declară o variabilă obiect Presentation numită myPresentation. Linia 4 declară o variabilă de tip String numită strPresentationFilename, care este utilizată pentru stocarea căii și numelui de fișier. Linia 5 declară o variabilă de tip String numită strPresentation- Title, care este utilizată pentru a stoca titlul prezentării. Linia 6 declară o variabilă de tip String numită strPresentationPresenter, care este utilizat pentru a stoca numele celui care a creeat prezentarea.
  • Linia 7 declară o variabilă obiect Outlook.Application numită myOutlook care este utilizată pentru a reprezenta aplicația Outlook. Linia 8 declară o variabilă obiect Outlook.MailItem numită myMessage care este utilizată pentru a reprezenta mesajul creeat în procedură. Linia 9 declară o constantă numită errOutlookNotRunning și îi atribuie numărul 429, numărul de eroare returnat dacă nu este disponibilă nicio instanță de Outlook atunci când funcția GetObject încearcă să o acceseze.
  • Linia 11 începe tratarea erorilor pentru procedură, direcționând executarea la eticheta ErrorHandler (în linia 36) în cazul unei erori.
  • Linia 13 atribuie prezentarea activă variabilei obiect myPresentation. Liniile de la 14 până la 18 conțin o structură With care funcționează cu myPresentation. Linia 15 atribuie proprietatea FullName din myPresentation la strPresentationFilename.
  • Linia 16 atribuie la strPresentationTitle proprietatea Text a obiectului TextRange din obiectul TextFrame din al treilea obiect Shape aflat în primul obiect Slide—cu alte cuvinte, textul din prima formă de pe primul diapozitiv din prezentare. În mod similar, linia 17 atribuie la strPresentationPresenter textul din a doua formă din al doilea diapozitiv.
  • Linia 20 atribuie la myOutlook instanța curentă a Outlook, pe care o returnează utilizând funcția GetObject. Dacă Outlook nu se execută în acest moment, apare eroarea 429 ("ActiveX component cannot create object"), astfel încât linia 37 din rutina de tratare a erorilor verifică această eroare utilizând eroarea constantă errOutlookNotRunning. Dacă se potrivește, linia 38 atribuie myOutlook o nouă instanță de Outlook pe care o creează utilizând funcția CreateObject. Linia 39 utilizează apoi o instrucțiune Err.Clear pentru a șterge eroarea și linia 40 conține o instrucțiune Resume Next pentru a determina ca VBA să sară înapoi în cod și să reia executarea în cazul în care a rămas (la comanda de după instrucțiunea care a produs eroarea).
  • Linia 21 folosește metoda Createltem a obiectului Application din Outlook (reprezentat de myOutlook) pentru a crea un element de poștă electronică nou (un e-mail nou), pe care îl atribuie la myMessage. Liniile de la 22 până la 29 conțin o structură With care funcționează cu myMessage.
  • Linia 23 atribuie destinatarii prin setarea proprietății To. (Ar trebui să modificați această linie la propria adresă de e-mail, astfel încât să puteți testa acest cod și să primiți mesajul pe care îl trimite.)
  • Linia 24 este goală.
  • Linia 25 introduce text pentru proprietatea Subject. Linia 26 specifică faptul că mesajul utilizează formatarea HTML (.BodyFormat = olFormatHTML). Linia 27 atribuie text corpului mesajului utilizând proprietatea Body. Apoi linia 28 folosește metoda Send pentru a expedia mesajul.
  • Linia 31 folosește metoda Quit pentru a închide myOutlook.
  • Linia 33 setează myMessage la Nothing, eliberând memoria pe care a ocupat-o. În mod similar, linia 34 setează myOutlook la Nothing. Apoi linia 35 iese din procedură.
  • Așa cum s-a discutat mai devreme în această listă, funcția principală a rutinei de tratare a erorilor este de a lansa o instanță de Outlook dacă nu se execută niciuna în prezent. Dacă apare oricare altă eroare decât eroarea 429, executarea va trece pe ramura la instrucțiunea Else de pe linia 41 și linia 42 afișează o casetă de mesaj care dă numărul de eroare și descrierea.

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.