Napaka neujemanja vrste argumenta VBA ByRef - Top 3 razlogi in popravki napak

Neujemanje vrste argumenta ByRef v Excelu VBA

V tem članku razlagamo napako, do katere je prišlo pri uporabi Excel VBA ByRef, kot »Napaka neujemanja vrste argumenta«. Pred tem naj vam najprej predstavim “By Ref”. Spremenljivke so ključne za kateri koli programski jezik in tudi VBA se ne razlikuje. Videli smo že veliko načinov razglasitve spremenljivk. Eden takih načinov razglasitve spremenljivk je uporaba besed "ByRef" in "ByVal."

Kaj pomeni ByRef?

"ByRef" pomeni "z referenco" z uporabo te besede lahko dejansko posredujemo argumente postopkom (tako za pod & funkcijo) s sklicevanjem. To je za razliko od njegovega brata "By Val", ki ni prilagodljiv, ampak je fiksne narave.

Da bi to razumeli, si oglejmo spodnja dva makra.

Koda:

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

Tu imamo dva podprocedura z imenom Macro1 in Macro2. Če želite to bolje razumeti, zaženite makro vrstico za vrstico s pritiskom na tipko F8.

Pritisnite tipko F8, da zajamete vrednost spremenljivke "A" kot 50.

V naslednji vrstici kode piše "Macro2 A", tj. Ime drugega makra in "A" je spremenljivka, definirana z besedo "By Ref".

Kot lahko vidite zgoraj, je v trenutku, ko izvedemo vrstico kode "Macro2 A", ta preskočila na naslednji podproces VBA iz zgornjega postopka.

Zdaj lahko vidimo, da je vrednost spremenljivke "A" 50. To je zato, ker ker smo uporabili besedo "ByRef" za razglasitev spremenljivke "A", ki je enaka kot v Macro1, je zajela vrednost, ki jo imamo dodeljena tej spremenljivki "A" iz makra1 .

Zdaj v tej enačbi makra ( Macro2 ) piše A = A * 10, tj. A = 50 * 100. Pritisnite tipko F8 trikrat, da se vrnete na zgornji makro ( Macro1 ).

Zdaj pritisnite še enkrat tipko F8, da vidite vrednost spremenljivke "A" v polju za sporočila v VBA.

Vrednost pravi 500.

Čeprav je vrednost, ki smo jo dodelili v tem makru (Macro1), 50, smo z besedo ByRef dejansko sprožili podproces Macro2, tako da smo ohranili vrednost spremenljivke "A" iz Macro1 in nato izvedli vrednost A z množenjem 10.

Top 3 razlogi za neujemanje vrste argumenta tipa VBA Byref

Zgoraj smo videli, kako deluje »ByRef«, vendar smo se zavezali, da bomo naredili nekaj napak, zaradi katerih je vedno prišlo do sporočila o napaki VBA kot »Neujemanje vrste argumenta ByRef«.

To je zaradi številnih razlogov in v tem razdelku vam bomo pokazali, kako odpraviti to napako in odpraviti napako v kodi.

Razlog napake št. 1 - različna imena spremenljivk

Eden glavnih razlogov za to napako v programu Excel VBA je posledica različnih spremenljivk, ki so bile posredovane v dveh postopkih. Na primer, poglejte spodnje kode.

Koda:

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

V Makro1 smo uporabili spremenljivko "A", v Makro2 pa spremenljivko "B". Če poskusite zagnati kodo, bomo dobili napako VBA kot »Neujemanje vrste argumenta ByRef«.

Kot lahko vidite zgoraj, je bila spremenljivka "B" poudarjena, ker je vrsta imena spremenljivke neusklajena.

Rešitev: Da bi odpravili to težavo, moramo zagotoviti, da sta imeni spremenljivk v obeh postopkih natančni.

Razlog za napako 2: različne vrste spremenljivk

Čeprav so imena spremenljivk enaka, kljub temu povzroči napako, to pa zaradi podatkovnega tipa, ki jim ga dodelimo. Poglejte spodnjo kodo.

Koda:

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

V zgornjih kodah sem spremenljivko "A" razglasil za celoštevilčni podatkovni tip v Makro1, v Makro2 pa je bila isti spremenljivki dodeljena vrsta podatkov kot "Dolga".

Ko zaženemo to kodo, bo povzročila napako VBA »ByRef Argument Type Mismatch«.

To je zato, ker smo za isto ime spremenljivke dodelili dva različna podatkovna tipa.

Rešitev: vrsta podatkov mora biti v obeh postopkih enaka.

Razlog za napako 3: V enem makru manjkajo spremenljivi tipi podatkov

Napaka v Excelu VBA, »Neujemanje vrste argumenta ByRef«, se lahko zgodi zaradi vrste podatkov, dodeljene v enem makroju in ne v drugem makru.

Koda:

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

V zgornji kodi Macro1 nisem razglasil nobene spremenljivke, temveč sem ji preprosto dodal vrednost.

Po drugi strani pa sem za Macro2 spremenljivko A razglasil tako dolgo. Če poskusite zagnati to kodo, bo povzročila napako VBA »ByRef Argument Type Mismatch«.

Rešitev1: Da bi se izognili tovrstnim situacijam, je prva rešitev deklariranje spremenljivke v obeh postopkih in dodelitev istega tipa podatkov.

Rešitev 2: Druga možnost je, da deklaracijo spremenljivke naredite obvezno, tako da na vrh modula dodate besedo »Izrecno za možnost«.

To bo storilo tako, da preden prikaže VBA »ByRef Argument Type Mismatch«, napaka, dejansko najprej zahteva, da spremenljivko najprej prijavimo.

Torej, Option Explicit je vedno primeren za VBA.

Stvari, ki si jih je treba zapomniti

  • ByRef je nasprotje By Val.
  • ByRef prenaša sklicevanje iz enega postopka v drugega.
  • Ime spremenljivke in podatkovni tip morata biti v obeh postopkih enaka.
  • Vsako spremenljivko je treba prijaviti ločeno v primeru več spremenljivk.

Zanimive Članki...