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 „Remiantis nuoroda“, naudojant šį žodį, mes iš tikrųjų 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 antrines procedūras, atitinkamai pavadintas „Macro1“ ir „Macro2“. Norėdami tai geriau suprasti, paleiskite makrokomandą eilute po eilutės paspausdami klavišą F8.

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

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

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

Dabar matome, kad kintamojo „A“ reikšmė yra 50. Taip yra todėl, kad kadangi žodį „ByRef“ panaudojome kintamojo „A“ deklaravimui, kuris yra toks pat kaip „ Macro1“, jis užfiksavo mūsų turimą vertę priskirtas šiam kintamajam „A“ iš „ Macro1“ .

Dabar šioje makrokomandoje („ Macro2“ ) lygtyje sakoma: A = A * 10, ty A = 50 * 100. Paspauskite klavišą F8 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

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

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

1 klaida - skirtingi kintamųjų pavadinimai

Viena iš pagrindinių šios klaidos „Excel VBA“ priežasčių yra dėl skirtingų kintamųjų, pateiktų dviem procedūromis. Pavyzdžiui, pažvelkite į žemiau 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“ mes 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 kintamieji pavadinimai abiejose procedūrose yra tikslūs.

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

Nors kintamųjų pavadinimai yra vienodi, vis tiek tai sukelia klaidą, taip yra dėl jiems priskiriamo duomenų tipo. Pažvelkite į žemiau esantį kodą.

Kodas:

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

Pirmiau pateiktuose koduose „Macro1“ deklaravau kintamąjį „A“ kaip sveikąjį duomenų tipą, o „Macro2“ duomenų tipui tas pats kintamasis 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 tas pats abiejose procedūrose.

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

„Excel VBA“ klaida „ByRef argumento tipo neatitikimas“ gali atsitikti dėl duomenų tipo, priskirto vienai makrokomandai, o ne priskirtai kitai.

Kodas:

1 papildomas makrokomandas () A = 50 makrokomandų 2 A „MsgBox“ A galinis antrinis makrokomandas 2 (iki ilgio ByRef A) 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 taip ilgai. Jei bandysite paleisti šį kodą, tai sukels VBA klaidą „ByRef argumento tipo neatitikimas“.

1 sprendimas: norint išvengti tokio pobūdžio situacijų, pirmasis sprendimas yra deklaruoti kintamąjį abiejose procedūrose ir priskirti tą patį duomenų tipą.

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

Tai padarys tai, kad prieš parodant VBA „ByRef argumento tipo neatitikimo“ klaidą, 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.

Įdomios straipsniai...