Σφάλμα αναντιστοιχίας τύπου VBA ByRef - Κορυφαίοι 3 λόγοι και επιδιορθώσεις σφαλμάτων

Πίνακας περιεχομένων

ByRef Argument Type Mismatch στο Excel VBA

Σε αυτό το άρθρο, εξηγούμε το σφάλμα που παρουσιάστηκε κατά τη χρήση του Excel VBA ByRef ως "Σφάλμα αναντιστοιχίας τύπου επιχειρημάτων". Πριν από αυτό, επιτρέψτε μου να σας συστήσω πρώτα στο "By Ref". Οι μεταβλητές είναι το κλειδί για οποιαδήποτε γλώσσα προγραμματισμού και το VBA δεν διαφέρει. Έχουμε δει πολλούς τρόπους δήλωσης μεταβλητών, ένας τέτοιος τρόπος δήλωσης μεταβλητών είναι με τη χρήση των λέξεων «ByRef» και «ByVal».

Τι σημαίνει το ByRef;

Το "ByRef" σημαίνει "Με αναφορά" χρησιμοποιώντας αυτήν τη λέξη, μπορούμε πραγματικά να μεταφέρουμε επιχειρήματα σε διαδικασίες (και για τις δύο υπο & λειτουργίες) με αναφορά. Αυτό είναι διαφορετικό από τον αδερφό του «By Val», που δεν είναι ευέλικτο αλλά σταθερό στη φύση.

Για να το καταλάβουμε, ας ρίξουμε μια ματιά στις παρακάτω δύο μακροεντολές.

Κώδικας:

Sub Macro1 () Dim A As Long A = 50 Macro2 A MsgBox A End Sub Sub Macro2 (ByRef A As Long) A = A * 10 End Sub

Έχουμε δύο υπο-διαδικασίες εδώ που ονομάζονται Macro1 & Macro2, αντίστοιχα. Για να το κατανοήσετε καλύτερα, εκτελέστε τη γραμμή γραμμής προς γραμμή πατώντας το πλήκτρο F8.

Πατήστε το πλήκτρο F8 για να καταγράψετε την τιμή της μεταβλητής "A" ως 50.

Η επόμενη γραμμή κώδικα λέει "Macro2 A", δηλαδή το όνομα της δεύτερης μακροεντολής και "A" είναι η μεταβλητή που ορίζεται μέσω της λέξης "By Ref".

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

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

Τώρα σε αυτήν την μακροεντολή ( Macro2 ) η εξίσωση λέει A = A * 10 δηλ. A = 50 * 100. Πατήστε το πλήκτρο F8 3 φορές για να επιστρέψετε στην παραπάνω μακροεντολή ( Macro1 ).

Τώρα πιέστε ένα ακόμη πλήκτρο F8 για να δείτε την τιμή της μεταβλητής "A" στο πλαίσιο μηνυμάτων στο VBA.

Η τιμή λέει 500.

Παρόλο που η τιμή που έχουμε εκχωρήσει σε αυτήν τη μακροεντολή (Macro1) είναι 50, χρησιμοποιώντας τη λέξη ByRef, ενεργοποιήσαμε στην πραγματικότητα τη δευτερεύουσα διαδικασία Macro2 διατηρώντας την τιμή της μεταβλητής "A" από το Macro1 και στη συνέχεια εκτελέσαμε την τιμή του A πολλαπλασιάζοντας 10.

Κορυφαίοι 3 λόγοι για αναντιστοιχία τύπου VBA Byref Argument

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

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

Λόγος σφάλματος # 1 - Διαφορετικά ονόματα μεταβλητών

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

Κώδικας:

Sub Macro1 () Dim A As Long A = 50 Macro2 B MsgBox A End Sub Sub Macro2 (ByRef A As Long) B = B * 10 End Sub

Στο Macro1, χρησιμοποιήσαμε τη μεταβλητή "A" και στο Macro2, χρησιμοποιήσαμε τη μεταβλητή "B". Τώρα, αν προσπαθήσετε να εκτελέσετε τον κωδικό, θα λάβουμε το σφάλμα VBA ως "Αναντιστοιχία τύπου ByRef Argument."

Όπως μπορείτε να δείτε παραπάνω, η μεταβλητή "B" έχει επισημανθεί επειδή ο τύπος του ονόματος της μεταβλητής είναι αναντιστοιχία.

Λύση: Για να ξεπεράσουμε αυτό το ζήτημα, πρέπει να διασφαλίσουμε ότι τα ονόματα των μεταβλητών και στις δύο διαδικασίες είναι ακριβή.

Λόγος σφάλματος 2: Διαφορετικοί τύποι μεταβλητών δεδομένων

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

Κώδικας:

Sub Macro1 () Dim A As Integer A = 50 Macro2 A MsgBox A End Sub Sub Macro2 (ByRef A As Long) A = A * 10 End Sub

Στους παραπάνω κωδικούς, έχω δηλώσει τη μεταβλητή "A" ως τύπο δεδομένων ακέραιου σε Macro1 και στο Macro2 στην ίδια μεταβλητή εκχωρήθηκε ο τύπος δεδομένων ως "Long".

Όταν εκτελούμε αυτόν τον κωδικό, θα προκαλέσει σφάλμα VBA "Αναντιστοιχία τύπου ByRef Argument."

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

Λύση: Ο τύπος δεδομένων πρέπει να είναι ο ίδιος και στις δύο διαδικασίες.

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

Το σφάλμα VBA του Excel, "Ασυμφωνία τύπου ByRef Argument", θα μπορούσε να συμβεί λόγω του τύπου δεδομένων που εκχωρείται σε μία μακροεντολή και δεν έχει εκχωρηθεί σε άλλη μακροεντολή.

Κώδικας:

Sub Macro1 () A = 50 Macro2 A MsgBox A End Sub Sub Macro2 (ByRef A as Long) A = A * 10 End Sub

Στον παραπάνω κώδικα του Macro1, δεν έχω δηλώσει καμία μεταβλητή, αλλά απλώς εκχωρήσαμε την τιμή στη μεταβλητή.

Από την άλλη πλευρά, για το Macro2, έχω δηλώσει τη μεταβλητή "A" για μεγάλο χρονικό διάστημα. Εάν προσπαθήσετε να εκτελέσετε αυτόν τον κωδικό, θα προκαλέσει το σφάλμα VBA "ByRef Argument Type Mismatch".

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

Λύση2: Μια εναλλακτική λύση είναι να καταστήσετε υποχρεωτική τη μεταβλητή δήλωση προσθέτοντας τη λέξη "Option Explicit" στην κορυφή της ενότητας.

Αυτό που θα κάνει είναι ότι πριν εμφανιστεί το σφάλμα VBA «ByRef Argument Type Mismatch», μας ζητάει να δηλώσουμε πρώτα τη μεταβλητή.

Έτσι, το Option Explicit έρχεται πάντα βολικό στο VBA.

Πράγματα που πρέπει να θυμάστε

  • Το ByRef είναι το αντίθετο του By Val.
  • Το ByRef μεταφέρει την αναφορά από τη μία διαδικασία στην άλλη.
  • Το όνομα της μεταβλητής, ο τύπος δεδομένων πρέπει να είναι ο ίδιος και στις δύο διαδικασίες.
  • Κάθε μεταβλητή πρέπει να δηλώνεται ξεχωριστά στην περίπτωση πολλαπλών μεταβλητών.

ενδιαφέροντα άρθρα...