Πίνακας περιεχομένων
Καθώς γνωρίζετε ήδη πώς να δημιουργείτε UDFs (και, ελπίζω, έχετε επίσης δοκιμάσει να τις εφαρμόσετε στο Excel σας), ας ψάξουμε λίγο βαθύτερα και ας δούμε τι μπορεί να γίνει σε περίπτωση που η συνάρτηση που ορίσατε από το χρήστη δεν λειτουργεί.
Για να λύσετε κάποια προβλήματα κατά τη δημιουργία μιας προσαρμοσμένης συνάρτησης, πιθανότατα θα χρειαστεί να εκτελέσετε μια αποσφαλμάτωση. Τότε μπορείτε να είστε σίγουροι ότι η συνάρτηση λειτουργεί σωστά.
Θα εξερευνήσουμε τις ακόλουθες τεχνικές εντοπισμού σφαλμάτων:
Όταν δημιουργείτε μια προσαρμοσμένη συνάρτηση, υπάρχει πάντα η πιθανότητα να κάνετε κάποιο λάθος. Οι προσαρμοσμένες συναρτήσεις είναι συνήθως αρκετά πολύπλοκες. Και δεν αρχίζουν πάντα να λειτουργούν σωστά αμέσως. Ο τύπος μπορεί να επιστρέψει ένα λανθασμένο αποτέλεσμα ή το σφάλμα #VALUE! Σε αντίθεση με τις τυπικές συναρτήσεις του Excel, δεν θα δείτε άλλα μηνύματα.
Υπάρχει τρόπος να περάσετε βήμα προς βήμα από μια προσαρμοσμένη συνάρτηση για να ελέγξετε πώς λειτουργεί κάθε εντολή της; Φυσικά! Η αποσφαλμάτωση χρησιμοποιείται για αυτό το σκοπό.
Θα σας προτείνω διάφορους τρόπους για να κάνετε αποσφαλμάτωση της προσαρμοσμένης συνάρτησης, ώστε να επιλέξετε αυτόν που σας εξυπηρετεί.
Ως παράδειγμα, χρησιμοποιούμε την προσαρμοσμένη συνάρτηση GetMaxBetween από ένα από τα προηγούμενα άρθρα μας, το οποίο υπολογίζει τον μέγιστο αριθμό στο καθορισμένο εύρος τιμών:
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 FunctionΤα ορίσματα της συνάρτησης είναι το εύρος των κελιών όπου γράφονται οι αριθμοί, καθώς και το άνω και το κάτω όριο των τιμών.
Τοποθετήστε τη συνάρτηση MsgBox σε σημαντικά σημεία
Για να παρακολουθείτε την εκτέλεση των υπολογισμών, μπορείτε να εμφανίζετε τις τιμές των πιο σημαντικών μεταβλητών στην οθόνη στα κατάλληλα σημεία. Αυτό μπορεί να γίνει με τη χρήση αναδυόμενων πλαισίων διαλόγου.
MsgBox είναι ένα παράθυρο διαλόγου που μπορείτε να χρησιμοποιήσετε για να εμφανίσετε κάποιο μήνυμα στο χρήστη.
Η σύνταξη της MsgBox είναι παρόμοια με άλλες συναρτήσεις της VBA:
MsgBox(prompt [, buttons] [, title] [, helpfile, context])prompt είναι ένα υποχρεωτικό όρισμα. Περιέχει το μήνυμα που βλέπετε στο παράθυρο διαλόγου. Μπορεί επίσης να χρησιμοποιηθεί για την εμφάνιση των τιμών μεμονωμένων μεταβλητών.
Όλα τα άλλα ορίσματα είναι προαιρετικά.
[ κουμπιά ] - καθορίζει ποια κουμπιά και εικονίδια εμφανίζονται στο MsgBox Για παράδειγμα, αν χρησιμοποιήσουμε την επιλογή vbOkOnly , τότε μόνο το OK Ακόμα και αν παραλείψατε αυτό το επιχείρημα, αυτό το κουμπί χρησιμοποιείται από προεπιλογή.
[ τίτλος ] - εδώ μπορείτε να καθορίσετε τον τίτλο του πλαισίου μηνυμάτων.
Ας περάσουμε από τις λέξεις στην πράξη και ας ξεκινήσουμε την αποσφαλμάτωση. Για να εμφανίσετε το μήνυμα, προσθέστε την ακόλουθη γραμμή στον κώδικα του GetMaxBetween συνάρτηση που ορίζεται από το χρήστη πριν από την Περίπτωση άλλο χειριστή:
Το αποτέλεσμα θα είναι το εξής:
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 FunctionΧρησιμοποιώντας το vMax μεταβλητή στο παράθυρο διαλόγου, θα δούμε ποιοι αριθμοί πληρούν τα κριτήρια επιλογής, ώστε να επιλέξουμε τον μεγαλύτερο από αυτούς. Με την έκφραση "Count -" & I στη γραμμή τίτλου, δηλώνουμε πόσους αριθμούς έχουμε ήδη επιλέξει για τον προσδιορισμό της μέγιστης τιμής. Ο μετρητής θα αυξάνεται με κάθε νέα τιμή.
Μόλις ορίσουμε το UDF, εφαρμόζουμε τον παρακάτω τύπο στο εύρος ημερομηνιών:
= GetMaxBetween (A1:A6,10,50)
Αφού πατήσετε το κουμπί Enter, θα εμφανιστεί ένα μήνυμα όπως στο παρακάτω στιγμιότυπο:
Αυτός είναι ο πρώτος αριθμός στην περιοχή Α1: Α6 που πληροί τα κριτήρια: μεγαλύτερος από 10 αλλά μικρότερος από 50.
Αφού κάνετε κλικ στο OK, εμφανίζεται ένα δεύτερο μήνυμα με τον αριθμό 14. Οι υπόλοιποι αριθμοί δεν ταιριάζουν με τα κριτήρια επιλογής. Επομένως, η συνάρτηση εξέρχεται και επιστρέφει τη μεγαλύτερη από τις δύο τιμές, 17.
Το MsgBox μπορεί να χρησιμοποιηθεί στα πιο σημαντικά σημεία της προσαρμοσμένης συνάρτησής σας για να ελέγξετε τον τρόπο με τον οποίο αλλάζουν οι τιμές των μεμονωμένων μεταβλητών. Τα πλαίσια μηνυμάτων μπορεί να είναι πολύ χρήσιμα όταν έχετε μια μεγάλη συνάρτηση και πολλούς υπολογισμούς. Σε αυτή την περίπτωση, θα σας είναι εύκολο να προσδιορίσετε σε ποιο σημείο του κώδικα εμφανίζεται το σφάλμα.
Καθορισμός σημείων στάσης και εκτέλεση βήμα προς βήμα
Μπορείτε να προσθέσετε σημεία διακοπής στον κώδικα της συνάρτησής σας, όπου θα σταματήσει η εκτέλεση του κώδικα. Έτσι μπορείτε να παρακολουθείτε τη διαδικασία υπολογισμού βήμα προς βήμα. Με αυτόν τον τρόπο, μπορείτε να δείτε πώς αλλάζουν οι τιμές των μεταβλητών.
Για να προσθέσετε ένα σημείο διακοπής, τοποθετήστε τον κέρσορα στη γραμμή που περιέχει τη δήλωση στην οποία θέλετε να κάνετε παύση. Στη συνέχεια, κάντε δεξί κλικ και επιλέξτε Debug -> Εναλλαγή σημείου διακοπής ή απλά πατήστε F9 . Μπορείτε επίσης να κάνετε κλικ στο επιθυμητό σημείο στην κατακόρυφη γκρίζα περιοχή στα αριστερά του κωδικού λειτουργίας.
Θα εμφανιστεί ένας κόκκινος κύκλος, όπως μπορείτε να δείτε στο παρακάτω στιγμιότυπο οθόνης. Η γραμμή κώδικα όπου θα σταματήσει ο υπολογισμός επισημαίνεται με κόκκινο χρώμα.
Τώρα, το παράθυρο του επεξεργαστή VBA θα ανοίξει όταν εκτελείται η συνάρτηση. Ο δρομέας θα τοποθετηθεί στο σημείο όπου σταματήσατε.
Αν τοποθετήσετε τον κέρσορα του ποντικιού σας πάνω σε κάποια από τις μεταβλητές στον κώδικα της συνάρτησης, μπορείτε να δείτε την τρέχουσα τιμή της:
Πατήστε F5 για να συνεχίσετε τον υπολογισμό.
Σημείωση. Μετά το σημείο διακοπής, μπορείτε να αρχίσετε να παρακολουθείτε βήμα προς βήμα την πρόοδο των υπολογισμών. Εάν πατήσετε το κουμπί F8, θα εκτελεστεί μόνο μια επόμενη γραμμή του κώδικα VBA. Η κίτρινη γραμμή με το βέλος θα μετακινηθεί επίσης στην τελευταία θέση του κώδικα που εκτελέστηκε.
Δεδομένου ότι η εκτέλεση της συνάρτησης διακόπτεται και πάλι, μπορείτε να δείτε τις τρέχουσες τιμές όλων των μεταβλητών της συνάρτησης χρησιμοποιώντας τον κέρσορα του ποντικιού.
Το επόμενο πάτημα του F8 θα μας πάει ένα βήμα μπροστά. Έτσι, μπορείτε να πατήσετε το F8 μέχρι το τέλος του υπολογισμού. Ή να πατήσετε το F5 για να συνεχίσετε τον υπολογισμό μέχρι το επόμενο σημείο διακοπής.
Εάν προκύψει σφάλμα, ο δρομέας θα σταματήσει στο σημείο του κώδικα όπου εμφανίστηκε το σφάλμα. Και θα εμφανιστεί επίσης ένα αναδυόμενο μήνυμα σφάλματος. Αυτό διευκολύνει τον προσδιορισμό της αιτίας του προβλήματος.
Τα σημεία διακοπής που καθορίζετε θα εφαρμοστούν μέχρι να κλείσετε το αρχείο. Όταν το ανοίξετε ξανά, θα πρέπει να τα ορίσετε ξανά. Δεν είναι η πιο βολική μέθοδος, δεν νομίζετε;
Ωστόσο, αυτό το πρόβλημα μπορεί να λυθεί. Σταματήστε το δήλωση στον κώδικα της συνάρτησης στα απαραίτητα σημεία, και μπορείτε να σταματήσετε την εκτέλεση του προγράμματος με τον ίδιο τρόπο όπως όταν χρησιμοποιείτε σημεία διακοπής.
Όταν η VBA συναντά ένα Σταματήστε το θα σταματήσει την εκτέλεση του προγράμματος και θα περιμένει την ενέργειά σας. Ελέγξτε τις τιμές των μεταβλητών και, στη συνέχεια, πατήστε F5 για να συνεχίσετε.
Ή πατήστε F8 για να εκτελέσετε τη λειτουργία βήμα προς βήμα όπως περιγράφεται παραπάνω.
Το Σταματήστε το δήλωση είναι μέρος του προγράμματος και επομένως δεν διαγράφεται, όπως συμβαίνει με ένα σημείο διακοπής. Όταν τελειώσετε με την αποσφαλμάτωση, αφαιρέστε το μόνοι σας. Ή μετατρέψτε το σε σχόλιο, προτάσσοντάς του ένα απλό εισαγωγικό (').
Αποσφαλμάτωση με χρήση του τελεστή Debug.Print
Μπορείτε να τοποθετήσετε το Debug.Print στον κώδικα της συνάρτησης στη σωστή θέση. Αυτό είναι χρήσιμο για τον έλεγχο των τιμών των μεταβλητών που αλλάζουν κυκλικά.
Μπορείτε να δείτε ένα παράδειγμα της απόδοσης του Debug.Print στο παρακάτω στιγμιότυπο οθόνης.
Δήλωση Debug.Print i, vMax εκτυπώνει τις τιμές και τους αριθμούς τους.
Στο παράθυρο Immediate βλέπουμε δύο αριθμούς (17 και 14) από το επιλεγμένο εύρος, το οποίο αντιστοιχεί στα όρια που έχουν τεθεί και μεταξύ των οποίων θα επιλεγεί το μέγιστο. Τα ψηφία 1 και 2 σημαίνουν ότι η συνάρτηση έχει ολοκληρώσει 2 κύκλους στους οποίους επιλέχθηκαν οι αριθμοί. Βλέπουμε τις τιμές των πιο σημαντικών μεταβλητών, όπως κάναμε νωρίτερα με το MsgBox Αλλά αυτό δεν σταμάτησε τη λειτουργία.
Κλήση μιας συνάρτησης από μια διαδικασία
Μπορείτε να καλέσετε μια συνάρτηση που έχει οριστεί από το χρήστη όχι από ένα κελί του φύλλου εργασίας, αλλά από μια διαδικασία. Σε αυτή την περίπτωση, όλα τα σφάλματα θα εμφανίζονται στο παράθυρο του Visual Basic Editor.
Ακολουθεί ο τρόπος με τον οποίο μπορείτε να καλέσετε την καθορισμένη από τον χρήστη συνάρτηση GetMaxBerween από μια διαδικασία:
Sub Test() Dim x x = GetMaxBetween(Range ("A1:A6" ), 10, 50) MsgBox(x) End SubΤοποθετήστε τον κέρσορα οπουδήποτε στον κώδικα και πατήστε F5 . Εάν δεν υπάρχει σφάλμα στη συνάρτηση, θα εμφανιστεί ένα αναδυόμενο παράθυρο με το αποτέλεσμα του υπολογισμού.
Σε περίπτωση σφάλματος, θα δείτε ένα αντίστοιχο μήνυμα στον επεξεργαστή VBA. Ο υπολογισμός θα σταματήσει και η γραμμή κώδικα στην οποία παρουσιάστηκε το σφάλμα θα επισημανθεί με κίτρινο χρώμα. Μπορείτε εύκολα να εντοπίσετε πού και γιατί παρουσιάστηκε το σφάλμα.
Αυτό ήταν όλο. Τώρα έχετε δημιουργήσει το δικό σας πρόσθετο, το προσθέσατε στο Excel και μπορείτε να χρησιμοποιήσετε το UDF σε αυτό. Αν θέλετε να χρησιμοποιήσετε περισσότερα UDF, απλώς γράψτε τον κώδικα στην ενότητα πρόσθετου στον επεξεργαστή VBA και αποθηκεύστε τον.
Αυτά για σήμερα. Καλύψαμε διάφορους τρόπους για την αποσφαλμάτωση προσαρμοσμένων συναρτήσεων και μάθαμε πώς να τις χρησιμοποιείτε στο βιβλίο εργασίας σας. Ελπίζουμε πραγματικά να βρείτε αυτές τις οδηγίες χρήσιμες. Αν έχετε ερωτήσεις, γράψτε στα σχόλια αυτού του άρθρου.