Lucrul cu evenimente la nivel de element

În plus față de evenimentele la nivel de aplicație discutate până în prezent, Outlook are o mare varietate de evenimente la nivel de element (item- level) - evenimente sunt declanșate atunci când sunt manipulate anumite elemente (cum ar fi sarcini sau note), spre deosebire de evenimentele legate de Outlook ca un întreg (cum ar fi închiderea Outlook).

În Outlook, puteți gestiona evenimentele la nivel de element în două moduri:

  • Prin declararea unui eveniment într-un modul de clasă și rularea unei proceduri de inițializare, astfel încât VBA să capteze evenimentul atunci când este declanșat. Acest capitol descrie această abordare.
  • Prin crearea codului Visual Basic Script (VBScript) și plasarea acestuia într-un "formular personalizat" utilizat de element. Formularele personalizate nu trebuie confundate cu UserForms cu care am lucrat în Editorul VBA în întreaga carte. Creați un formular particularizat în Outlook făcând clic pe fila Developer de pe Panglică și apoi alegerea opțiunilor afișate în secțiunea Custom Forms de pe Panglică.

Ce este VBSCRIPT?

Versiunile de script ale limbajelor computerului au fost proiectate inițial pentru a fi executate atunci când un utilizator vizitează o pagină Web. Din motive de securitate, aceste limbaje ar trebui să conțină mai puține capacități decât limbajele obișnuite. De exemplu, VBScript nu are o comandă care șterge un dosar în Outlook, în timp ce VBA are (FolderRemove). Nu doriți să ștergeți folderele Outlook sau să declanșați acțiuni dăunătoare similare, doar pentru că pur și simplu ați deschis în browser o pagină web rău intenționată.

Intenția inițială a fost ca limbajele de script să fie simple, orientate către web. Dar, limbaje script s-au schimbat în timp pentru a efectua diverse sarcini și de a avea o varietate de implementări. Acest tip de corupție este tipic în software-ul de calculator: Există mai multe versiuni de standarde, ar fi XML, HTML, și altele asemenea. Ele încep cu intenția de a fi uniforme pe platforme, de a fi guvernate de anumite reguli și așa mai departe. Apoi se modifică. Îți amintește de faimoasa remarcă a lui Mae West: "Am fost Albă ca Zăpada, dar am plutit în derivă."

În ciuda limitărilor VBScript, poate doriți să-l utilizați pentru un loc de muncă specializat în Outlook: partajarea elementelor cu alte persoane. Codul VBScript este conținut în formularul său personalizat, astfel încât să îl puteți trimite altor persoane. Nu puteți exporta direct VBA altor persoane din interiorul elementelor pe care le partajați.

Dacă sunteți interesat să urmăriți formularele personalizate Outlook și VBScript care le conduce, consultați tutorialul util aici:

http://msdn.microsoft.com/en-us/library/office/jj973110.aspx

Declararea unei variabile obiect și inițializarea unui eveniment

Urmați acești pași pentru a declara o variabilă obiect și inițializa un eveniment:

1. Utilizați un modul de clasă pentru a conține declarația variabilă obiect, într-unul din următoarele trei moduri:

  • Utilizați modulul ThisOutlookSession încorporat. În Project Explorer, extindeți numele proiectului (este scris îngroșat și în mod implicit este numit Project1). Extindeți elementul Microsoft Outlook Objects și faceți dublu clic pe elementul ThisOutlookSession pentru a deschide fereastra cod.
  • Creați un nou modul de clasă făcând clic dreapta pe numele proiectului în Project Explorer și alegând Insert > Class Module meniul contextual. VBA Editor deschide automat o fereastră de cod pentru clasă.
  • Dacă există deja un modul de clasă, faceți dublu clic pe el în Project Explorer.

2. În zona declarațiilor de la începutul modulului clasei (în partea de sus a ferestrei Cod), declarați o variabilă pentru a reprezenta obiectul la care se aplică evenimentul. Utilizați cuvântul cheie WithEvents pentru a specifica faptul că acest obiect are evenimente. Următorul exemplu creează o variabilă publică denumită myPublicContactItem:

Public WithEvents myPublicContactItem As ContactItem

3. Inițializați variabila obiect prin setarea acesteia pentru a reprezenta obiectul corespunzător. Următorul exemplu setează variabila myPublicContactItem pentru a reprezenta primul element din folderul persoane de contact implicit:

Set myPublicContactItem = Application.GetNamespace("MAPI") _ 
    .GetDefaultFolder(olFolderContacts).Items(1)

După ce ați inițializat variabila obiect, procedura se va executa după ce declanșarea evenimentului.

