VBA On Error - Error Handling Best Practices

VBA Error Cheat Sheet

Σφάλματα

ΠεριγραφήΚωδικός VBAOn Error - Διακοπή κωδικού και σφάλμα εμφάνισηςΣτο Error Goto 0On Error - Παραλείψτε το σφάλμα και συνεχίστε να τρέχετεΣτο Σφάλμα Συνέχιση ΕπόμενοΣφάλμα - Μεταβείτε σε μια γραμμή κώδικα [Ετικέτα]On Error Goto [Ετικέτα]Διαγράφει (Επαναφέρει) ΣφάλμαΣφάλμα GoTo -1Εμφάνιση αριθμού σφάλματοςMsgBox Err.NumberΕμφάνιση περιγραφής σφάλματοςMsgBox Err.DescriptionΛειτουργία για τη δημιουργία του ίδιου σφάλματοςErr.Raise

Δείτε περισσότερα VBA "Cheat Sheets" και δωρεάν λήψεις PDF

Διαχείριση σφαλμάτων VBA

Διαχείριση σφαλμάτων VBA αναφέρεται στη διαδικασία πρόβλεψης, εντοπισμού και επίλυσης σφαλμάτων χρόνου εκτέλεσης VBA. Η διαδικασία χειρισμού σφαλμάτων VBA εμφανίζεται κατά την εγγραφή κώδικα, πριν από τυχόν σφάλματα.

Σφάλματα χρόνου εκτέλεσης VBA είναι σφάλματα που συμβαίνουν κατά την εκτέλεση κώδικα. Παραδείγματα σφαλμάτων χρόνου εκτέλεσης περιλαμβάνουν:

  • Αναφορά σε ανύπαρκτο βιβλίο εργασίας, φύλλο εργασίας ή άλλο αντικείμενο
  • Μη έγκυρα δεδομένα π.χ. αναφορά σε κελί Excel που περιέχει σφάλμα
  • Προσπάθεια διαίρεσης με το μηδέν

VBA On Error Statement

Ο περισσότερος χειρισμός σφαλμάτων VBA γίνεται με το Σχετικά με τη δήλωση σφάλματοςΤο Η δήλωση On Error λέει στη VBA τι να κάνει εάν αντιμετωπίσει σφάλμα. Υπάρχουν τρία Στις δηλώσεις σφαλμάτων:

  • Σφάλμα GoTo 0
  • Στο Σφάλμα Συνέχιση Επόμενο
  • Σφάλμα GoTo Γραμμή

Σφάλμα GoTo 0

Σφάλμα GoTo 0 είναι η προεπιλεγμένη ρύθμιση του VBA. Μπορείτε να επαναφέρετε αυτήν την προεπιλεγμένη ρύθμιση προσθέτοντας την ακόλουθη γραμμή κώδικα:

1 Σφάλμα GoTo 0

Όταν παρουσιαστεί σφάλμα με Σφάλμα GoTo 0, Η VBA θα σταματήσει την εκτέλεση κώδικα και θα εμφανίσει το τυπικό πλαίσιο μηνύματος σφάλματος.

Συχνά προσθέτετε ένα Σφάλμα GoTo 0 μετά την προσθήκη Στο Σφάλμα Συνέχιση Επόμενο χειρισμός σφαλμάτων (επόμενη ενότητα):

123456789 Sub ErrorGoTo0 ()Στο Σφάλμα Συνέχιση ΕπόμενοActiveSheet.Shapes ("Start_Button"). ΔιαγραφήΣφάλμα GoTo 0«Εκτέλεση περισσότερου κώδικαΤέλος υπο

Στο Σφάλμα Συνέχιση Επόμενο

Στο Σφάλμα Συνέχιση Επόμενο λέει στο VBA να παραλείψει τυχόν γραμμές κώδικα που περιέχουν σφάλματα και να προχωρήσει στην επόμενη γραμμή.

