VBA ByRef argumentumtípus eltérési hiba - A 3 legfontosabb ok és hibajavítás

ByRef argumentumtípus nem egyezik az Excel VBA-ban

Ebben a cikkben elmagyarázzuk az Excel VBA ByRef „Argumentumtípus-eltérési hiba” használata során tapasztalt hibát. Előtte hadd mutassam be először a „By Ref” -et. A változók kulcsfontosságúak minden programozási nyelvnél, és a VBA sem különbözik egymástól. A változók deklarálásának számos módját láthattuk, a változók deklarálásának egyik ilyen módja a „ByRef” és a „ByVal” szavak használata.

Mit jelent a ByRef?

A „ByRef” azt jelenti, hogy „hivatkozással” használja ezt a szót, és valójában hivatkozásokat adhatunk át az eljárásoknak (mind az al-, mind a függvényfunkciókhoz). Ez eltér a testvérétől, a „Val Val” -tól, amely nem rugalmas, de rögzített természetű.

Ennek megértéséhez vessünk egy pillantást az alábbi két makróra.

Kód:

1. makró1 () Dim A, amíg hosszú A = 50 Macro2 A, MsgBox A End Sub Sub makró2 (ByRef A Long) A = A * 10 End Sub

Két alfolyamatunk van, ezek neve Macro1, illetve Macro2. Ennek jobb megértéséhez futtassa a makrót soronként az F8 billentyű lenyomásával.

Nyomja meg az F8 gombot az „A” változó 50-ös értékének rögzítéséhez.

A következő kódsor azt mondja, hogy „Macro2 A”, azaz a második makró neve, az „A” pedig a „By Ref” szóval definiált változó.

Amint a fentiekből látható, abban a pillanatban, amikor végrehajtjuk a „Macro2 A” kódsorát, a fenti eljárásból a következő VBA alfolyamatra ugrott.

Most láthatjuk, hogy az „A” változó értéke 50. Ez azért van, mert mivel a „ByRef” szót használtuk az „A” változó deklarálásához, amely megegyezik a Macro1 makróval, megragadta azt az értéket, amellyel rendelkezünk ehhez az „A” változóhoz rendelt a Macro1 .

Ebben a makróban ( Macro2 ) az egyenlet azt mondja, hogy A = A * 10, azaz A = 50 * 100. Nyomja meg az F8 billentyűt háromszor, hogy visszatérjen a fenti makróra ( Macro1 ).

Most nyomja meg még egyszer az F8 billentyűt az „A” változó értékének megjelenítéséhez a VBA üzenetmezőjében.

Az érték 500-at mond.

Annak ellenére, hogy ebben a makróban (Macro1) hozzárendelt értékünk 50, a ByRef szó használatával valóban elindítottuk a Macro2 alfolyamatot azzal, hogy megtartottuk az „A” változó értékét a Macro1-ből, majd végrehajtottuk az A értékét 10 szorzatával.

A VBA Byref argumentumtípus eltérésének 3 legfontosabb oka

A fentiekben láttuk, hogyan működik a „ByRef”, de köteleznénk elkövetni néhány hibát, amelyek mindig azt eredményezték, hogy egy VBA hibaüzenetet „ByRef argumentumtípus eltérés” néven dobtak fel.

Ennek oka sok ok, és ebben a szakaszban bemutatjuk, hogyan lehet kijavítani ezt a hibát és hibakeresni a kódot.

Hiba 1. ok - Különböző változónevek

Ennek a hibának az egyik oka az Excel VBA-ban a két eljárásban átadott különböző változóknak köszönhető. Nézze meg például az alábbi kódokat.

Kód:

1. makró1 () Dim A, amíg hosszú A = 50 Macro2 B MsgBox A vége Sub Sub makró (ByRef A olyan hosszú) B = B * 10 End Sub

A Macro1-ben az „A” változót, a Macro2-ben pedig a „B” változót használtuk. Most, ha megpróbálja futtatni a kódot, a VBA hibát kapjuk „ByRef argumentumtípus eltérés” néven.

Mint fent láthatja, a „B” változót kiemelték, mivel a változó neve típusa nem egyezik.

Megoldás: A probléma kiküszöbölése érdekében meg kell győződnünk arról, hogy a változónevek mindkét eljárásban pontosak-e.

Hiba 2. ok: Különböző változó adattípusok

Annak ellenére, hogy a változónevek ugyanazok, mégis hibát okoz, ez a hozzájuk rendelt adattípus miatt van. Nézze meg az alábbi kódot.

Kód:

1. makró1 () Dim A egész számként A = 50 makró2 A MsgBox A vége Sub Sub makró2 (ByRef A olyan hosszú) A = A * 10 End sub

A fenti kódokban az „A” változót egész számadattá nyilvánítottam a Macro1-ben, a Macro2-ben pedig ugyanahhoz a változóhoz rendeltük az adattípust, mint „Long”.

Amikor futtatjuk ezt a kódot, ez egy VBA hibát fog okozni „ByRef argumentumtípus eltérése”.

Ennek oka, hogy két különböző adattípust rendeltünk ugyanahhoz a változó névhez.

Megoldás: Az adattípusnak meg kell egyeznie mindkét eljárásban.

Hiba 3. ok: Egy makrón hiányoznak a változó adattípusok

Az Excel VBA hiba, a „ByRef argumentumtípus eltérése”, az egyik makróhoz rendelt adattípus miatt következhet be, a másik makróban pedig nem.

Kód:

1. makró1 () A = 50 makró2 A MsgBox A végső almakró makró2 (ByRef A olyan hosszú) A = A * 10 végállomás

A Macro1 fenti kódjában egyetlen változót sem deklaráltam, hanem egyszerűen a változóhoz rendeltem hozzá értéket.

Másrészt a Macro2 esetében hosszú ideig deklaráltam az „A” változót. Ha megpróbálja futtatni ezt a kódot, az a „ByRef Argument Type Mismatch” VBA hibát okozza.

1. megoldás: Az ilyen jellegű helyzetek elkerülése érdekében az első megoldás a változó deklarálása mindkét eljárásban és ugyanazon adattípus hozzárendelése.

2. megoldás: Alternatív megoldás a változó deklarációjának kötelezővé tétele az „Option Explicit” szó hozzáadásával a modul tetején.

Ez azt fogja tenni, hogy mielőtt megjelenítené a VBA „ByRef Argument Type Mismatch” hibát, valójában arra kér minket, hogy először deklaráljuk a változót.

Tehát az Option Explicit mindig jól jön a VBA-ban.

Dolgok, amikre emlékezni kell

  • A ByRef ellentéte a By Val-nak.
  • A ByRef az egyik eljárásról a másikra utal.
  • A változó nevének, adattípusának meg kell egyeznie mindkét eljárásban.
  • Minden változót külön kell deklarálni több változó esetén.

érdekes cikkek...