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. ΑίτημαΤέλος μεΛειτουργία εξόδουκατάληξη:ΤέλοςΛειτουργία Τέλους |