1 Στο Σφάλμα Συνέχιση Επόμενο

Σημείωση: Στο Σφάλμα Συνέχιση Επόμενο δεν διορθώνει ένα σφάλμα ή το επιλύει με άλλο τρόπο. Απλώς λέει στο VBA να προχωρήσει σαν να μην υπάρχει η γραμμή κώδικα που περιέχει το σφάλμα. Ακατάλληλη χρήση του Στο Σφάλμα Συνέχιση Επόμενο μπορεί να οδηγήσει σε ακούσιες συνέπειες.

Υπέροχος χρόνος για χρήση Στο Σφάλμα Συνέχιση Επόμενο είναι όταν εργάζεστε με αντικείμενα που μπορεί να υπάρχουν ή να μην υπάρχουν. Για παράδειγμα, θέλετε να γράψετε κάποιον κώδικα που θα διαγράψει ένα σχήμα, αλλά εάν εκτελέσετε τον κώδικα όταν το σχήμα έχει ήδη διαγραφεί, το VBA θα εμφανίσει σφάλμα. Αντ 'αυτού μπορείτε να χρησιμοποιήσετε Στο Σφάλμα Συνέχιση Επόμενο για να πείτε στη VBA να διαγράψει το σχήμα εάν υπάρχει.

123 Στο Σφάλμα Συνέχιση ΕπόμενοActiveSheet.Shapes ("Start_Button"). ΔιαγραφήΣφάλμα GoTo 0

Σημειώστε ότι προσθέσαμε Σφάλμα GoTo 0 μετά τη γραμμή κώδικα που περιέχει το πιθανό σφάλμα. Αυτό επαναφέρει τον χειρισμό σφαλμάτων.

Στην επόμενη ενότητα θα σας δείξουμε πώς μπορείτε να ελέγξετε εάν προέκυψε σφάλμα κατά τη χρήση Err.Number, δίνοντάς σας πιο προηγμένες επιλογές χειρισμού σφαλμάτων…

Err.Number, Err.Clear, and Catching Errors

Αντί να παραλείψουμε απλώς μια γραμμή που περιέχει σφάλμα, μπορούμε να εντοπίσουμε το σφάλμα χρησιμοποιώντας Στο Σφάλμα Συνέχιση Επόμενο και Err.Number.

Err.Number επιστρέφει έναν αριθμό σφάλματος που αντιστοιχεί στον τύπο του σφάλματος που εντοπίστηκε. Εάν δεν υπάρχει σφάλμα, Err.Number = 0.

Για παράδειγμα, αυτή η διαδικασία θα επιστρέψει "11" επειδή το σφάλμα που προκύπτει είναι Σφάλμα χρόνου εκτέλεσης '11'.

1234567 Sub ErrorNumber_ex ()Στο Σφάλμα Συνέχιση ΕπόμενοActiveCell.Value = 2 /0MsgBox Err.NumberΤέλος υπο

Σφάλμα χειρισμού με Err.Number

Η πραγματική δύναμη του Err.Number έγκειται στη δυνατότητα ανίχνευσης εάν προέκυψε σφάλμα (Err.Number 0). Στο παρακάτω παράδειγμα, δημιουργήσαμε μια συνάρτηση που θα ελέγξει εάν υπάρχει ένα φύλλο χρησιμοποιώντας το Err.Number.

12345678910111213141516171819 Sub TestWS ()MsgBox DoesWSExist ("δοκιμή")Τέλος υποΛειτουργία doesWSExist (wsName As String) As BooleanDim ws Ως φύλλο εργασίαςΣτο Σφάλμα Συνέχιση ΕπόμενοΟρισμός ws = Φύλλα (wsName)"Εάν το σφάλμα WS δεν υπάρχειΕάν Err.Number 0 ΤότεDoesWSExist = ΛάθοςΑλλούDoesWSExist = ΑληθινόΤέλος εανΣφάλμα GoTo -1Λειτουργία Τέλους