Puteți inițializa manual variabila obiect, dacă este necesar, și este posibil să vi se pară convenabil să faceți acest lucru atunci când scrieți codul de testare pentru a gestiona evenimente. Dar dacă trebuie să gestionați evenimentul de fiecare dată când se execută Outlook – dacă doriți să faceți macrocomanda ca parte permanentă a colecției de macrocomenzi – este evident că cel mai bine este să executați codul pentru a inițializa automat variabila obiect. De exemplu, se poate utiliza evenimentul de pornire a obiectului Application (discutat în "Utilizarea evenimentului de pornire", mai devreme în acest capitol) pentru a executa automat codul de inițializare de tratare a evenimentelor de fiecare dată când pornește Outlook. Cu alte cuvinte,

Private Sub Application_Startup()
Set myPublicContactItem = Application.GetNamespace("MAPI") _ 
  .GetDefaultFolder(olFolderContacts).Items(1)
End Sub

Înțelegerea evenimentelor care se aplică tuturor elementelor de mesaj

Tabelul de mai jos enumeră evenimentele comune pentru mesaje. Aici este folosit termenul de mesaj pentru a face referire la obiectele AppointmentItem, MailItem, ContactItem și TaskItem. Cu alte cuvinte, tabelul listează cele mai frecvente evenimente disponibile pentru aceste patru obiecte.

Dar rețineți că în Outlook există elemente obiect suplimentare, ar fi DocumentItem, DistListItem, JournalItem, MeetingItem și așa mai departe. Pentru a vizualiza aceste diverse elemente și a vedea descrieri ale evenimentelor lor, vizitați această pagină web:

http://msdn.microsoft.com/en-us/library/office/ff866465.aspx

De asemenea, rețineți că, deși tabelul descrie 16 evenimente comune, fiecare dintre obiectele "element" are de fapt 26 de evenimente. Ca un exemplu, lista completă de evenimente pentru obiectul MailItem în Outlook este furnizat pe această pagină web:

https://msdn.microsoft.com/EN-US/library/office/dn320337.aspx

Rețineți că evenimentul Close se aplică la obiectele Inspector și Explorer, precum și la obiectele menționate.

Evenimentele care se declanșează înainte ca o acțiune să aibă loc vă permite să anulați acțiunea, împiedicând-o să se declanșeze. Sintaxa pentru aceste evenimente utilizează un argument Boolean numit Cancel pe care îl puteți seta la True pentru a preveni acțiunea. De exemplu, sintaxa pentru evenimentul BeforeDelete este următoarea:

Sub expression_BeforeDelete(ByVal Item As Object, Cancel As Boolean)

Aici, expression este o expresie necesară care returnează unul dintre elementele mesajului la care se aplică evenimentul (de exemplu, un obiect TaskItem). Următorul exemplu utilizează evenimentul BeforeDelete pentru a vedea dacă obiectul TaskItem care este deschis într-un inspector este marcat ca complet atunci când utilizatorul încearcă să-l ștergeți. Dacă activitatea nu este marcată ca terminată, o casetă de mesaj solicită utilizatorului să finalizeze activitatea, iar exemplul setează apoi argumentul Revocare la True pentru a preveni ștergerea:

Private Sub myTaskItem_BeforeDelete(ByVal Item As Object, Cancel As Boolean) 
If myTaskItem.Complete = False Then
MsgBox "Finalizati sarcina inainte de a o sterge.", vbOKOnly + vbExclamation, "Activitatea este incompleta" Cancel = True 
End If 
End Sub 

Diferența dintre evenimentele READ și OPEN

Evenimentele Read și Open apar atunci când utilizatorul deschide un element existent pentru editare. Diferența dintre cele două evenimente este că evenimentul Open are loc numai atunci când elementul este deschis într-o fereastră Inspector, în timp ce evenimentul Read are loc atât atunci când elementul este deschis într-o fereastră Inspector și, de asemenea, atunci când este selectat pentru editare într-o celulă.

Înțelegerea evenimentelor care se aplică la Explorers, Inspectors și Views

Tabelul de mai jos enumeră evenimentele care se aplică la Explorer, Inspector și View. Unele evenimente se aplică atât la Explorer, cât și la Inspector.

