VBA - Ασυμφωνία τύπου (Σφάλμα χρόνου εκτέλεσης 13)

Τι είναι το Σφάλμα Αναντιστοιχίας Τύπου;

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

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

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

Εδώ είναι ένα παράδειγμα:

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

Στη συγκεκριμένη περίπτωση, η λύση είναι να αλλάξετε τη δήλωση Dim σε έναν τύπο μεταβλητής που λειτουργεί με την τιμή που αντιστοιχίζετε στη μεταβλητή. Ο κώδικας θα λειτουργήσει αν αλλάξετε τον τύπο της μεταβλητής σε "String" και πιθανότατα θα θέλατε να αλλάξετε και το όνομα της μεταβλητής.

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

Σφάλμα αναντιστοιχίας που προκαλείται από τον υπολογισμό του φύλλου εργασίας

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

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

Για παράδειγμα, ας υποθέσουμε ότι έχετε γράψει κώδικα για να λάβετε μια τιμή σε μια συγκεκριμένη θέση σε ένα φύλλο εργασίας και περιέχει άλλα κελιά που εξαρτώνται από τον υπολογισμό στο βιβλίο εργασίας (Β1 σε αυτό το παράδειγμα)

Το φύλλο εργασίας μοιάζει με αυτό το παράδειγμα, με έναν τύπο για να βρείτε έναν συγκεκριμένο χαρακτήρα μέσα σε μια συμβολοσειρά κειμένου

Από την πλευρά του χρήστη, το κελί A1 είναι δωρεάν μορφή και μπορεί να εισαγάγει οποιαδήποτε τιμή θέλει. Ωστόσο, ο τύπος αναζητά την εμφάνιση του χαρακτήρα "Β" και σε αυτήν την περίπτωση δεν βρίσκεται έτσι ώστε το κελί Β1 να έχει τιμή σφάλματος.

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

1234 Sub TestMismatch ()Dim MyNumber As IntegerMyNumber = Φύλλα ("Sheet1"). Εύρος ("B1"). ΤιμήΤέλος υπο

Η τιμή στο κελί Β1 έχει προκαλέσει σφάλμα επειδή ο χρήστης έχει εισαγάγει κείμενο στο κελί Α1 το οποίο δεν συμμορφώνεται με το αναμενόμενο και δεν περιέχει τον χαρακτήρα «Β»

Ο κώδικας προσπαθεί να εκχωρήσει την τιμή στη μεταβλητή «MyNumber», η οποία έχει οριστεί να περιμένει έναν ακέραιο, και έτσι λαμβάνετε ένα σφάλμα αναντιστοιχίας.

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

Το πρόβλημα είναι στην πραγματικότητα στο φύλλο εργασίας και ο τύπος στο Β1 πρέπει να αλλάξει έτσι ώστε να αντιμετωπιστούν οι τιμές σφάλματος. Μπορείτε να το κάνετε αυτό χρησιμοποιώντας τον τύπο ‘IFERROR’ για να δώσετε μια προεπιλεγμένη τιμή 0 αν δεν βρεθεί ο χαρακτήρας αναζήτησης

Στη συνέχεια, μπορείτε να ενσωματώσετε κώδικα για έλεγχο μηδενικής τιμής και για να εμφανίσετε ένα προειδοποιητικό μήνυμα στο χρήστη ότι η τιμή στο κελί Α1 δεν είναι έγκυρη

12345678 Sub TestMismatch ()Dim MyNumber As IntegerMyNumber = Φύλλα ("Sheet1"). Εύρος ("B1"). ΚείμενοΑν MyNumber = 0 ΤότεMsgBox "Η τιμή στο κελί Α1 δεν είναι έγκυρη", vbCriticalΈξοδος SubΤέλος εανΤέλος υπο

Μπορείτε επίσης να χρησιμοποιήσετε την επικύρωση δεδομένων (ομάδα εργαλείων δεδομένων στην καρτέλα Δεδομένα της κορδέλας) στο υπολογιστικό φύλλο για να σταματήσετε τον χρήστη να κάνει ό, τι του αρέσει και να προκαλεί σφάλματα φύλλου εργασίας. Επιτρέψτε τους να εισάγουν μόνο τιμές που δεν θα προκαλέσουν σφάλματα στο φύλλο εργασίας.

