VBA ByRef Тип аргумент Грешка при несъответствие - Топ 3 причини и поправки на грешки

ByRef Несъответствие на аргумента в Excel VBA

В тази статия обясняваме грешката, възникнала при използване на Excel VBA ByRef като „Грешка при несъответствие на типа аргумент“. Преди това, първо да ви запозная с „С реф“. Променливите са ключови за всеки език за програмиране и VBA също не е различен. Виждали сме много начини за деклариране на променливи. Един такъв начин за деклариране на променливи е чрез използване на думите „ByRef“ и „ByVal“.

Какво означава ByRef?

„ByRef“ означава „По препратка“, използвайки тази дума, ние всъщност можем да предаваме аргументи на процедури (както за под & функция) чрез препратка. Това е за разлика от брат му „By Val“, който не е гъвкав, но е фиксиран по природа.

За да разберем това, нека да разгледаме по-долу два макроса.

Код:

Sub Macro1 () Dim A As Long A = 50 Macro2 A MsgBox A End Sub Sub Macro2 (ByRef A As Long) A = A * 10 End Sub

Тук имаме два подпроцедури, наречени съответно Macro1 и Macro2. За да разберете това по-добре, стартирайте макро реда по ред, като натиснете клавиша F8.

Натиснете клавиша F8, за да уловите стойността на променлива „A“ като 50.

Следващият ред на кода казва „Macro2 A“, т.е. името на втория макрос и „A“ е променливата, дефинирана чрез думата „By Ref“.

Както можете да видите по-горе, в момента, в който изпълним реда с код „Macro2 A“, той е преминал към следващата подпроцедура на VBA от горната процедура.

Сега можем да видим стойността на променливата „A“ е 50. Това е така, защото тъй като използвахме думата „ByRef“, за да декларираме променливата „A“, която е същата като в Macro1, тя улови стойността, която имаме присвоена на тази променлива „A“ от Macro1 .

Сега в това уравнение за макрос ( Macro2 ) се казва A = A * 10, т.е. A = 50 * 100. Натиснете бутона F8 3 пъти, за да се върнете към горния макрос ( Macro1 ).

Сега натиснете още веднъж клавиш F8, за да видите стойността на променлива „A“ в полето за съобщения във VBA.

Стойността казва 500.

Въпреки че стойността, която сме задали в този макрос (Macro1), е 50, използвайки думата ByRef, ние всъщност задействахме подпроцедурата Macro2, като запазихме стойността на променлива „A“ от Macro1 и след това изпълнихме стойността на A чрез умножаване на 10.

Топ 3 причини за несъответствие на типа аргумент VBA Byref

По-горе видяхме как работи „ByRef“, но сме длъжни да допуснем някои от грешките, които неизменно са довели до изпращане на съобщение за грешка на VBA като „Несъответствие на типа на аргумента ByRef“.

Това се дължи на много причини и в този раздел ще ви покажем как да коригирате тази грешка и да отстраните грешките в кода.

Причина за грешка # 1 - Различни имена на променливи

Една от основните причини за получаването на тази грешка в Excel VBA се дължи на различни променливи, предадени в две процедури. Например вижте кодовете по-долу.

Код:

Sub Macro1 () Dim A As Long A = 50 Macro2 B MsgBox A End Sub Sub Macro2 (ByRef A As Long) B = B * 10 End Sub

В Macro1 използвахме променливата „A“, а в Macro2 използваме променливата „B“. Сега, ако се опитате да стартирате кода, ще получим грешка VBA като „Несъответствие на типа аргумент ByRef“.

Както можете да видите по-горе, променливата „B“ е подчертана, тъй като типът на името на променливата е несъответствие.

Решение: За да преодолеем този проблем, трябва да се уверим, че имената на променливите и в двете процедури са точни.

Причина за грешка 2: Различни типове променливи данни

Въпреки че имената на променливите са еднакви, все пак причинява грешка, това се дължи на типа данни, който им присвояваме. Погледнете кода по-долу.

Код:

Sub Macro1 () Dim A As Integer A = 50 Macro2 A MsgBox A End Sub Sub Macro2 (ByRef A As Long) A = A * 10 End Sub

В горните кодове декларирах променлива „A“ като Integer тип данни в Macro1, а в Macro2 на същата променлива е присвоен типът данни като „Long“.

Когато стартираме този код, той ще причини грешка в VBA „Несъответствие на типа аргумент ByRef“.

Това е така, защото сме присвоили два различни типа данни за едно и също име на променлива.

Решение: Типът данни трябва да бъде еднакъв и в двете процедури.

Причина за грешка 3: Променливи типове данни липсват в един макрос

Грешката в Excel VBA, „Несъответствие на типа аргумент ByRef“, може да се случи поради тип данни, присвоен в един макрос и не присвоен в друг макрос.

Код:

Sub Macro1 () A = 50 Macro2 A MsgBox A End Sub Sub Macro2 (ByRef A As Long) A = A * 10 End Sub

В горния код на Macro1 не съм декларирал нито една променлива, а просто присвоил стойността на променливата.

От друга страна, за Macro2 съм декларирал променливата „A“ толкова дълго. Ако се опитате да стартирате този код, това ще доведе до грешка VBA „ByRef Argument Type Mismatch“.

Решение1: За да се избегнат подобни ситуации, първото решение е да декларирате променливата и в двете процедури и да присвоите един и същи тип данни.

Решение 2: Алтернативно решение е да направите декларацията за променливата задължителна, като добавите думата „Изрично за опция“ в горната част на модула.

Това, което ще направим, е, че преди да покаже VBA “ByRef Argument Type Mismatch,” Грешка, всъщност иска първо да декларираме променливата.

Така че, Option Explicit винаги е полезен във VBA.

Неща за запомняне

  • ByRef е обратното на By Val.
  • ByRef носи препратката от една процедура към друга.
  • Името на променливата, типът данни трябва да бъде еднакво и в двете процедури.
  • Всяка променлива трябва да бъде декларирана отделно в случай на множество променливи.

Интересни статии...