Dacă lucrați pe un ecran mic (de exemplu, un ecran de laptop), este posibil să preferați să utilizați evenimentul NewInspector pentru a maximiza fiecare fereastră Inspector pe care o deschideți și pentru a ascunde barele de instrumente de care nu aveți nevoie. Prima procedură din exemplul următor (care include declarațiile necesare) utilizează evenimentul NewInspector pentru a vă asigura că este afișată bara de instrumente Standard, ascundeți bara de instrumente Complex și atribuiți obiectul Inspector, care reprezintă noul inspector, la bara de instrumente standard Variabila obiect public myInspector. A doua procedură utilizează evenimentul Activare a obiectului myInspector pentru a maximiza fereastra sa setând proprietatea WindowState la olMaximized.

Public WithEvents myInspectors As Inspectors 
Public WithEvents myInspector As Inspector
Private Sub myInspectors_NewInspector(ByVal Inspector As Outlook.Inspector)
  With Inspector
    With .CommandBars
      .Item("Standard").Visible = True 
      .Item("Advanced").Visible = False 
    End With
    Set myInspector = Inspector 
  End With 
End Sub
Private Sub myInspector_Activate()
  myInspector.WindowState = olMaximized 
End Sub 

Cum se testează procedurile de tratare a evenimentelor

Rutinele de tratare a evenimentelor nu se testează în același mod în care testați modulele VBA obișnuite. Într-un modul obișnuit, faceți clic pentru a pune cursorul de inserare intermitent în macrocomanda pe care doriți să o executați și apoi apăsați F5 pentru a executa această procedură.

Într-un modul de clasă, prin contrast, apăsând F5 doar deschide caseta de dialog Macros, în loc să se execute direct codul.

Dacă sunteți confuz cu privire la testarea codului, nu fi descurajat. Un handler de evenimente trebuie să fie pus într-un modul de clasă. Și de fiecare dată când folosiți clase, vă aventurați în OOP. OOP, indiferent de meritele sale, adaugă întotdeauna un strat de complexitate pentru programator. Deci, haideți să revizuim pe scurt acest subiect, pentru a vedea cum se scrie, și apoi se testează rutinele de tratare a evenimentelor.

În exemplul următor, doriți să răspundeți la orice modificări pe care utilizatorul le poate face la una dintre persoanele de contact ale utilizatorului. Cu alte cuvinte, trebuie să scrieți un cod în evenimentul ItemChange din folderul Contacts. Poate că doriți ca codul să alerteze utilizatorul că trebuie să facă modificări suplimentare. Sau, că au nevoie pentru a trimite aceste informații noi la asistentul lor. Oricare ar fi motivul, scopul este de a scrie cod care se execută atunci când un element Contact se modifică - atunci când utilizatorul modifică un contact și apoi face clic pe butonul Save, declanșând astfel evenimentul ItemChange.

"Manipularea" unui eveniment (scrierea propriului cod care se execută atunci când are loc un eveniment) necesită să urmați trei pași:

1. Creați o variabilă obiect - utilizând comanda WithEvents - care va reprezenta obiectul al cărui eveniment doriți să îl gestionați. Unde duce acest cod? În partea de sus a unui modul de clasă în secțiunea Declarații generale de deasupra oricărei proceduri. Outlook are încorporat un modul clasă special numit ThisOutlookSession. Deci, în loc de a crea un nou modul de clasă, se păstrează lucrurile simple și se folosesc doar modulele de clasă existente ThisOutlookSession pentru a declara variabila obiect.

2. Indicați sau conectați (Set) noua variabilă obiect la obiectul real al cărui eveniment doriți să îl gestionați. În exemplul nostru, dorim să gestionăm colecția Items din folderul Contacts al Outlook. Unde duce acest cod? Ar putea fi pus într-o macrocomandă. Sau, pentru că vrem să facem automat acest lucru, să îl punem în evenimentul de pornire Outlook. În acest fel conexiunea se face ori de câte ori utilizatorul rulează Outlook. Rețineți că diferitele aplicații Office au nume special rezervate: de exemplu, dacă denumiți AutoExec o procedură în Word, codul său se execută atunci când porniți Word. Dacă denumiți o procedură Application_Startup în Outlook, aceasta este echivalentul AutoExec din Word.

3. Scrieți codul rutinei de tratare a evenimentelor - acțiunile pe care doriți să fie efectuate atunci când are loc acest eveniment. Unde duce acest cod? În același modul de clasă în cazul în care ați declarat variabilele obiect (pasul 1, de mai sus).

Există și alte modalități de a gestiona evenimente, dar acesta este un exemplu simplu. Pentru a păstra simplu, vom pune codul pentru toți cei trei pași în modulul de clasă ThisOutlookSession încorporat din Outlook. Acum să urmăm pașii anteriori, numai că de data aceasta vom introduce codul real:

1. Mai întâi, deschideți Outlook VBA Editor apăsând Alt+F11. Extindeți Project1 din fereastra Project până când vedeți modulul de clasă ThisOutlookSession (sub Obiecte Microsoft Outlook). Faceți dublu clic pe ThisOutlookSession pentru a deschide fereastra cod.

2. În partea de sus a ferestrei ThisOutlookSession, tastați declarația variabilei obiect:

Public WithEvents objContacts As Items

3. Acum, în evenimentul Application Startup, vom scrie cod care conectează variabila obiect la obiectul Outlook real care ne interesează, care este colecția items din folderul Contacts:

Private Sub Application_Startup()
Set objContacts = Application.GetNamespace("MAPI") _ 
   .GetDefaultFolder(olFolderContacts).Items
End Sub

4. În cele din urmă, vom scrie codul de eveniment-handler care face treaba pe care vrem să facem. Acest cod merge, de asemenea, în modulul ThisOutlookSession:

Private Sub objContacts_ItemChange(ByVal Item As Object)
MsgBox "Acest element de Contact a fost modificat."

Acum, pentru a testa această rutină de tratare a evenimentelor, închideți și apoi reporniți Outlook. Acest lucru este necesar pentru a executa procedura Application_Startup care preia și variabila noastră obiect în folderul Contacts colecția Items (descrisă la elementul 3 din lista de mai sus).

Acum, în Outlook, deschideți folderul Contacts. În Outlook 2013 și 2016, acest folder este numit People și se găsește în colțul din stânga jos, lângă pictogramele Mail și Calendar. Faceți dublu clic pe un contact aleatoriu. Faceți clic pe Edit din partea din dreapta sus a ferestrei, pe Notes și tastați ceva în câmpul Notes. În cele din urmă, faceți clic pe butonul Save din colțul din dreapta jos. Acest lucru ar trebui să provoace executarea codului rutinei de tratare a evenimentelor, afișând un mesaj care vă spune că informațiile de contact s-au modificat.

Folosind OOP, am declanșat indirect această casetă de mesaje.

Nu voi pretinde că toate astea sunt ușoare. Deși OOP are meritele sale, scrierea codului folosind OOP este mai complexă. Complexitatea care implică dicție, punctuație, referință, domeniu de aplicare, prioritate și alte aspecte vă vor atrage adesea într-o lume a mai multor interacțiuni, ducând la cicluri imprevizibile și uimitoare de testare a codului de retestare. Cel mai bun pariu atunci când se lucrează cu module de clasă este de a încerca să se găsească on-line unele exemple de cod, care sunt aproape de ceea ce încercați să realizați și apoi să le modificați pentru a se potrivi scopurilor dumneavoastră.

Înțelegerea evenimentelor care se aplică folderelor

Outlook oferă trei evenimente care se aplică folderelor, descrise în tabelul următor:

Înțelegerea evenimentelor care se aplică obiectelor Items și Results

Tabelul de mai jos enumeră evenimentele care se aplică la obiectele Items și Results.

Înțelegerea evenimentelor care se aplică la Reminders

Tabelul următor explică evenimentele pe care Outlook le oferă pentru mementouri. Aveți posibilitatea să utilizați aceste evenimente pentru a lua măsuri atunci când apare o avertizare, înainte să apară caseta de dialog memento, atunci când utilizatorul face clic pe butonul Amânare (Snooze) pentru a respinge un memento sau când mementourile sunt adăugate, modificate sau eliminate.

Înțelegerea evenimentelor care se aplică la sincronizare

Dacă scrieți proceduri pentru sincronizarea Outlook, poate fi necesar să utilizați cele trei evenimente care se aplică obiectului SyncObject, care reprezintă un grup trimitere/primire pentru un utilizator. (Aveți posibilitatea să accesați obiectul SyncObject utilizând proprietatea SyncObjects a obiectului NameSpace pentru a returna colecția SyncObjects.) Tabelul următor explică evenimentele care se aplică obiectului SyncObject.

Următorul exemplu utilizează evenimentul OnError cu variabila obiect mySyncObject. Dacă apare o eroare în timpul sincronizării SyncObject reprezentate de mySyncObject, această procedură afișează un mesaj de eroare care afișează codul de eroare și descrierea:

Private Sub mySyncObject_OnError(ByVal Code As Long, _
    ByVal Description As String)

Dim strMessage As String
strMessage = "A aparut o eroare la sincronizare:" & vbCr & vbCr 
strMessage = strMessage & "Cod eroare: " & Code & vbCr 
strMessage = strMessage & "Descriere eroare: " & Description 
MsgBox strMessage, vbOKOnly + vbExclamation, "Eroare la sincronizare"
End Sub