Σημείωση: Προσθέσαμε ένα Σφάλμα GoTo -1 μέχρι το τέλος που επαναφέρει το Err.Number στο 0 (δείτε δύο ενότητες κάτω).

Με Στο Σφάλμα Συνέχιση Επόμενο και Err.Number, μπορείτε να αντιγράψετε το "Προσπάθησε να πιάσεις" λειτουργικότητα άλλων γλωσσών προγραμματισμού.

Σφάλμα GoTo Γραμμή

Σφάλμα GoTo Γραμμή λέει στο VBA να "μεταβεί" σε μια γραμμή κώδικα με ετικέτα όταν παρουσιαστεί σφάλμα. Δηλώνετε τη δήλωση Μετάβαση στο εξής (όπου errHandler είναι η ετικέτα γραμμής για να μεταβείτε):

1 On Error GoTo errHandler

και δημιουργήστε μια ετικέτα γραμμής όπως αυτή:

1 errHandler:

Σημείωση: Αυτή είναι η ίδια ετικέτα που θα χρησιμοποιούσατε με μια κανονική δήλωση VBA GoTo.

Παρακάτω θα δείξουμε τη χρήση Σφάλμα GoTo Γραμμή για έξοδο από μια διαδικασία.

Στο Error Exit Sub

Μπορείτε να χρησιμοποιήσετε το On Error GoTo Line για έξοδο από ένα δευτερεύον όταν προκύψει σφάλμα.

Μπορείτε να το κάνετε αυτό τοποθετώντας την ετικέτα γραμμής χειριστή σφαλμάτων στο τέλος της διαδικασίας σας:

12345678 Sub ErrGoToEnd ()Σφάλμα GoTo endProc«Κάποιος κώδικαςendProc:Τέλος υπο

ή χρησιμοποιώντας την εντολή Exit Sub:

123456789101112131415 Sub ErrGoToEnd ()Σφάλμα GoTo endProc«Κάποιος κώδικαςGoTo skipExitendProc:Έξοδος Subπαράλειψη Έξοδος:«Λίγο περισσότερο κώδικαΤέλος υπο

Err.Clear, On Error GoTo -1 και Resetting Err.Number

Μετά το χειρισμό ενός σφάλματος, θα πρέπει γενικά να διαγράψετε το σφάλμα για να αποφύγετε μελλοντικά προβλήματα με τον χειρισμό σφαλμάτων.

Μετά την εμφάνιση ενός σφάλματος, και τα δυο Err.Clear και Σφάλμα GoTo -1 μπορεί να χρησιμοποιηθεί για επαναφορά Err.Number στο 0. Αλλά υπάρχει μια πολύ σημαντική διαφορά: Err.Clear δεν επαναφέρει το ίδιο το πραγματικό σφάλμα, αλλά επαναφέρει μόνο το Err.Number.

Τι σημαίνει αυτό? ΧρησιμοποιώνταςErr.Clear, δεν θα μπορείτε να αλλάξετε τη ρύθμιση χειρισμού σφαλμάτων. Για να δείτε τη διαφορά, δοκιμάστε αυτόν τον κωδικό και αντικαταστήστε τον Σφάλμα GoTo -1 με Err.Clear:

123456789101112131415161718192021 Υπο ErrΠαράδειγμα ()Στο Error GoTo errHandler:Σφάλμα "Ορίζεται από την εφαρμογή"Σφάλμα (13)Έξοδος SuberrHandler:'Εκκαθάριση σφάλματοςΣφάλμα GoTo -1Στο Error GoTo errHandler2:Σφάλμα "Ασυμφωνία τύπου"Σφάλμα (1034)Έξοδος SuberrHandler2:Debug.Print Err.DescriptionΤέλος υπο

Συνήθως, συνιστώ να χρησιμοποιείτε πάντα Σφάλμα GoTo -1, εκτός αν έχετε καλό λόγο χρήσης Err.Clear αντι αυτου.

