VBA ByRefi argumendi tüübi mittevastavusviga - 3 parimat põhjust ja veaparandust

Lang L: none (table-of-contents)

ByRefi argumendi tüüp ei vasta Exceli VBA-le

Selles artiklis selgitame viga, mis ilmnes Exceli VBA ByRefi kui argumendi tüübi mittevastavuse kasutamisel. Enne seda lubage mul kõigepealt tutvustada teemat “By Ref”. Muutujad on võtmeks mis tahes programmeerimiskeeles ja ka VBA ei erine. Oleme muutujate deklareerimiseks mitmel viisil näinud, näiteks muutujate deklareerimiseks, kasutades sõnu "ByRef" ja "ByVal".

Mida tähendab ByRef?

„ByRef” tähendab seda sõna kasutades „viitena”, ja me võime protseduuridele (mõlemale alam- ja funktsioonifunktsioonile) viited tegelikult edasi anda. See on erinevalt tema vennast “By Val”, mis ei ole paindlik, vaid olemuselt fikseeritud.

Selle mõistmiseks heitkem pilk kahele allpool toodud makrole.

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, mille nimed on vastavalt Macro1 ja Macro2. Selle paremaks mõistmiseks käivitage makro rida real, vajutades klahvi F8.

Muutuja “A” väärtuseks 50 sisestamiseks vajutage klahvi F8.

Järgmisel koodireal on kiri „Macro2 A”, st teise makro nimi ja „A” on muutuja, mis on määratletud sõna „By Ref” kaudu.

Nagu ülal näete, on koodirea „Macro2 A” käivitamise hetkel hüpatud järgmise VBA alamprotseduuriga ülaltoodud protseduurist.

Nüüd näeme muutuja A väärtust 50. Seda seetõttu, et kuna oleme muutuja A deklareerimiseks kasutanud sõna ByRef, mis on sama mis Macro1-s, on see tabanud meie väärtuse määratud sellele muutujale „A” Macro1-st .

Nüüd ütleb selle makro ( makro2 ) võrrand A = A * 10, st 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 peame tegema mõned vead, mille tulemuseks oli alati VBA tõrketeate viskamine "ByRefi argumendi tüübi mittevastavus".

Selle põhjuseks on palju põhjuseid ja selles jaotises näitame teile, kuidas seda viga parandada ja koodi siluda.

Viga 1. põhjus - erinevad muutujate nimed

Üks peamisi põhjusi selle vea saamiseks Exceli VBA-s on tingitud kahes protseduuris edastatud erinevatest muutujatest. Näiteks 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

Ehkki muutujate nimed on samad, põhjustab see siiski tõrke, mis on tingitud neile omistatud andmetüübist. Vaadake allolevat koodi.

Kood:

Alammakro1 () Dimensioon A täisarvuna A = 50 makro2 A MsgBox A Lõpp-alam-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 andmetüübiks „Long“ sama muutuja.

Selle koodi käivitamisel põhjustab see VBA tõrke „ByRefi argumendi tüübi mittevastavus”.

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.

Teisest küljest olen Macro2 jaoks deklareerinud muutuja „A” nii pikaks. Kui proovite seda koodi käivitada, põhjustab see VBA-tõrke „ByRefi argumendi tüübi mittevastavus”.

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”.

Mida see teeb, on see, et enne kui kuvatakse VBA „ByRef Argument Type Mismatch” Error, palub see meil kõigepealt muutuja deklareerida.

Niisiis, Option Explicit on VBA-s alati kasulik.

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.

Huvitavad Artiklid...