VBA ByRef argumento tipo neatitikimo klaida 3 populiariausios priežastys ir klaidų taisymai

„ByRef“ argumento tipo neatitikimas „Excel VBA“

Šiame straipsnyje mes paaiškiname klaidą, įvykusią naudojant „Excel VBA ByRef“ kaip „Argumento tipo neatitikimo klaida“. Prieš tai leiskite pirmiausia jus supažindinti su „By Ref“. Kintamieji yra bet kurios programavimo kalbos raktas, o VBA taip pat nesiskiria. Mes matėme daugybę kintamųjų deklaravimo būdų. Vienas iš tokių kintamųjų deklaravimo būdų yra žodžių „ByRef“ ir „ByVal“ naudojimas.

Ką reiškia „ByRef“?

„ByRef“ reiškia „Nuoroda“, naudodamiesi šiuo žodžiu, mes galime perduoti argumentus procedūroms (abiem sub & funkcijai) remdamiesi nuoroda. Tai nepanašu į brolį „By Val“, kuris nėra lankstus, bet fiksuoto pobūdžio.

Norėdami tai suprasti, pažvelkime į žemiau pateiktas dvi makrokomandas.

Kodas:

 1 papildomas makrokomandas () Dim A tol, kol A = 50 Macro2 A MsgBox A Pabaiga Sub Sub makro2 (ByRef A tiek ilgai) A = A * 10 End Sub 

Čia mes turime dvi subprocedūras, atitinkamai pavadintas „Macro1“ ir „Macro2“. Norėdami tai suprasti, geriau paleiskite makrokomandą eilute, paspausdami klavišą F8.

Paspauskite klavišą F8, kad užfiksuotumėte kintamojo „A“ vertę kaip 50.

Kitoje kodo eilutėje sakoma „Macro2 A“, ty antrosios makrokomandos pavadinimas, o „A“ yra kintamasis, apibrėžtas žodžiu „By Ref“.

Kaip matote aukščiau, kai vykdome kodo „Macro2 A“ eilutę, ji perėjo į kitą VBA antrinę procedūrą iš pirmiau nurodytos procedūros.

Dabar matome, kad kintamojo „A“ vertė yra 50, nes todėl, kad žodį „ByRef“ panaudojome deklaruoti kintamąjį „A“, kuris yra toks pat kaip „ Macro1“, jis užfiksavo šiam kintamajam priskirtą vertę „ A “iš„ Macro1 “ .

Dabar šioje makrokomandoje („ Macro2“ ) lygtyje sakoma, kad A = A * 10, ty A = 50 * 100. Paspauskite F8 klavišą 3 kartus, kad grįžtumėte į pirmiau pateiktą makrokomandą ( Macro1 ).

Dabar dar kartą paspauskite F8 klavišą, kad pamatytumėte kintamojo „A“ vertę VBA pranešimų laukelyje.

Vertė sako 500.

Nors vertė, kurią priskyrėme šiai makrokomandai („Macro1“) yra 50, naudodami „ByRef“ žodį, mes iš tikrųjų suaktyvinome „Macro2“ antrinę procedūrą, išlaikydami kintamojo „A“ vertę iš „Macro1“ ir tada vykdydami A vertę padauginę 10.

3 svarbiausios VBA Byref argumento tipo neatitikimo priežastys

Aukščiau mes matėme, kaip veikia „ByRef“, tačiau mes privalome padaryti keletą klaidų, dėl kurių VBA klaidos pranešimas visada buvo „ByRef argumento tipo neatitikimas“.

Taip yra dėl daugelio priežasčių ir šiame skyriuje parodysime, kaip ištaisyti šią klaidą ir derinti kodą.

Šį „VBA ByRef“ argumento tipo neatitikimo „Excel“ šabloną galite atsisiųsti čia - VBA „ByRef“ argumento tipo neatitikimo „Excel“ šablonas.

1 klaida - skirtingi kintamųjų pavadinimai