VBA Σε σφάλμα MsgBox

Μπορεί επίσης να θέλετε να εμφανίσετε ένα πλαίσιο μηνυμάτων για σφάλμα. Αυτό το παράδειγμα θα εμφανίσει διαφορετικά πλαίσια μηνυμάτων ανάλογα με το πού εμφανίζεται το σφάλμα:

12345678910111213141516171819202122232425262728 Sub ErrorMessageEx ()Dim errMsg As StringOn Error GoTo errHandler'Στάδιο 1errMsg = "Παρουσιάστηκε σφάλμα κατά τη φάση Αντιγραφή & Επικόλληση."'Err.Raise (11)«Στάδιο 2errMsg = "Παρουσιάστηκε σφάλμα κατά τη διάρκεια του σταδίου επικύρωσης δεδομένων."'Err.Raise (11)«Στάδιο 3errMsg = "Παρουσιάστηκε σφάλμα κατά το στάδιο P & L-Building και Copy-Over."Err.Raise (11)«Στάδιο 4errMsg = "Παρουσιάστηκε σφάλμα κατά την προσπάθεια καταγραφής της εισαγωγής στη σελίδα εγκατάστασης"'Err.Raise (11)GoTo endProcerrHandler:MsgBox errMsgendProc:Τέλος υπο

Εδώ θα αντικαταστήσετε το Err.Raise (11) με τον πραγματικό σας κωδικό.

VBA IsError

Ένας άλλος τρόπος για να χειριστείτε τα σφάλματα είναι να τα δοκιμάσετε με τη λειτουργία VBA IsError. Η συνάρτηση IsError ελέγχει μια έκφραση για σφάλματα, επιστρέφοντας TRUE ή FALSE εάν παρουσιαστεί σφάλμα.