Μπορείτε να γράψετε κώδικα VBA με βάση το συμβάν Αλλαγή στο φύλλο εργασίας για να ελέγξετε τι έχει εισαχθεί.

Επίσης, το κλείδωμα και ο κωδικός πρόσβασης προστατεύουν το φύλλο εργασίας, έτσι ώστε να μην είναι δυνατή η εισαγωγή μη έγκυρων δεδομένων

Σφάλμα αναντιστοιχίας που προκαλείται από εισαγόμενες τιμές κελιού

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

Ο παρακάτω κώδικας δημιουργεί έναν απλό πίνακα που ονομάζεται «MyNumber» και ορίζεται με ακέραιες τιμές

Στη συνέχεια, ο κώδικας επαναλαμβάνεται σε μια περιοχή κελιών από το A1 έως το A7, εκχωρώντας τις τιμές κελιού στον πίνακα, χρησιμοποιώντας μια μεταβλητή "Coun" για την ευρετηρίαση κάθε τιμής

Όταν ο κώδικας φτάσει στην τιμή κειμένου, προκαλείται σφάλμα αναντιστοιχίας και όλα σταματούν

Κάνοντας κλικ στο ‘Debug’ στο αναδυόμενο σφάλμα, θα δείτε τη γραμμή του κώδικα που έχει επισημανθεί το πρόβλημα με κίτρινο χρώμα. Τοποθετώντας το δείκτη του ποντικιού σας πάνω σε οποιαδήποτε παρουσία της μεταβλητής ‘Coun’ μέσα στον κώδικα, θα μπορείτε να δείτε την τιμή του ‘Coun’ όταν ο κωδικός έχει αποτύχει, η οποία σε αυτή την περίπτωση είναι 5

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

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

12345678910111213 Sub TestMismatch ()Dim MyNumber (10) Ως ακέραιος, Coun ως ακέραιοςΣυμβουλή = 1ΚάνωΑν το Coun = 11 Τότε Έξοδος DoΕάν IsNumeric (Φύλλα ("φύλλο 1"). Κελιά (Συμβουλή, 1). Αξία) ΤότεMyNumber (Coun) = Sheets ("sheet1"). Cells (Coun, 1). ValueΑλλούMyNumber (Coun) = 0Τέλος εανΣυμβουλή = Συμβουλή + 1ΒρόχοςΤέλος υπο

Ο κώδικας χρησιμοποιεί τη συνάρτηση ‘IsNumeric’ για να ελέγξει αν η τιμή είναι στην πραγματικότητα ένας αριθμός και αν είναι τότε την εισάγει στον πίνακα. Εάν δεν είναι αριθμός τότε εισάγει την τιμή του μηδέν.

Αυτό διασφαλίζει ότι ο δείκτης πίνακα διατηρείται σε ευθεία γραμμή με τους αριθμούς σειρών κελιών στο υπολογιστικό φύλλο.

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

Το αριθμητικό τεστ χρησιμοποιεί τον πλήρη κώδικα για το κελί καθώς και τον κωδικό για να εκχωρήσει την τιμή στον πίνακα. Θα μπορούσατε να υποστηρίξετε ότι αυτό πρέπει να εκχωρηθεί σε μια μεταβλητή, έτσι ώστε να μην επαναλαμβάνετε τον ίδιο κώδικα, αλλά το πρόβλημα είναι ότι θα πρέπει να ορίσετε τη μεταβλητή ως "Παραλλαγή", κάτι που δεν είναι το καλύτερο.

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

Σφάλμα αναντιστοιχίας που προκαλείται από την κλήση μιας συνάρτησης ή υπορουτίνας χρησιμοποιώντας παραμέτρους

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

Εάν δεν τηρείτε τις συμβάσεις σχετικά με τον τρόπο με τον οποίο οι παράμετροι μεταβιβάζονται στη συνάρτηση, θα εμφανιστεί σφάλμα αναντιστοιχίας

12345678 Sub CallFunction ()Dim Ret As IntegerRet = MyFunction (3, "test")Τέλος υποΛειτουργία MyFunction (N As Integer, T As String) As StringMyFunction = TΛειτουργία Τέλους

Υπάρχουν πολλές δυνατότητες εδώ για να λάβετε ένα σφάλμα αναντιστοιχίας

Η μεταβλητή επιστροφής (Ret) ορίζεται ως ακέραιος, αλλά η συνάρτηση επιστρέφει μια συμβολοσειρά. Μόλις εκτελέσετε τον κώδικα, θα αποτύχει επειδή η συνάρτηση επιστρέφει μια συμβολοσειρά και αυτό δεν μπορεί να μεταβεί σε μια ακέραια μεταβλητή. Είναι ενδιαφέρον ότι η εκτέλεση εντοπισμού σφαλμάτων σε αυτόν τον κώδικα δεν εντοπίζει αυτό το σφάλμα.

Εάν βάλετε εισαγωγικά γύρω από την πρώτη παράμετρο που περνά (3), ερμηνεύεται ως συμβολοσειρά, η οποία δεν ταιριάζει με τον ορισμό της πρώτης παραμέτρου στη συνάρτηση (ακέραιος αριθμός)

Εάν κάνετε τη δεύτερη παράμετρο στην κλήση συνάρτησης σε αριθμητική τιμή, θα αποτύχει με ασυμφωνία επειδή η δεύτερη παράμετρος στη συμβολοσειρά ορίζεται ως συμβολοσειρά (κείμενο)

Σφάλμα αναντιστοιχίας που προκλήθηκε από τη χρήση των συναρτήσεων μετατροπής σε VBA εσφαλμένα

Υπάρχει ένας αριθμός συναρτήσεων μετατροπής που μπορείτε να χρησιμοποιήσετε στο VBA για να μετατρέψετε τιμές σε διάφορους τύπους δεδομένων. Ένα παράδειγμα είναι το 'CInt' που μετατρέπει μια συμβολοσειρά που περιέχει έναν αριθμό σε ακέραιη τιμή.

Εάν η συμβολοσειρά που πρόκειται να μετατραπεί περιέχει τυχόν χαρακτήρες άλφα, τότε θα εμφανιστεί σφάλμα αναντιστοιχίας, ακόμη και αν το πρώτο μέρος της συμβολοσειράς περιέχει αριθμητικούς χαρακτήρες και το υπόλοιπο είναι άλφα χαρακτήρες π.χ. ‘123abc’

Γενική πρόληψη σφαλμάτων ασυμφωνίας

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

Ορίστε τις μεταβλητές σας ως Τύπος παραλλαγής

Ένας τύπος παραλλαγής είναι ο προεπιλεγμένος τύπος μεταβλητής στο VBA. Εάν δεν χρησιμοποιείτε μια δήλωση Dim για μια μεταβλητή και απλώς αρχίσετε να τη χρησιμοποιείτε στον κώδικά σας, τότε λαμβάνεται αυτόματα ο τύπος της παραλλαγής.

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

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

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

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

Χρησιμοποιήστε την εντολή OnError για τον χειρισμό σφαλμάτων

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

1234567 Sub ErrorTrap ()Dim MyNumber As IntegerΣτο Error GoTo Err_HandlerMyNumber = "δοκιμή"Err_Handler:MsgBox "Το σφάλμα" & Err.Description & "έχει συμβεί"Τέλος υπο

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

Η ρουτίνα Err_Handler θα μπορούσε να δείξει περισσότερες πληροφορίες σχετικά με το σφάλμα και με ποιον να επικοινωνήσει.

Από την άποψη του προγραμματισμού, όταν χρησιμοποιείτε μια ρουτίνα χειρισμού σφαλμάτων, είναι αρκετά δύσκολο να εντοπίσετε τη γραμμή κώδικα στο οποίο βρίσκεται το σφάλμα. Εάν προχωρήσετε στον κώδικα χρησιμοποιώντας το F8, μόλις εκτελεστεί η παράνομη γραμμή κώδικα, μεταβαίνει στη ρουτίνα χειρισμού σφαλμάτων και δεν μπορείτε να ελέγξετε πού πάει στραβά.

Ένας τρόπος γύρω από αυτό είναι να δημιουργήσετε μια παγκόσμια σταθερά που είναι σωστή ή λανθασμένη (Boolean) και χρησιμοποιήστε αυτήν για να ενεργοποιήσετε ή να απενεργοποιήσετε τη ρουτίνα χειρισμού σφαλμάτων χρησιμοποιώντας μια δήλωση "Εάν". Όταν θέλετε να δοκιμάσετε το σφάλμα το μόνο που έχετε να κάνετε είναι να ορίσετε την καθολική σταθερά σε False και ο χειριστής σφάλματος δεν θα λειτουργεί πλέον.

1 Global Const ErrHandling = Λάθος
1234567 Sub ErrorTrap ()Dim MyNumber As IntegerIf ErrHandling = True Τότε On Error GoTo Err_HandlerMyNumber = "δοκιμή"Err_Handler:MsgBox "Το σφάλμα" & Err.Description & "έχει συμβεί"Τέλος υπο

Το μόνο πρόβλημα με αυτό είναι ότι επιτρέπει στον χρήστη να ανακάμψει από το σφάλμα, αλλά ο υπόλοιπος κώδικας μέσα στην υπορουτίνα δεν εκτελείται, κάτι που μπορεί να έχει τεράστιες επιπτώσεις αργότερα στην εφαρμογή

Χρησιμοποιώντας το προηγούμενο παράδειγμα περιήγησης σε μια σειρά κελιών, ο κώδικας θα φτάσει στο κελί Α5 και θα χτυπήσει το λάθος που δεν ταιριάζει. Ο χρήστης θα βλέπει ένα πλαίσιο μηνυμάτων που δίνει πληροφορίες για το σφάλμα, αλλά τίποτα από αυτό το κελί και μετά στο εύρος δεν θα υποβληθεί σε επεξεργασία.

Χρησιμοποιήστε την εντολή OnError για καταστολή σφαλμάτων

Αυτό χρησιμοποιεί την εντολή ‘On Error Resume Next’. Αυτό είναι πολύ επικίνδυνο να συμπεριληφθεί στον κώδικά σας καθώς αποτρέπει την εμφάνιση τυχόν μεταγενέστερων σφαλμάτων. Αυτό σημαίνει ότι κατά την εκτέλεση του κωδικού σας, εάν παρουσιαστεί σφάλμα σε μια γραμμή κώδικα, η εκτέλεση θα μετακινηθεί στην επόμενη διαθέσιμη γραμμή χωρίς να εκτελεστεί η γραμμή σφάλματος και θα συνεχιστεί κανονικά.

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

Υπάρχουν περιπτώσεις όπου είναι απαραίτητη η χρήση αυτής της εντολής, όπως εάν διαγράφετε ένα αρχείο χρησιμοποιώντας την εντολή "Kill" (εάν το αρχείο δεν υπάρχει, θα υπάρξει σφάλμα), αλλά η παγίδευση σφάλματος πρέπει πάντα να επιστρέφεται ενεργοποιείται αμέσως μετά το σημείο όπου θα μπορούσε να συμβεί το πιθανό σφάλμα χρησιμοποιώντας:

1 Στο Error Goto 0

Στο προηγούμενο παράδειγμα περιήγησης σε μια σειρά κελιών, χρησιμοποιώντας το "On Error Resume Next", αυτό θα επέτρεπε στον βρόχο να συνεχίσει, αλλά το κελί που προκαλεί το σφάλμα δεν θα μεταφερθεί στον πίνακα και το στοιχείο πίνακα για τον συγκεκριμένο δείκτη θα είχε μηδενική τιμή.

Μετατροπή των δεδομένων σε τύπο δεδομένων για αντιστοίχιση της δήλωσης

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

Μπορείτε να το κάνετε αυτό όταν μεταβιβάζετε παραμέτρους σε συναρτήσεις. Για παράδειγμα, εάν έχετε έναν αριθμό που διατηρείται σε μια μεταβλητή συμβολοσειράς και θέλετε να τον περάσετε ως αριθμό σε μια συνάρτηση, μπορείτε να χρησιμοποιήσετε το CInt

Υπάρχει μια σειρά από αυτές τις συναρτήσεις μετατροπής που μπορούν να χρησιμοποιηθούν, αλλά εδώ είναι οι κύριες:

CInt - μετατρέπει μια συμβολοσειρά που έχει αριθμητική τιμή (κάτω από + ή - 32,768) σε ακέραιη τιμή. Λάβετε υπόψη ότι αυτό περικόπτει τυχόν δεκαδικά ψηφία

CLng - Μετατρέπει μια συμβολοσειρά που έχει μεγάλη αριθμητική τιμή σε μεγάλο ακέραιο. Τα δεκαδικά σημεία περικόπτονται.

CDbl - Μετατρέπει μια συμβολοσειρά που περιέχει έναν αριθμό κυμαινόμενου δεκαδικού σημείου σε αριθμό διπλής ακριβείας. Περιλαμβάνει δεκαδικά ψηφία

CDate - Μετατρέπει μια συμβολοσειρά που περιέχει μια ημερομηνία σε μεταβλητή ημερομηνίας. Εν μέρει εξαρτάται από τις ρυθμίσεις στον Πίνακα Ελέγχου των Windows και τις τοπικές ρυθμίσεις από τον τρόπο ερμηνείας της ημερομηνίας

CStr - Μετατρέπει μια αριθμητική τιμή ή ημερομηνία σε συμβολοσειρά

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

123 Υπο δοκιμή ()MsgBox CInt ("123abc")Τέλος υπο

Δοκιμή μεταβλητών στον κώδικά σας

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

Για παράδειγμα, μπορείτε να ελέγξετε μια συμβολοσειρά για να δείτε αν είναι αριθμητική χρησιμοποιώντας τη συνάρτηση "IsNumeric" στο VBA

1 MsgBox IsNumeric ("123test")

Αυτός ο κώδικας θα επιστρέψει False επειδή παρόλο που η συμβολοσειρά ξεκινά με αριθμητικούς χαρακτήρες, περιέχει επίσης κείμενο, ώστε να αποτύχει στη δοκιμή.

1 MsgBox IsNumeric ("123")

Αυτός ο κωδικός θα επιστρέψει True γιατί είναι όλοι αριθμητικοί χαρακτήρες

Υπάρχουν πολλές λειτουργίες στο VBA για έλεγχο για διάφορους τύπους δεδομένων, αλλά αυτές είναι οι κύριες:

IsNumeric - ελέγχει αν μια παράσταση είναι αριθμός ή όχι

IsDate - ελέγχει αν μια έκφραση είναι ημερομηνία ή όχι

IsNull - ελέγχει αν μια έκφραση είναι μηδενική ή όχι. Μια μηδενική τιμή μπορεί να εισαχθεί μόνο σε ένα παραλλακτικό αντικείμενο, διαφορετικά θα λάβετε ένα σφάλμα "Μη έγκυρη χρήση του μηδενικού". Ένα πλαίσιο μηνυμάτων επιστρέφει μια μηδενική τιμή εάν τη χρησιμοποιείτε για να κάνετε μια ερώτηση, οπότε η μεταβλητή επιστροφής πρέπει να είναι μια παραλλαγή. Λάβετε υπόψη ότι κάθε υπολογισμός με χρήση μηδενικής τιμής θα επιστρέφει πάντα το αποτέλεσμα του μηδενικού.

IsArray - ελέγχει αν η έκφραση αντιπροσωπεύει έναν πίνακα ή όχι

IsEmpty - ελέγχει αν η έκφραση είναι κενή ή όχι. Σημειώστε ότι το κενό δεν είναι το ίδιο με το null. Μια μεταβλητή είναι κενή όταν ορίζεται για πρώτη φορά, αλλά δεν είναι μηδενική τιμή

Παραδόξως, δεν υπάρχει λειτουργία για IsText ή IsString, η οποία θα ήταν πραγματικά χρήσιμη

Αντικείμενα και λάθη ασυμφωνίας

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

123456 Sub TestRange ()Dim MyRange As Range, I As LongΟρισμός MyRange = Range ("A1: A2")I = 10x = UseMyRange (I)Τέλος υπο
12 Λειτουργία UseMyRange (R As Range)Λειτουργία Τέλους

Αυτός ο κώδικας έχει μια συνάρτηση που ονομάζεται «UseMyRange» και μια παράμετρο που περνάει ως αντικείμενο εύρους. Ωστόσο, η παράμετρος που περνάει είναι ένας ακέραιος αριθμός που δεν ταιριάζει με τον τύπο δεδομένων.

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

Η παραβατική παράμετρος θα επισημανθεί με μπλε φόντο

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

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

wave wave wave wave wave