VBA ByRefi argumendi tüübi mittevastavusviga | 3 parimat põhjust ja veaparandust
ByRefi argumendi tüüp ei vasta Exceli VBA-le
Selles artiklis selgitame viga, mis ilmnes Exceli VBA ByRefi kasutamisel argumendi tüübi mittevastavuse veana. Enne seda lubage mul kõigepealt tutvustada teile lugu "By Ref". Muutujad on võtmeks mis tahes programmeerimiskeeles ja ka VBA ei erine. Oleme muutujate deklareerimiseks näinud mitmeid viise, näiteks muutujate deklareerimiseks on sõnade “ByRef” ja “ByVal” kasutamine.
Mida tähendab ByRef?
“ByRef” tähendab viidet. Selle sõna abil saame protseduuridele (mõlemale alam- ja funktsioonifunktsioonile) viite abil tegelikult argumente edastada. See on erinevalt tema vennast “By Val”, mis pole paindlik, kuid olemuselt fikseeritud.
Selle mõistmiseks vaatame kahte allpool toodud makrot.
Kood:
Alammakro1 () Dim A kui pikk A = 50 makro2 A MsgBox A Lõpp-alammakro2 (ByRef A sama pikk) A = A * 10 End Sub
Meil on siin kaks alamprotseduuri, mida nimetatakse vastavalt Macro1 ja Macro2. Selle mõistmiseks käivitage makro rea kaupa, vajutades klahvi F8.
Muutuja “A” väärtuseks 50 sisestamiseks vajutage klahvi F8.
Järgmine koodirida ütleb “Macro2 A”, st teise makro nimi ja “A” on muutuja, mis on määratletud sõna “Ref” abil.
Nagu näete ülal hetkel, kui käivitame koodirea „Macro2 A”, on see hüpanud ülaltoodud protseduurist järgmise VBA alamprotseduurini.
Nüüd näeme muutuja A väärtust 50, seda seetõttu, et kuna me kasutasime sõna ByRef deklareerimaks muutujat A, mis on sama mis Macro1-s, on see tabanud sellele muutujale omistatud väärtuse A ” Macro1-st .
Nüüd ütleb selle makro ( makro2 ) võrrand A = A * 10 ehk A = 50 * 100. Eespool toodud makro juurde naasmiseks vajutage kolm korda klahvi F8 ( makro1 ).
Nüüd vajutage veel üks kord klahvi F8, et näha muutuja “A” väärtust VBA teatekastis.
Väärtus ütleb 500.
Kuigi selles makros (Macro1) omistatud väärtus on 50, käivitasime ByRefi sõna abil tegelikult Macro2 alamprotseduuri, säilitades muutuja A väärtuse Macro1-st ja käivitades seejärel A väärtuse korrutades 10.
VBA Byrefi argumendi tüübi mittevastavuse 3 peamist põhjust
Eespool oleme näinud, kuidas "ByRef" töötab, kuid me peame tegema mõned vead, mille tulemuseks oli alati VBA tõrketeate viskamine "ByRef Argument Type Mismatch".
Selle põhjuseks on palju põhjuseid ja selles jaotises näitame teile, kuidas seda viga parandada ja koodi siluda.
Selle VBA ByRefi argumendi tüübi mittevastavuse Exceli mall saate alla laadida siit - VBA ByRefi argumendi tüüp ei vasta Exceli mallileViga 1. põhjus - erinevad muutujate nimed
Üks peamisi põhjusi selle vea saamiseks Exceli VBA-s on tingitud kahes protseduuris edastatud erinevatest muutujatest. Näite saamiseks vaadake allolevaid koode.
Kood:
Alammakro1 () Dim A kui pikk A = 50 makro2 B MsgBox A Lõpp-alammakro2 (ByRef A sama pikk) B = B * 10 End Sub
Macro1-s oleme kasutanud muutujat “A” ja Macro2-s muutujat “B”. Nüüd, kui proovite koodi käivitada, saame VBA tõrke kui "ByRefi argumendi tüübi mittevastavus".
Nagu ülal näete, on muutuja „B” esile tõstetud, kuna muutuja nime tüüp ei ühti.
Lahendus: selle probleemi lahendamiseks peame veenduma, et mõlema protseduuri muutujate nimed on täpsed.
Viga 2. põhjus: erinevad muutuja andmetüübid
Kuigi muutujate nimed on samad, põhjustab see siiski vea, kuna see on neile omistatud andmetüübi tõttu. Vaadake allolevat koodi.
Kood:
Alammakro1 () Dimensioon A täisarvuna A = 50 makro2 A MsgBox A Lõpp-alamakro Makro2 (ByRef A nii kaua) A = A * 10 Lõpp-alam
Ülaltoodud koodides olen deklareerinud muutuja „A” täisarvu tüübiks Macro1-s ja Macro2-s määrati samale muutujale andmetüübiks kui „Long”.
Selle koodi käivitamisel põhjustab see vba tõrke "ByRef Argument Type Mismatch".
Seda seetõttu, et oleme määranud samale muutuja nimele kaks erinevat andmetüüpi.
Lahendus: andmetüüp peaks olema mõlemas protseduuris sama.
Viga 3. põhjus: ühes makros puuduvad muutuvad andmetüübid
Exceli VBA tõrge „ByRef Argument Type Mismatch” võib juhtuda ühes makros määratud ja teises makros määramata andmetüübi tõttu.
Kood:
Alammakro1 () A = 50 makro2 A MsgBox A Lõpp-alam-makro2 (ByRef A nii kaua) A = A * 10 Lõpp-alam
Eespool toodud Macro1 koodis pole ma ühtegi muutujat deklareerinud, vaid määrasin muutujale lihtsalt väärtuse.
Teiselt poolt olen deklareerinud muutuja A nii kauaks kui Macro2. Kui proovite seda koodi käivitada, põhjustab see VBA-tõrke „ByRef Argument Type Mismatch”.
Lahendus 1. Selliste olukordade vältimiseks on esimene lahendus deklareerida muutuja mõlemas protseduuris ja määrata sama andmetüüp.
Lahendus2: Alternatiivne lahendus on muuta muutuja deklaratsioon kohustuslikuks, lisades mooduli ülaossa sõna „Option Explicit”.
See teeb seda, et enne kui kuvatakse VBA "ByRef Argument Type Mismatch" tõrge, palub ta meil tegelikult muutuja kõigepealt deklareerida.
Niisiis, Option Explicit tuleb VBA-s alati kasuks.
Asjad, mida meeles pidada
- ByRef on By Vali vastand.
- ByRef kannab viidet ühelt protseduurilt teisele.
- Muutuja nimi, andmetüüp peaks mõlemas protseduuris olema sama.
- Iga muutuja tuleb mitme muutuja korral eraldi deklareerida.