123 Sub IsErrorEx ()MsgBox IsError (Εύρος ("a7". Τιμή)Τέλος υπο

Αν Σφάλμα VBA

Μπορείτε επίσης να χειριστείτε σφάλματα στο VBA με τη συνάρτηση Excel IfError. Η συνάρτηση IfError πρέπει να έχει πρόσβαση χρησιμοποιώντας το Φύλλο εργασίας Τάξη λειτουργιών:

1234567 Sub IfErrorEx ()Dim n As Longn = WorksheetFunction.IfError (Εύρος ("a10"). Τιμή, 0)MsgBox nΤέλος υπο

Αυτό θα εξάγει την τιμή του εύρους A10, αν η τιμή είναι σφάλμα, θα βγάλει 0 αντ 'αυτού.

Τύποι σφαλμάτων VBA

Σφάλματα χρόνου εκτέλεσης

Οπως δηλώθηκε παραπάνω:

Σφάλματα χρόνου εκτέλεσης VBA είναι σφάλματα που συμβαίνουν κατά την εκτέλεση κώδικα. Παραδείγματα σφαλμάτων χρόνου εκτέλεσης περιλαμβάνουν:

  • Αναφορά σε ανύπαρκτο βιβλίο εργασίας, φύλλο εργασίας ή άλλο αντικείμενο
  • Μη έγκυρα δεδομένα π.χ. αναφορά σε κελί Excel που περιέχει σφάλμα
  • Προσπάθεια διαίρεσης με το μηδέν

Μπορείτε να "χειριστείτε σφάλματα" σφάλματα χρόνου εκτέλεσης χρησιμοποιώντας τις μεθόδους που συζητήθηκαν παραπάνω.

Σφάλματα σύνταξης

Σφάλματα σύνταξης VBA είναι λάθη κατά την εγγραφή κώδικα. Παραδείγματα συντακτικών σφαλμάτων περιλαμβάνουν:

  • Λάθος ορθογραφίας
  • Λείπει ή είναι εσφαλμένη η στίξη

Ο επεξεργαστής VBA προσδιορίζει πολλά σφάλματα σύνταξης με κόκκινη επισήμανση:

Ο VBA Editor έχει επίσης μια επιλογή "Auto Syntax Check":

Όταν αυτό είναι επιλεγμένο, ο επεξεργαστής VBA θα δημιουργήσει ένα πλαίσιο μηνυμάτων που θα σας ειδοποιεί για σφάλματα σύνταξης αφού εισαγάγετε μια γραμμή κώδικα:

Προσωπικά το βρίσκω αυτό εξαιρετικά ενοχλητικό και απενεργοποιώ τη λειτουργία.

Μεταγλώττιση Σφάλματα

Πριν επιχειρήσετε να εκτελέσετε μια διαδικασία, το VBA θα "μεταγλωττίσει" τη διαδικασία. Η μεταγλώττιση μετατρέπει το πρόγραμμα από πηγαίο κώδικα (που μπορείτε να δείτε) σε εκτελέσιμη μορφή (δεν μπορείτε να δείτε).

Σφάλματα μεταγλώττισης VBA είναι σφάλματα που εμποδίζουν τη σύνταξη του κώδικα.

Ένα καλό παράδειγμα σφάλματος μεταγλώττισης είναι η δήλωση μεταβλητής που λείπει:

Άλλα παραδείγματα περιλαμβάνουν:

  • Για χωρίς Επόμενο
  • Επιλέγω χωρίς Τέλος Επιλογή
  • Αν χωρίς Τέλος εαν
  • Κλήση α διαδικασία δεν υπάρχει αυτό

Τα Σφάλματα σύνταξης (προηγούμενη ενότητα) είναι ένα υποσύνολο Σφάλματα μεταγλώττισης.

Εντοπισμός σφαλμάτων> Μεταγλώττιση

Τα σφάλματα μεταγλώττισης θα εμφανιστούν όταν επιχειρήσετε να εκτελέσετε μια Διαδικασία. Ιδανικά, θα εντοπίζατε σφάλματα μεταγλώττισης πριν επιχειρήσετε να εκτελέσετε τη διαδικασία.

Μπορείτε να το κάνετε συγκεντρώνοντας το έργο εκ των προτέρων. Για να το κάνετε αυτό, μεταβείτε στο Debug> Compile Project VBA.

Ο μεταγλωττιστής θα "μεταβεί" στο πρώτο σφάλμα. Μόλις διορθώσετε αυτό το σφάλμα, μεταγλωττίστε ξανά το έργο. Επαναλάβετε μέχρι να διορθωθούν όλα τα σφάλματα.

Μπορείτε να πείτε ότι όλα τα σφάλματα έχουν διορθωθεί επειδή Μεταγλώττιση VBA Project θα γκριζαριστεί:

Σφάλμα OverFlow

ο Σφάλμα υπερφόρτωσης VBA συμβαίνει όταν προσπαθείτε να βάλετε μια τιμή σε μια μεταβλητή που είναι πολύ μεγάλη. Για παράδειγμα, Ακέραιες μεταβλητές μπορεί να περιέχει τιμές μεταξύ -32,768 έως 32,768. Εάν εισαγάγετε μεγαλύτερη τιμή, θα λάβετε σφάλμα υπερχείλισης:

Αντ 'αυτού, θα πρέπει να χρησιμοποιήσετε το Μακρά μεταβλητή για να αποθηκεύσετε τον μεγαλύτερο αριθμό.

Άλλοι όροι σφάλματος VBA

Σφάλμα σύλληψης VBA

Σε αντίθεση με άλλες γλώσσες προγραμματισμού, στο VBA δεν υπάρχει Δήλωση αλιευμάτωνΤο Ωστόσο, μπορείτε να αντιγράψετε μια δήλωση αλιευμάτων χρησιμοποιώντας Στο Σφάλμα Συνέχιση Επόμενο και Εάν Err.Number 0 ΤότεΤο Αυτό καλύπτεται παραπάνω στο Error Handling with Err.Number.

Σφάλμα παράβλεψης VBA

Για να αγνοήσετε σφάλματα στο VBA, χρησιμοποιήστε απλά το Στο Σφάλμα Συνέχιση Επόμενο δήλωση:

1 Στο Σφάλμα Συνέχιση Επόμενο

Ωστόσο, όπως αναφέρθηκε παραπάνω, θα πρέπει να είστε προσεκτικοί χρησιμοποιώντας αυτήν τη δήλωση, καθώς δεν διορθώνει ένα σφάλμα, απλώς αγνοεί τη γραμμή κώδικα που περιέχει το σφάλμα.

Σφάλμα ρίψης VBA / Err.Raise

Για να αντιμετωπίσετε ένα σφάλμα στο VBA, χρησιμοποιείτε το Err.Raise μέθοδος.

Αυτή η γραμμή κώδικα θα αυξήσει το σφάλμα χρόνου εκτέλεσης '13': Ασυμφωνία τύπου:

1 Err.Raise (13)

VBA Error Trapping

VBA Error Trapping είναι απλώς ένας άλλος όρος για το VBA Error Handling.

Μήνυμα λάθους VBA

ΕΝΑ Μήνυμα λάθους VBA μοιάζει με αυτό:

Όταν κάνετε κλικ στην επιλογή "Εντοπισμός σφαλμάτων", θα δείτε τη γραμμή κώδικα που ρίχνει το σφάλμα:

VBA Error Handling in a Loop

Ο καλύτερος τρόπος για χειρισμό σφαλμάτων εντός ενός βρόχου είναι με τη χρήση Στο Σφάλμα Συνέχιση Επόμενο μαζί με Err.Number για να εντοπίσετε εάν έχει συμβεί σφάλμα (Θυμηθείτε να το χρησιμοποιήσετε Err.Clear για να διαγράψετε το σφάλμα μετά από κάθε εμφάνιση).

Το παρακάτω παράδειγμα θα διαιρέσει δύο αριθμούς (στήλη Α με στήλη Β) και θα εξάγει το αποτέλεσμα στη στήλη C. Εάν υπάρχει σφάλμα, το αποτέλεσμα θα είναι 0.

12345678910111213141516 Υπο δοκιμή ()Dim cell As RangeΣτο Σφάλμα Συνέχιση ΕπόμενοΓια κάθε κελί εντός εμβέλειας ("a1: a10")«Ορισμός τιμής κυψέληςcell.Offset (0, 2). Value = cell.Value / cell.Offset (0, 1). Value"Εάν το Cell.Value είναι Σφάλμα, τότε Προεπιλογή σε 0Εάν Err.Number 0 Τότεκελί. Offset (0, 2). Αξία = 0Err.ClearΤέλος εανΕπόμενοΤέλος υπο

Χειρισμός σφαλμάτων VBA στην πρόσβαση

Όλα τα παραπάνω παραδείγματα λειτουργούν ακριβώς το ίδιο στην Access VBA όπως στο Excel VBA.

123456789101112131415161718 Λειτουργία DelRecord (frm ως φόρμα)Αυτή η συνάρτηση χρησιμοποιείται για τη διαγραφή μιας εγγραφής σε έναν πίνακα από μια φόρμαOn Error GoTo λήξηΜε frmΑν .NewRecord Τότε.ΞεκάνωΛειτουργία εξόδουΤέλος εανΤέλος μεΜε frm.RecordsetClone.Σελιδοδείκτης = frm. Σελιδοδείκτης.Διαγράφωfrm. ΑίτημαΤέλος μεΛειτουργία εξόδουκατάληξη:ΤέλοςΛειτουργία Τέλους

Θα βοηθήσει στην ανάπτυξη του τόπου, μοιράζονται τη σελίδα με τους φίλους σας

wave wave wave wave wave