O componentă cheie a unei proceduri bine realizate este informarea utilizatorului în timpul executării procedurii. Pentru o macrocomandă care îndeplinește o sarcină simplă, informațiile vor fi scrise doar în descrierea din câmpul Description al macrocomenzii pentru a asigura utilizatorul că a ales procedura corectă din caseta de dialog Macros.
La o procedură mai complexă, probabil că informațiile vor fi mai complexe: este posibil să fie necesar să afișați o casetă de mesaje la pornire sau o casetă de dialog, să afișați informații în bara de stare în timpul execuției procedurii, să afișați o casetă de mesaje la final sau să creați un fișier jurnal cu informații, care să înregistreze ce s-a petrecut în timpul executării procedurii.
Mai întâi trebuie să decideți dacă dezactivați acțiunile utilizatorului în timpul procedurii. În Word și Excel, puteți dezactiva acțiunea utilizatorului pentru a proteja secțiuni sensibile ale procedurilor prin setarea proprietății EnableCancelKey a obiectului Application (așa cum este discutat în „Dezactivarea introducerii datelor în timpul rulării procedurii” din secțiunea „Manipularea întreruperilor datorate utilizatorului în Word, Excel, Project"). Când faceți acest lucru, este bine să indicați utilizatorului la începutul procedurii că acțiunile lui vor fi dezactivate și să explicați de ce. În caz contrar, un utilizator poate reacționa la o procedură care pare să nu se execute în același mod în care ar răspunde la o aplicație care a fost blocată - încercând să închidă forțat aplicația prin Task Manager. Pentru a menține utilizatorul informat despre alte aspecte ale procedurii, aveți mai multe opțiuni, care sunt discutate în secțiunile următoare. În primul rând, „Dezactivarea actualizării ecranului” examinează modul în care puteți ascunde informațiile utilizatorului (și motivele pentru care faceți acest lucru) prin dezactivarea actualizării ecranului în Word și Excel.
DEZACTIVAREA ACTUALIZĂRII ECRANULUI
Access, Word și Excel vă permit să dezactivați actualizarea ecranului - adică să opriți afișarea informațiilor în zona documentului. Celelalte părți ale ferestrei aplicației - bara de titlu, barele de comandă, bara de stare, barele de defilare și așa mai departe - continuă să se actualizeze, dar aceste elemente sunt de obicei relativ statice în comparație cu zona documentului, deci nu necesită prea multe actualizări. Totuși, dacă utilizatorul redimensionează fereastra aplicației sau fereastra documentului, va vedea aceste alte părți ale ferestrei aplicației schimbate, chiar și cu actualizarea ecranului dezactivată.
Există două avantaje pentru a dezactiva actualizarea ecranului în timp ce procedura dvs. este executată:
Dezavantajul major al dezactivării actualizării ecranului este faptul că acest lucru împiedică utilizatorii să vadă informații care le-ar putea fi utile. În cel mai rău caz, utilizatorii pot presupune din lipsa activității de pe ecran că fie procedura a intrat într-o buclă interminabilă, fie că computerul s-a blocat, astfel încât pot încerca să oprească procedura apăsând Ctrl + Break sau Ctrl + Alt + Delete pentru a deschide Task Manager și, de acolo, de a închide aplicația. (De obicei, în timpul execuției codului VBA, Task Manager afișează în dreptul aplicației gazdă mesajul “Not responding”, ceea ce nu ajută.)
Pentru a împiedica utilizatorii să perturbe o procedură, avertizați-i din timp că procedura va dezactiva actualizarea ecranului. De exemplu, puteți menționa acest lucru într-o casetă de mesaje la începutul procedurii sau puteți afișa o casetă de dialog care permite utilizatorului să aleagă dacă vor să dezactiveze actualizarea ecranului pentru ca procedura să fie executată mai repede sau să lase actualizarea ecranului, procedura să fie executată cu viteza normală și să fie urmărită pe ecran.
Dacă nu afișați o casetă de mesaj sau o casetă de dialog la începutul unei proceduri, poate doriți să afișați informații în bara de stare pentru a spune utilizatorului ce se întâmplă în timpul procedurii. Word și Excel actualizează bara de stare și bara de titlu a aplicației, chiar dacă actualizarea ecranului este dezactivată - cu condiția să fie vizibile bara de stare și bara de titlu. Pentru a afișa informații pe bara de stare, alocați proprietății StatusBar a obiectului Application un șir de caractere adecvat:
Application.StatusBar = _
"Word creaza 308 documente noi. Va rugam sa asteptati ..."
În mod alternativ, puteți dezactiva actualizarea ecranului pentru anumite părți ale unei proceduri și o puteți activa sau reîmprospăta, pentru alte părți. Luați în considerare o procedură care creează și formatează un număr de documente dintr-un document existent. Dacă dezactivați actualizarea ecranului la începutul procedurii și apoi o reîmprospăta odată ce fiecare document a fost creat și formatat, utilizatorul va vedea la rândul său fiecare document (care transmite progresul pe care îl face procedura) fără a vedea detaliile de formatare. În plus, procedura se va derula mai repede decât dacă ecranul ar afișa toată formatarea.
Pentru a dezactiva actualizarea ecranului, setați proprietatea ScreenUpdating a obiectului Application la False:
Application.ScreenUpdating = False
Pentru a reactiva actualizarea ecramului, setați ScreenUpdating la True:
Application.ScreenUpdating = True
În Access, folosiți metoda Echo a obiectului DoCmd pentru a activa sau dezactiva actualizarea ecranului, respectiv: DoCmd.Echo True 'activează actualizarea ecranului
DoCmd.Echo False 'dezactivează actualizarea ecranului
În Word, pentru a reîmprospăta informația afișată pe ecran cu conținutul din bufferul memoriei video, folosiți metoda ScreenRefresh a obiectului Application:
Application.ScreenRefresh
Manipularea cursorului
Word și Excel vă permit să manipulați cursorul (indicatorul mouse-ului). Este posibil să fie necesar să faceți acest lucru deoarece în timp ce se execută o procedură VBA, este afișat automat cursorul ”ocupat” (o clepsidră în Windows XP sau un inel care se rotește în versiunile Windows mai noi) și apoi restabilește cursorul normal când s-a terminat procedura. Uneori, este posibil să trebuiască specificat aspectul cursorului în cod.
OBIȘNUIREA CU UN ANUMIT CURSOR
După ce au folosit computerul chiar și numai câteva luni, utilizatorii tind să dezvolte reacții aproape pavloviene la cursor, unde cursorul ”ocupat” semnifică (în ordine crescătoare) o mică pauză (sau un computer lent), o șansă de a bea o ceașcă de cafea sau de a discuta cu un coleg sau apariția panicii pentru că nu au fost salvate ultimele trei ore de muncă. De obicei, nu veți dori să vă încurcați cu aceste reacții. Așadar, este o greșeală să afișați un cursor de inserare I sau un cursor cu săgeți „normale” atunci când sistemul este de fapt ocupat - sau să afișați cursorul ocupat după ce procedura a terminat de rulat și este din nou gata să răspundă la apăsările de taste (stare care afișează simbolul I).
MANIPULAREA CURSORULUI ÎN WORD
Word implementează cursorul prin obiectul System. Pentru a manipula cursorul, setați proprietatea Cursor. Aceasta este o proprietate de citire / scriere de tip Long, care poate fi setată la următoarele valori: wdCursor IBeam (1) pentru un cursor de forma I, wdCursorNormal (2) pentru un cursor normal, wdCursorNorthWestArrow (3) pentru o redimensionare în unghi spre stânga și wdCursorWait (0) pentru cursorul ocupat. Aspectul exact al cursorului depinde de schema cursorului aleasă în computer.
De exemplu, următoarea instrucțiune afișează un cursor ocupat:
System.Cursor = wdCursorWait
Utilizatorul poate personaliza modul în care arată cursorul cu clic pe pictograma Mouse din Control Panel, deschiderea ferestrei de dialog Mouse Properties și alegerea etichetei Pointers.
Manipularea Cursorului în Excel
Excel vă permite să manipulați forma cursorului cu proprietatea Cursor a obiectului Application. Cursor este o proprietate de citire / scriere de tip Long care poate fi setată la următoarele valori: xlIBeam (3) pentru un cursor de forma I, xlDefault (-4143) pentru un cursor implicit, xlNorthwestArrow (1) pentru săgeata orientată în sus și către stânga și xlWait (2) pentru cursorul ocupat.
De exemplu, următoarea instrucțiune afișează cursorul ocupat:
Application.Cursor = xlWait
Când setați în mod explicit proprietatea Cursor a obiectului Application în Excel, nu uitați să o resetați înainte a se termina execuția codului. În caz contrar, cursorul rămâne așa cum l-ați lăsat.
Afișarea informației la începutul unei proceduri
La începutul procedurii puteți afișa o casetă de mesaje sau o casetă de dialog. În acest scop, puteți utiliza casetele de mesaj Yes/No sau OK/Cancel.
Caseta de mesaj informează utilizatorii ce va face procedura și le oferă șansa de a anula procedura fără a o mai rula.
În mod alternativ, o casetă de dialog poate prezenta opțiuni pentru procedură (de exemplu, opțiuni care se exclud reciproc cu butoane radio - de opțiune sau opțiuni care nu se exclud, cu casete de selectare), permițând utilizatorilor să introducă informații (prin casete text, casete de listă sau căsuțe combo) și, desigur , lăsându-i să anuleze procedura dacă au pornit-o din greșeală. Dacă aveți timp să redactați un fișier de ajutor pentru a însoți procedurile și formularele de utilizator create, puteți adăuga un buton de ajutor la fiecare casetă de mesaj sau casetă de dialog, legându-l la subiectul relevant din fișierul de ajutor.
Puteți utiliza, de asemenea, o casetă de mesaj sau o casetă de dialog pentru a avertiza utilizatorul că procedura va dezactiva acțiunile utilizatorului parțial sau total.
Comunicarea cu utilizatorul prin casete de mesaj sau de dialog la finalul procedurii
În unele proceduri, după ce procedura și-a încheiat activitatea, este utilă colectarea de informații cu privire la procedurile efectuate, pentru a le afișa utilizatorului într-o casetă de mesaje sau o casetă de dialog. După cum ați văzut în secțiunea „Preluarea de informații folosind casete Message Box și Input Box”, căsuțele de mesaje sunt mai ușor de utilizat, dar sunt limitate la formularea textului – pot fi folosite ca efecte doar spațiile, tab-urile, trecerea la rând nou și listele cu buline. Cu ajutorul căsuțelor de dialog, puteți prezenta textul oricum trebuie (folosind etichete sau căsuțe de text) și, dacă este necesar, puteți include imagini.
Cel mai simplu mod de a colecta informații în timpul executării unei proceduri este de a construi una sau mai multe șiruri care conțin informațiile pe care doriți să le afișați. Pe pagina „Folosirea buclelor For... pentru repetări fixe", la Controlul unei bucle For...Next cu datele introduse de utilizator într-o casetă de dialog, procedura cmdOK_Click colectează informații în timp ce creează o serie de foldere și apoi la final se afișează o casetă de mesaje care să spună utilizatorului ce a făcut procedura.
Crearea unui fișier jurnal
Dacă aveți nevoie să colectați o mulțime de informații pe parcursul derulării unei proceduri și să o prezentați utilizatorului odată ce procedura s-a încheiat sau doar să o puneți la dispoziție pentru referință, dacă este nevoie, luați în considerare utilizarea unui fișier jurnal, în locul unei casete de dialog. Fișierele jurnal sunt utile pentru procedurile mari care manipulează date critice: prin scrierea periodică a informațiilor într-un fișier jurnal (și prin salvarea lor frecventă), creați o înregistrare a realizării procedurii în caz de blocare.
Realizați un fișier Jurnal pentru utilizatorii obișnuiți sau cei avansați
Dacă doriți ca un fișier de jurnal să fie util atât pentru utilizatorii obișnuiți, cât și pentru cei avansați din punct de vedere tehnic, faceți intrările sale lizibile și utile, incluzând toate informațiile tehnice necesare pentru depanarea avansată. De exemplu, un mesaj precum
„Fișierele de date pentru biroul „Madrid”(madrid060430. Xlsm) și biroul „Taos”(taos060430.xlsm) nu au fost găsite în locația așteptată”, \\server2\data\dayfiles\, deci informația nu a putut fi inclusă”
este de obicei mai utilă decât un cod de eroare „Error code 44E: Required Data Missing”.
Să presupunem că ați scris o procedură pentru Word care colectează în fiecare zi informații din diverse surse și le scrie într-un raport. Poate doriți să păstrați un fișier jurnal care să urmărească dacă informațiile din fiecare sursă au fost transferate cu succes și la ce oră. Codul de mai jos oferă un exemplu de astfel de procedură. La finalul procedurii, puteți lăsa deschis fișierul jurnal, astfel încât utilizatorul să poată verifica dacă procedura a reușit să creeze raportul sau puteți lăsa fișierul rezumat deschis, astfel încât utilizatorul să poată citi raportul.
Crearea unui fișier jurnal (log file)
1. Sub Create_Log_File()
2.
3. Dim strDate As String
4. Dim strPath As String
5. Dim strCity(10) As String
6. Dim strLogText As String
7. Dim strLogName As String
8. Dim strSummary As String
9. Dim strFile As String
10. Dim i As Integer
11.
12. On Error GoTo Crash
13.
14. strCity(1) = "Chicago"
15. strCity(2) = "Toronto"
16. strCity(3) = "New York"
17. strCity(4) = "London"
18. strCity(5) = "Lyons"
19. strCity(6) = "Antwerp"
20. strCity(7) = "Copenhagen"
21. strCity(8) = "Krakow"
22. strCity(9) = "Pinsk"
23. strCity(10) = "Belgrade"
24.
25. strDate = Day(Date) & "-" & Month(Date) & "-" _
& Year(Date)
26. strPath = "f:\Daily Data\"
27. strLogName = strPath & "Reports\Log for " _
& strDate & ".docm"
28. strSummary = strPath & "Reports\Summary for " _
& strDate & ".docm"
29. Documents.Add
30. ActiveDocument.SaveAs strSummary
31.
32. For i = 1 To 10
33. strFile = strPath & strCity(i) & " " & strDate & ".docm"
34. If Dir(strFile) <> "" Then
35. Documents.Open strFile
36. Documents(strFile).Paragraphs(1).Range.Copy
37. Documents(strFile).Close _
38. SaveChanges:=wdDoNotSaveChanges
39. With Documents(strSummary)
40. Selection.EndKey Unit:=wdStory
41. Selection.Paste
42. .Save
43. End With
44. strLogText = strLogText & strCity(i) _
& vbTab & "OK" & vbCr
45. Else
46. strLogText = strLogText & strCity(i) _
& vbTab & "No file" & vbCr
47. End If
48. Next i
49.
50. Crash:
51.
52. Documents.Add
53. Selection.TypeText strLogText
54. ActiveDocument.SaveAs strLogName
55. Documents(strLogName).Close
56. Documents(strSummary).Close
57.
58. End Sub
Procedura din codul de mai sus creează un nou document care conține un rezumat, deschide la rândul său un număr de fișiere, copiază primul paragraf din fiecare fișier și îl adaugă în documentul rezumat și apoi închide fișierul. În acest fel, procedura păstrează o serie de informații de jurnal din care creează un fișier jurnal la sfârșitul procedurii sau, dacă apare o eroare, în timpul procedurii. Iată ce se întâmplă în cod: