Cuprins
Deoarece știți deja cum să creați UDF-uri (și, sper, ați încercat să le aplicați în Excel), să aprofundăm puțin și să vedem ce se poate face în cazul în care funcția definită de utilizator nu funcționează.
Pentru a rezolva unele probleme atunci când creați o funcție personalizată, cel mai probabil va trebui să executați o depanare. Astfel, puteți fi sigur că funcția funcționează corect.
Vom explora următoarele tehnici de depanare:
Atunci când creați o funcție personalizată, există întotdeauna posibilitatea să faceți o greșeală. Funcțiile personalizate sunt de obicei destul de complexe. Și nu încep întotdeauna să funcționeze corect imediat. Formula poate returna un rezultat incorect sau eroarea #VALUE! Spre deosebire de funcțiile standard Excel, nu veți vedea alte mesaje.
Există o modalitate de a parcurge pas cu pas o funcție personalizată pentru a verifica modul în care funcționează fiecare dintre instrucțiunile sale? Sigur! Depanarea este utilizată pentru acest lucru.
Vă voi oferi mai multe modalități de a depana funcția dvs. personalizată, astfel încât să o puteți alege pe cea care vă convine.
Ca un exemplu, folosim funcția personalizată GetMaxBetween din unul dintre articolele noastre anterioare, care calculează numărul maxim din intervalul de valori specificat:
Function GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) For Each NumRange In rngCells vMax = NumRange Select Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween = WorksheetFunction.Max(arrNums) End FunctionArgumentele funcției sunt intervalul de celule în care se scriu numerele, precum și limita superioară și inferioară a valorilor.
Așezați funcția MsgBox în locuri importante
Pentru a monitoriza execuția calculelor, puteți afișa valorile celor mai importante variabile pe ecran, în locurile potrivite. Acest lucru se poate face cu ajutorul unor casete de dialog pop-up.
MsgBox este o casetă de dialog pe care o puteți utiliza pentru a afișa un anumit tip de mesaj utilizatorului.
Sintaxa MsgBox este similară cu cea a altor funcții VBA:
MsgBox(prompt [, butoane] [, titlu] [, helpfile, context])prompt este un argument obligatoriu. Acesta conține mesajul pe care îl vedeți în caseta de dialog. De asemenea, poate fi utilizat pentru a afișa valorile variabilelor individuale.
Toate celelalte argumente sunt opționale.
[ butoane ] - determină ce butoane și pictograme sunt afișate în fereastra de MsgBox De exemplu, dacă folosim opțiunea vbOkOnly , atunci numai OK Chiar dacă ați omis acest argument, acest buton este utilizat în mod implicit.
[ titlu ] - aici puteți specifica titlul casetei de mesaje.
Să trecem de la cuvinte la practică și să începem să depanăm. Pentru a afișa mesajul, adăugați următoarea linie la codul din GetMaxBetween funcție definită de utilizator înainte de Cazul Else operator:
MsgBox vMax,,, "Count -" & iIată ce vom obține în rezultat:
Function GetMaxBetween(rngCells As Range, MinNum, MaxNum) Dim NumRange As Range Dim vMax Dim arrNums() Dim i As Integer ReDim arrNums(rngCells.Count) For Each NumRange In rngCells vMax = NumRange Select Case vMax Case MinNum + 0.01 To MaxNum - 0.01 arrNums(i) = vMax i = i + 1 MsgBox vMax,, "Count -" & i Case Else GetMaxBetween = 0 End Select Next NumRange GetMaxBetween =WorksheetFunction.Max(arrNums) End FunctionUtilizarea vMax din caseta de dialog, vom vedea ce numere îndeplinesc criteriile de selecție, astfel încât să putem selecta cel mai mare dintre ele. Cu expresia "Count -" & I în bara de titlu, indicăm câte numere am selectat deja pentru a determina valoarea maximă. Contorul va fi mărit cu fiecare nouă valoare.
După ce am setat UDF-ul nostru, aplicăm formula de mai jos la intervalul de date:
= GetMaxBetween (A1:A6,10,50)
După apăsarea butonului Enter, veți vedea un mesaj ca în imaginea de mai jos:
Acesta este primul număr din intervalul A1: A6 care îndeplinește criteriul: mai mare decât 10 și mai mic decât 50.
După ce faceți clic pe OK, apare un al doilea mesaj cu numărul 14. Restul numerelor nu corespund criteriilor de selecție. Prin urmare, funcția iese și returnează cea mai mare dintre cele două valori, 17.
The MsgBox poate fi utilizată în cele mai importante locuri din funcția dvs. personalizată pentru a controla modul în care se modifică valorile variabilelor individuale. Casetele de mesaje pot fi foarte utile atunci când aveți o funcție mare și multe calcule. În acest caz, vă va fi ușor să determinați în ce parte a codului apare eroarea.
Determinați punctele de oprire și efectuați pas cu pas
Puteți adăuga puncte de întrerupere în codul funcției dvs. unde execuția codului se va opri. Astfel, puteți urmări pas cu pas procesul de calcul. În acest fel, puteți vedea cum se modifică valorile variabilelor.
Pentru a adăuga un punct de întrerupere, poziționați cursorul pe linia care conține declarația în care doriți să faceți o pauză. Apoi faceți clic dreapta și selectați Depanare -> Schimbă punctul de întrerupere sau pur și simplu apăsați F9 . De asemenea, puteți face clic în locul dorit pe zona gri verticală din stânga codului de funcție.
Va apărea un cerc roșu, așa cum puteți vedea în captura de ecran de mai jos. Linia de cod în care va fi oprit calculul este evidențiată cu roșu.
Acum, fereastra editorului VBA va fi deschisă atunci când funcția este în execuție. Cursorul va fi poziționat în punctul în care v-ați oprit.
Dacă treceți cursorul mouse-ului peste oricare dintre variabilele din codul funcției, puteți vedea valoarea curentă a acestora:
Apăsați F5 pentru a continua calculul.
Notă. După punctul de întrerupere, puteți începe să urmăriți pas cu pas evoluția calculelor. Dacă apăsați butonul F8, va fi executată doar următoarea linie de cod VBA. Linia galbenă cu o săgeată se va muta, de asemenea, la ultima poziție de cod executată.
Deoarece execuția funcției este din nou în pauză, puteți vizualiza valorile curente ale tuturor variabilelor funcției cu ajutorul cursorului mouse-ului.
Următoarea apăsare a butonului F8 ne va duce cu un pas înainte. Astfel, puteți apăsa F8 până la sfârșitul calculului. Sau apăsați F5 pentru a continua calculul până la următorul punct de întrerupere.
Dacă apare o eroare, cursorul va fi oprit în punctul din cod în care s-a produs eroarea. Și veți vedea și un mesaj de eroare pop-up. Acest lucru facilitează determinarea cauzei problemei.
Punctele de întrerupere pe care le specificați vor fi aplicate până când închideți fișierul. Când îl redeschideți, va trebui să le setați din nou. Nu este cea mai convenabilă metodă, nu credeți?
Totuși, această problemă poate fi rezolvată. Introduceți un Stop în codul funcției în punctele necesare și puteți opri execuția programului în același mod ca atunci când folosiți puncte de întrerupere.
Atunci când VBA întâlnește un Stop se va opri execuția programului și va aștepta acțiunea dvs. Verificați valorile variabilelor, apoi apăsați F5 pentru a continua.
Sau apăsați F8 pentru a îndeplini funcția pas cu pas, așa cum este descris mai sus.
The Stop face parte din program și, prin urmare, nu este ștearsă, așa cum se întâmplă în cazul unui punct de întrerupere. Când ați terminat de depanat, eliminați-o. Sau transformați-o într-un comentariu, precedând-o cu un ghilimele (').
Depanarea folosind operatorul Debug.Print
Puteți plasa Debug.Print în codul funcției la locul potrivit. Acest lucru este util pentru a verifica valorile variabilelor care se schimbă ciclic.
Puteți vedea un exemplu de performanță a Debug.Print în captura de ecran de mai jos.
Declarație Debug.Print i, vMax tipărește valorile și numerele lor ordinale.
În fereastra Immediate se văd două numere (17 și 14) din intervalul selectat, care corespunde limitelor stabilite și dintre care va fi selectat maximul. Cifrele 1 și 2 înseamnă că funcția a parcurs 2 cicluri în care au fost selectate numerele. Vedem valorile celor mai importante variabile, așa cum am făcut-o mai devreme cu MsgBox Dar acest lucru nu a oprit funcția.
Apelarea unei funcții dintr-o procedură
Puteți apela o funcție definită de utilizator nu dintr-o celulă din foaia de calcul, ci dintr-o procedură. În acest caz, toate erorile vor fi afișate în fereastra Editorului Visual Basic.
Iată cum puteți apela funcția GetMaxBerween definită de utilizator dintr-o procedură:
Sub Test() Dim x x = GetMaxBetween(Range ("A1:A6" ), 10, 50) MsgBox(x) End SubPoziționați cursorul oriunde în cod și apăsați F5 . Dacă nu există nicio eroare în funcție, veți vedea o fereastră pop-up cu rezultatul calculului.
În cazul unei erori, veți vedea un mesaj corespunzător în editorul VBA. Calculul va fi oprit, iar linia de cod în care a apărut eroarea va fi evidențiată cu galben. Puteți identifica cu ușurință unde și de ce a apărut eroarea.
Asta e tot. Acum v-ați creat propriul add-in, l-ați adăugat la Excel și puteți utiliza UDF-ul din el. Dacă doriți să utilizați mai multe UDF-uri, scrieți codul în modulul add-in în editorul VBA și salvați-l.
Asta e tot pentru astăzi. Am acoperit diferite moduri de depanare a funcțiilor personalizate și am învățat cum să le folosim în registrul de lucru. Sperăm din tot sufletul că aceste îndrumări vă vor fi de folos. Dacă aveți întrebări, scrieți în comentariile la acest articol.