Chyba nesouladu typu argumentu VBA ByRef | Nejlepší 3 důvody a opravy chyb

Neshoda typu argumentu ByRef v aplikaci Excel VBA

V tomto článku vysvětlíme chybu, ke které došlo při používání aplikace Excel VBA ByRef jako „Chyba neshody typu argumentu“. Předtím vám nejprve představím „By Ref“. Proměnné jsou klíčem k jakémukoli programovacímu jazyku a VBA se také neliší. Viděli jsme mnoho způsobů deklarace proměnných, jedním z takových způsobů deklarace proměnných je použití slov „ByRef“ a „ByVal“.

Co znamená ByRef?

„ByRef“ znamená „podle odkazu“, pomocí tohoto slova můžeme ve skutečnosti předávat argumenty procedurám (pro sub i funkci) odkazem. To je na rozdíl od jeho bratra „By Val“, který není pružný, ale má pevnou povahu.

Abychom tomu porozuměli, podívejme se na níže uvedená dvě makra.

Kód:

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

Máme zde dva podprocesy s názvem Macro1 a Macro2. Abyste tomu lépe porozuměli, spusťte makro řádek po řádku stisknutím klávesy F8.

Stisknutím klávesy F8 zachytíte hodnotu proměnné „A“ jako 50.

Další řádek kódu říká „Macro2 A“, tj. Název druhého makra a „A“ je proměnná definovaná slovem „By Ref“.

Jak vidíte výše, v okamžiku, kdy provedeme řádek kódu „Macro2 A“, přeskočil na další dílčí postup VBA z výše uvedeného postupu.

Nyní vidíme, že hodnota proměnné „A“ je 50, je to proto, že protože jsme použili slovo „ByRef“ k deklaraci proměnné „A“, která je stejná jako v Macro1 , zachytila ​​hodnotu, kterou jsme této proměnné přiřadili “ A “z makra1 .

Nyní v tomto makru ( Macro2 ) rovnice říká A = A * 10, tj. A = 50 * 100. Stisknutím klávesy F8 třikrát se vrátíte k výše uvedenému makru ( Macro1 ).

Nyní stiskněte ještě jednou klávesu F8, abyste viděli hodnotu proměnné „A“ v okně se zprávou ve VBA.

Hodnota říká 500.

I když hodnota, kterou jsme tomuto makru (Macro1) přiřadili, je 50, použitím slova ByRef jsme ve skutečnosti spustili podproces Macro2 tím, že jsme zachovali hodnotu proměnné „A“ z Macro1 a poté provedli hodnotu A vynásobením 10.

Nejdůležitější 3 důvody neshody typu argumentu VBA Byref Argument

Nahoře jsme viděli, jak „ByRef“ funguje, ale museli jsme udělat některé z chyb, které vždy vyústily v chybovou zprávu VBA jako „Neshoda typu argumentu ByRef“.

Je to z mnoha důvodů a v této části vám ukážeme, jak tuto chybu opravit a ladit kód.

Tuto šablonu Excel Neshoda typu argumentu VBA ByRef si můžete stáhnout zde - Šablona Excel Neshoda typu argumentu VBA ByRef

Důvod chyby č. 1 - různé názvy proměnných

Jedním z hlavních důvodů získání této chyby v aplikaci Excel VBA je způsobeno různými proměnnými předanými ve dvou postupech. Například se podívejte na níže uvedené kódy.

Kód:

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

V Macro1 jsme použili proměnnou „A“ a v Macro2 jsme použili proměnnou „B“. Nyní, pokud se pokusíte spustit kód, zobrazí se chyba VBA jako „Neshoda typu argumentu ByRef“.

Jak vidíte výše, proměnná „B“ byla zvýrazněna, protože typ názvu proměnné je neshoda.

Řešení: Abychom tento problém překonali, musíme se ujistit, že názvy proměnných v obou postupech jsou přesné.

Důvod chyby 2: Různé typy proměnných dat

I když jsou názvy proměnných stále stejné, způsobí to chybu, je to kvůli datovému typu, který jim přiřadíme. Podívejte se na níže uvedený kód.

Kód:

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

Ve výše uvedených kódech jsem deklaroval proměnnou „A“ jako datový typ Integer v Macro1 a v Macro2 byla stejné proměnné přiřazen datový typ jako „Long“.

Když spustíme tento kód, způsobí to chybu VBA „Neshoda typu ByRef Argument“.

Je to proto, že jsme stejnému názvu proměnné přiřadili dva různé datové typy.

Řešení: Datový typ by měl být v obou postupech stejný.

Důvod chyby 3: V jednom makru chybí proměnné typy dat

Může dojít k chybě Excel VBA „Neshoda typu argumentu ByRef“ kvůli datovému typu přiřazenému v jednom makru a nepřiřazenému v jiném makru.

Kód:

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

Ve výše uvedeném kódu Macro1 jsem nedeklaroval žádnou proměnnou, ale jednoduše ji přiřadil hodnotě proměnné.

Na druhou stranu pro Macro2 jsem proměnnou „A“ deklaroval jako dlouhou. Pokud se pokusíte spustit tento kód, způsobí to chybu VBA „ByRef Argument Type Mismatch“.

Řešení 1: Abychom se vyhnuli těmto situacím, prvním řešením je deklarovat proměnnou v obou postupech a přiřadit stejný datový typ.

Řešení2: Alternativním řešením je učinit deklaraci proměnné povinnou přidáním slova „Option Explicit“ v horní části modulu.

Co to udělá, je, že předtím, než se zobrazí chyba VBA „ByRef Argument Type Mismatch“, ve skutečnosti nás požádá, abychom nejprve deklarovali proměnnou.

Možnost Explicit se tedy ve VBA vždy hodí.

Věci k zapamatování

  • ByRef je opakem By Val.
  • ByRef přenáší odkaz z jedné procedury do druhé.
  • Název proměnné, datový typ by měl být v obou postupech stejný.
  • Každá proměnná musí být deklarována samostatně v případě více proměnných.