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.