Informarea utilizatorului în timpul execuției procedurii

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

  • Puteți grăbi oarecum executarea procedurilor. Această îmbunătățire a fost destul de vizibilă la computerele mai vechi și este încă perceptibilă cu computerele cu putere cu plăci video lente. Majoritatea computerelor construite începând cu anul 2000 au o placă grafică relativ rapidă, astfel încât oprirea actualizării ecranului nu face o diferență vizibilă. Orice îmbunătățire a vitezei la dezactivarea actualizării ecranului se aplică în special procedurilor care provoacă o mulțime de modificări pe ecranul monitorului. De exemplu, să presupunem că o procedură din Word scoate un anumit tip de informații din documentul curent, o adaugă într-un document nou, creează un tabel și aplică formatarea la acel tabel. Calculatorul își va folosi o parte din resurse pentru a actualiza ceea ce apare pe monitor. Aceasta este o pierdere de resurse dacă utilizatorul nu este interesat de fiecare operațiune executată, deci puteți dezactiva actualizarea ecranului.
  • Puteți ascunde utilizatorilor orice părți ale procedurii pe care nu doriți să le vadă. Acest lucru sună totalitar, dar, de obicei, este mai degrabă ca un compromis între o dictatură binevoitoare și televiziunea publică: oamenii nu ar trebui să vadă anumite lucruri care ar putea să îi supere, și există multe lucruri pe care majoritatea oamenilor nu trebuie să le știe. Este la fel și când scrieți programe: Dacă utilizatorii nu știu despre operațiunile pe care le va efectua o procedură în mod obișnuit pentru a obține anumite efecte, pot fi surprinși sau consternați de ceea ce văd pe ecran. De exemplu, într-o procedură care mută un fișier deschis, poate doriți să ascundeți de utilizator faptul că procedura închide fișierul deschis, îl mută și apoi îl redeschide din noua sa locație. Dezactivând actualizarea ecranului, puteți realiza acest lucru.

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:

  • Pe liniile de la 3 până la 9 se declară șase variabile de tip String - strDate, strPath, strLogText, strLogName, strSummary și strFile și o matrice de tip String, strCity, care conține 10 elemente.(Procedura folosește comanda Option Base 1 care nu apare în procedură, deci strCity(10) produce 10 elemente în matrice în loc de 11.) Linia 10 declară variabila i de tip Integer, care va fi folosită în procedură ca și contor.
  • Linia 11 este goală. Linia 12 folosește comanda On Error GoTo pentru a porni detectarea erorilor și trimiterea lor la eticheta Crash: atunci când apar. Linia 13 este goală.
  • Pe liniile de la 14 până la 23 se atribuie matricii strCity numele a 10 orașe. Linia 24 este goală.
  • Pe linia 25 se atribuie variabilei strDate un șir creat din concatenarea lunii, zilei și anului pentru data curentă (despărțite de cratimă) folosind funcțiile Month, Day și Year. De exemplu, 15 ianuarie 2020, va produce șirul de caractere 15-1-2020. (Motivul creării șirului cu cratimă este că Windows nu poate manipula caracterele slash din numele fișierelor, ele fiind rezervate pentru indicarea folderelor.) Varianta Format(Date, "DD.MM.YYYY")
  • Linia 26 configurează variabila strPath la folderul f:\Daily Data\. Linia 27 construiește un nume de fișier pentru jurnal în subfolderul \Reports\, iar linia 28 creează un nume de fișier pentru rezumat, în subfolderul \Reports\.
  • Pe linia 29 se creează un document nou bazat pe șablonul Normal.dotm, iar pe linia 30 salvează documentul sub numele stocat în variabila strSummary. Linia 31 este goală.
  • Linia 32 începe bucla For...Next care rulează de la i = 1 până la i = 10. Linia 33 atribuie variabilei strFile de tip String numele fișierului pentru primul oraș stocat în matricea strCity: strPath & strCity(i) & " " & strDate & ".docm".
  • Linia 34 începe o instrucțiune If care verifică dacă Dir(strFile) întoarce șirul gol. Dacă nu, linia 35 deschide documentul specificat de strFile, linia 36 copie primul paragraf, iar linia 37 închide documentul fără a salva modificările (linia 38). Procedura nu face modificări în document, dar dacă documentul conține și câmpuri dinamice (de exemplu, câmpuri de tip dată sau hyperlink-uri care se actualizează automat la deschiderea documentului), acesta se va modifica. Incluzând argumentul SaveChanges se poate evita mesajul de salvare a documentului. (O alternativă ar fi prin setarea proprietății Saved a documentului la True apoi închiderea lui fără a folosi argumentul SaveChanges.)
  • Liniile de la 39 până la 43 conțin o instrucțiune With care lucrează cu obiectul Document speci­ficat de strSummary. Linia 40 folosește metoda EndKey cu argumentul Unit:=wdStory pentru a muta selecția la sfârșitul documentului. Linia 41 adaugă textul copiat din documentul deschis, iar linia 42 salvează documentul. Linia 43 încheie instrucțiunea With.
  • Linia 44 adaugă la strLogText conținutul din strCity(i), un tab, textul OK, apoi caracterul carriage return, care va produce o listă simplă delimitată de caractere tab, cu orașele și starea rapoartelor lor.
  • Atunci când condiția de pe linia 34 nu este îndeplinită, execuția sare la instrucțiunea Else de pe linia 45, iar linia 46 adaugă la strLogText conținutul strCity(i), un tab, textul No file, și un caracter car­riage return. Linia 47 încheie instrucțiunea If, iar linia 48 încheie bucla For...Next, care returnează execuția la linia 32.
  • Linia 49 este goală. Linia 50 conține eticheta Crash: și marchează începutul manipulării erorilor. Spre deosebire de alte proceduri, executarea procedurii nu se va opri la manipularea erorilor, comenzile vor fi executate (pentru a crea fișierul jurnal) chiar dacă apar erori. Linia 51 este goală.
  • Linia 52 creează un document nou bazat pe șablonul implicit; linia 53 tastează conținutul variabilelor strLogText în noul document; iar linia 54 îl salvează cu numele din strLogName. Linia 55 închide noul document (alternativ, puteți lăsa documentul deschis pentru ca utilizatorul să îl poată vedea). Linia 56 închide documentul rezumat (care a rămas deschis de la crearea lui. Din nou, se poate lăsa deschis documentul, pentru ca utilizatorul să îl vadă, sau poate fi afișată o casetă cu opțiunea de a păstra documentul deschis). Linia 57 este goală, iar linia 58 încheie procedura.