Σφάλμα αναντιστοιχίας τύπου 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".

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

Μπορείτε να κατεβάσετε αυτό το πρότυπο VBA ByRef Argument Type Mismatch Excel Template - VBA ByRef Argument Type Mismatch Excel Template

Λόγος σφάλματος # 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 Type Mismatch" θα μπορούσε να συμβεί λόγω του τύπου δεδομένων που έχει εκχωρηθεί σε μια μακροεντολή και δεν έχει εκχωρηθεί σε άλλη μακροεντολή.

Κώδικας:

 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 μεταφέρει την αναφορά από τη μία διαδικασία στην άλλη.
  • Το όνομα της μεταβλητής, ο τύπος δεδομένων πρέπει να είναι ο ίδιος και στις δύο διαδικασίες.
  • Κάθε μεταβλητή πρέπει να δηλώνεται ξεχωριστά σε περίπτωση πολλαπλών μεταβλητών.

$config[zx-auto] not found$config[zx-overlay] not found