Οι χειριστές σφαλμάτων σάς επιτρέπουν να καθορίσετε τι συμβαίνει όταν παρουσιαστεί σφάλμα κατά την εκτέλεση του κώδικα μακροεντολής Excel. Οι χειριστές σφαλμάτων είναι γραμμές παρόμοιες με τις ακόλουθες:
On Error GoTo MyError
Χωρίς προγράμματα χειρισμού σφαλμάτων, οποιοδήποτε σφάλμα προκύψει στον κώδικά σας θα ζητήσει από το Excel να ενεργοποιήσει ένα λιγότερο χρήσιμο μήνυμα σφάλματος που συνήθως δεν θα μεταφέρει με σαφήνεια τι συνέβη. Ωστόσο, με τη βοήθεια των χειριστών σφαλμάτων, μπορείτε να επιλέξετε να αγνοήσετε το σφάλμα ή να εξέλθετε από τον κώδικα με χάρη με το δικό σας μήνυμα προς τον χρήστη.
Υπάρχουν τρεις τύποι δηλώσεων On Error:
-
On Error GoTo SomeLabel: Ο κωδικός μεταβαίνει στην καθορισμένη ετικέτα.
-
On Error Resume Next: Το σφάλμα αγνοείται και ο κωδικός συνεχίζεται.
-
Στο σφάλμα GoTo 0: Το VBA επαναφέρει την κανονική συμπεριφορά ελέγχου σφαλμάτων.
Σε σφάλμα GoTo SomeLabel
Μερικές φορές ένα σφάλμα στον κώδικά σας σημαίνει ότι πρέπει να βγείτε με χάρη από τη διαδικασία και να δώσετε στους χρήστες σας ένα σαφές μήνυμα. Σε αυτές τις περιπτώσεις, μπορείτε να χρησιμοποιήσετε τη δήλωση On Error GoTo για να πείτε στο Excel να μεταβεί σε μια συγκεκριμένη γραμμή κώδικα.
Για παράδειγμα, στο παρακάτω μικρό κομμάτι κώδικα, λέτε στο Excel να διαιρέσει την τιμή στο κελί A1 με την τιμή στο κελί A2 και, στη συνέχεια, να τοποθετήσει την απάντηση στο κελί A3. Ανετα. Τι μπορεί να πάει στραβά;
Sub Macro1()
Εύρος ("A3"). Τιμή = Εύρος ("A1"). Τιμή / Εύρος ("A2"). Τιμή
End Sub
Όπως αποδεικνύεται, δύο σημαντικά πράγματα μπορεί να πάνε στραβά. Εάν το κελί A2 περιέχει 0, εμφανίζεται ένα σφάλμα διαίρεσης με 0. Εάν το κελί A2 περιέχει μια μη αριθμητική τιμή, λαμβάνετε ένα σφάλμα αναντιστοιχίας τύπου.
Για να αποφύγετε ένα δυσάρεστο μήνυμα σφάλματος, μπορείτε να πείτε στο Excel ότι On Error, θέλετε η εκτέλεση του κώδικα να μεταβεί στην ετικέτα που ονομάζεται MyExit.
Στον παρακάτω κώδικα, η ετικέτα MyExit ακολουθείται από ένα μήνυμα προς τον χρήστη που δίνει φιλικές συμβουλές αντί για ένα δυσάρεστο μήνυμα σφάλματος. Σημειώστε επίσης τη γραμμή Exit Sub πριν από την ετικέτα MyExit, η οποία διασφαλίζει ότι ο κωδικός θα βγει απλώς εάν δεν παρουσιαστεί σφάλμα:
Sub Macro1()
Σε σφάλμα Μετάβαση στο MyExit
Εύρος ("A3"). Τιμή = Εύρος ("A1"). Τιμή / Εύρος ("A2"). Τιμή
Έξοδος υπο
MyExit:
MsgBox "Παρακαλώ χρησιμοποιήστε έγκυρους μη μηδενικούς αριθμούς"
End Sub
Σφάλμα Συνέχιση Επόμενο
Μερικές φορές, θέλετε το Excel να αγνοήσει ένα σφάλμα και απλώς να συνεχίσει να εκτελεί τον κώδικα. Σε αυτές τις περιπτώσεις, μπορείτε να χρησιμοποιήσετε τη δήλωση On Error Resume Next.
Για παράδειγμα, το ακόλουθο κομμάτι κώδικα προορίζεται για τη διαγραφή ενός αρχείου που ονομάζεται GhostFile.exe από τον κατάλογο C:Temp. Μετά τη διαγραφή του αρχείου, ένα ωραίο πλαίσιο μηνύματος λέει στον χρήστη ότι το αρχείο έχει φύγει:
Sub Macro1()
Σκοτώστε το "C:TempGhostFile.exe"
MsgBox "Το αρχείο έχει διαγραφεί."
End Sub
Ο κώδικας λειτουργεί άψογα εάν υπάρχει πράγματι ένα αρχείο προς διαγραφή. Αλλά εάν για κάποιο λόγο το αρχείο που ονομάζεται GhostFile.exe δεν υπάρχει στη μονάδα δίσκου C:Temp, παρουσιάζεται ένα σφάλμα.
Σε αυτήν την περίπτωση, δεν σε νοιάζει αν το αρχείο δεν είναι εκεί γιατί θα το διαγράψεις ούτως ή άλλως. Έτσι, μπορείτε απλά να αγνοήσετε το σφάλμα και να προχωρήσετε με τον κώδικα.
Χρησιμοποιώντας τη δήλωση On Error Resume Next, ο κώδικας εκτελεί την πορεία του είτε υπάρχει είτε όχι το στοχευμένο αρχείο:
Sub Macro1()
Σφάλμα Συνέχιση Επόμενο
Σκοτώστε το "C:TempGhostFile.exe"
MsgBox "Το αρχείο έχει διαγραφεί."
End Sub
Στο Σφάλμα Μετάβαση στο 0
Όταν χρησιμοποιείτε ορισμένες δηλώσεις σφάλματος, μπορεί να είναι απαραίτητο να επαναφέρετε τη συμπεριφορά ελέγχου σφαλμάτων του VBA. Για να καταλάβετε τι σημαίνει αυτό, ρίξτε μια ματιά στο επόμενο παράδειγμα.
Εδώ, θέλετε πρώτα να διαγράψετε ένα αρχείο που ονομάζεται GhostFile.exe από τον κατάλογο C:Temp. Για να αποφύγετε σφάλματα που μπορεί να προέρχονται από το γεγονός ότι το στοχευμένο αρχείο δεν υπάρχει, χρησιμοποιείτε τη δήλωση On Error Resume Next. Μετά από αυτό, προσπαθείτε να κάνετε κάποια ύποπτα μαθηματικά διαιρώντας 100/Mike:
Sub Macro1()
Σφάλμα Συνέχιση Επόμενο
Σκοτώστε το "C:TempGhostFile.exe"
Εύρος ("A3"). Τιμή = 100 / "Mike"
End Sub
Η εκτέλεση αυτού του κομματιού κώδικα θα πρέπει να δημιουργήσει ένα σφάλμα λόγω των ασαφών μαθηματικών, αλλά δεν συμβαίνει. Γιατί; Επειδή η τελευταία εντολή που δώσατε στον κωδικό ήταν On Error Resume Next. Οποιοδήποτε σφάλμα παρουσιαστεί μετά από αυτήν τη γραμμή ουσιαστικά αγνοείται.
Για να διορθώσετε αυτό το πρόβλημα, μπορείτε να χρησιμοποιήσετε τη δήλωση On Error GoTo 0 για να συνεχίσετε την κανονική συμπεριφορά ελέγχου σφαλμάτων:
Sub Macro1()
Σφάλμα Συνέχιση Επόμενο
Σκοτώστε το "C:TempGhostFile.exe"
Στο Σφάλμα Μετάβαση στο 0
Εύρος ("A3"). Τιμή = 100 / "Mike"
End Sub
Αυτός ο κωδικός θα αγνοήσει τα σφάλματα μέχρι τη δήλωση On Error GoTo 0. Μετά από αυτήν τη δήλωση, ο κώδικας επιστρέφει στον κανονικό έλεγχο σφαλμάτων και ενεργοποιεί το αναμενόμενο σφάλμα που προκύπτει από τα ασαφή μαθηματικά.