Viena iš pagrindinių šios „Excel VBA“ klaidos priežasčių yra dėl skirtingų kintamųjų, pateiktų dviem procedūromis. Pavyzdžiui, pažvelkite į toliau pateiktus kodus.

Kodas:

 1 papildomas makrokomandas () Dim A tol, kol A = 50 Macro2 B MsgBox A Pabaiga Sub Sub makro2 (ByRef A tiek ilgai) B = B * 10 End Sub 

„Macro1“ naudojome „A“ kintamąjį, o „Macro2“ - „B“ kintamąjį. Dabar, jei bandysite paleisti kodą, gausime VBA klaidą kaip „ByRef argumento tipo neatitikimas“.

Kaip matote aukščiau, kintamasis „B“ buvo paryškintas, nes kintamojo pavadinimo tipas neatitinka.

Sprendimas: Norėdami išspręsti šią problemą, turime įsitikinti, kad kintamųjų pavadinimai abiejose procedūrose yra tikslūs.

Klaida 2 priežastis: skirtingi kintamų duomenų tipai

Nors kintamųjų pavadinimai yra vienodi, vis tiek kyla klaida, nes tai priklauso nuo duomenų tipo, kurį jiems priskiriame. Pažvelkite į žemiau esantį kodą.

Kodas:

 1 papildomas makrokomandas () Dim A kaip sveikas skaičius A = 50 Macro2 A MsgBox A pabaigos antrinis makrokomandas 2 (ByRef A tiek ilgai) A = A * 10 pabaigos sub 

Aukščiau nurodytais kodais kintamąjį „A“ deklaravau kaip sveikąjį duomenų tipą „Macro1“, o „Macro2“ tam pačiam kintamajam duomenų tipas buvo priskirtas kaip „Ilgas“.

Kai paleisime šį kodą, jis sukels vba klaidą „ByRef argumento tipo neatitikimas“.

Taip yra todėl, kad tam pačiam kintamojo pavadinimui priskyrėme du skirtingus duomenų tipus.

Sprendimas: duomenų tipas turėtų būti vienodas abiejose procedūrose.

Klaida 3 priežastis: kintamųjų duomenų tipų trūksta viename makrokomandoje

„Excel VBA“ klaida „ByRef argumento tipo neatitikimas“ gali įvykti dėl duomenų tipo, priskirto vienai makrokomandai, o nepriskirtam kitoje makrokomandoje.

Kodas:

 1 papildomas makrokomandas () A = 50 makrokomandų 2 A „MsgBox“ Pabaigos antrinis makrokomandas 2 („ByRef A“ taip ilgai) A = A * 10 pabaigos antrinis makrokomandas 

Ankstesniame „Macro1“ kode aš nedeklaravau jokio kintamojo, o tiesiog priskyriau kintamojo vertę.

Kita vertus, „Macro2“ kintamąjį „A“ deklaravau kaip ilgą. Jei bandysite paleisti šį kodą, tai sukels „ByRef argumento tipo neatitikimo“ VBA klaidą.

Ištirpinimo būdu1: Siekiant išvengti šių situacijų rūšių pirmasis sprendimas yra paskelbti kintamąjį į abi procedūras ir priskirti tą patį duomenų tipą.

2 sprendimas: alternatyvus sprendimas yra padaryti kintamąją deklaraciją privalomą, modulio viršuje pridedant žodį „Option Explicit“.

Tai padarys tai, kad prieš parodant VBA klaidą „ByRef argumento tipo neatitikimas“, ji iš tikrųjų paprašo pirmiausia deklaruoti kintamąjį.

Taigi „Option Explicit“ visada praverčia VBA.

Ką reikia atsiminti

  • ByRef yra priešinga By Val.
  • „ByRef“ pateikia nuorodą iš vienos procedūros į kitą.
  • Kintamojo pavadinimas, duomenų tipas abiejose procedūrose turėtų būti vienodas.
  • Kiekvieną kintamąjį reikia deklaruoti atskirai, jei yra keli kintamieji.