VBA ByRef-argumenttype komt niet overeen

ByRef-argumenttype komt niet overeen in Excel VBA

In dit artikel leggen we de fout uit die is opgetreden tijdens het gebruik van Excel VBA ByRef als "Argument Type Mismatch Error". Laat me je eerst voorstellen aan "By Ref". Variabelen zijn de sleutel tot elke programmeertaal en VBA is ook niet anders. We hebben veel manieren gezien om variabelen te declareren. Een van die manieren om variabelen te declareren is door de woorden "ByRef" en "ByVal" te gebruiken.

Wat betekent ByRef?

"ByRef" betekent "By Reference", door dit woord te gebruiken kunnen we in feite argumenten doorgeven aan procedures (voor zowel sub als functie) door middel van verwijzing. Dit is in tegenstelling tot zijn broer "By Val" die niet flexibel maar vast van aard is.

Laten we, om dit te begrijpen, de onderstaande twee macro's eens bekijken.

Code:

 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 

We hebben hier twee subprocedures die respectievelijk Macro1 en Macro2 worden genoemd. Om dit beter te begrijpen, voert u de macro regel voor regel uit door op de F8-toets te drukken.

Druk op de F8-toets om de waarde van variabele "A" vast te leggen als 50.

De volgende regel code zegt "Macro2 A", dwz de naam van de tweede macro en "A" is de variabele gedefinieerd door het woord "By Ref".

Zoals je hierboven kunt zien op het moment dat we de regel code "Macro2 A" uitvoeren, is het naar de volgende VBA-subprocedure van de bovenstaande procedure gesprongen.

Nu kunnen we zien dat de waarde van variabele "A" 50 is, dit komt omdat, aangezien we het woord "ByRef" hebben gebruikt om de variabele "A" te declareren, die hetzelfde is als in Macro1, het de waarde heeft vastgelegd die we aan deze variabele hebben toegewezen " A ”van de Macro1 .

Nu zegt in deze macro ( Macro2 ) vergelijking A = A * 10 dwz A = 50 * 100. Druk 3 keer op de F8-toets om terug te gaan naar de bovenstaande macro ( Macro1 ).

Druk nu nog een keer op de F8-toets om de waarde van variabele "A" in het berichtvenster in VBA te zien.

De waarde zegt 500.

Hoewel de waarde die we hebben toegewezen in deze macro (Macro1) 50 is, hebben we door het ByRef-woord te gebruiken feitelijk de Macro2-subprocedure geactiveerd door de waarde van variabele "A" uit Macro1 te behouden en vervolgens de waarde van A uit te voeren door 10 te vermenigvuldigen.

Top 3 redenen voor VBA Byref-argumenttype komt niet overeen

Hierboven hebben we gezien hoe "ByRef" werkt, maar we zullen zeker een aantal van de fouten maken die steevast resulteerden in een VBA-foutmelding als "ByRef Argument Type Mismatch".

Dit is om vele redenen en in deze sectie laten we u zien hoe u deze fout kunt corrigeren en de code kunt debuggen.

U kunt deze VBA ByRef Argument Type Mismatch Excel-sjabloon hier downloaden - VBA ByRef Argument Type Mismatch Excel-sjabloon

Foutreden # 1 - Verschillende variabelenamen

Een van de belangrijkste redenen om deze fout in Excel VBA te krijgen, is te wijten aan verschillende variabelen die in twee procedures zijn doorgegeven. Kijk voor een voorbeeld naar de onderstaande codes.

Code:

 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 

In Macro1 hebben we de “A” -variabele gebruikt en in Macro2 hebben we de “B” -variabele gebruikt. Als u nu de code probeert uit te voeren, krijgen we VBA-fout als "ByRef Argument Type Mismatch".

Zoals u hierboven kunt zien, is variabele "B" gemarkeerd omdat het type variabelenaam niet overeenkomt.

Oplossing: om dit probleem op te lossen, moeten we ervoor zorgen dat de variabelenamen in beide procedures exact zijn.

Foutreden 2: verschillende variabele gegevenstypen

Hoewel variabelenamen hetzelfde zijn, veroorzaakt het een fout, dit komt door het gegevenstype dat we eraan toewijzen. Kijk naar de onderstaande code.

Code:

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

In de bovenstaande codes heb ik variabele "A" gedeclareerd als integer datatype in Macro1 en in Macro2 werd aan dezelfde variabele het gegevenstype toegewezen als "Lang".

Wanneer we deze code uitvoeren, zal dit een vba-fout veroorzaken "ByRef Argument Type Mismatch".

Dit komt doordat we twee verschillende gegevenstypen hebben toegewezen aan dezelfde variabelenaam.

Oplossing: het gegevenstype moet in beide procedures hetzelfde zijn.

Fout Reden 3: Variabele gegevenstypen ontbreken in één macro

De Excel VBA-fout "ByRef Argument Type Mismatch" kan optreden als gevolg van het gegevenstype dat is toegewezen in de ene macro en niet is toegewezen in een andere macro.

Code:

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

In de bovenstaande code van Macro1 heb ik geen enkele variabele gedeclareerd, maar de waarde simpelweg aan de variabele toegewezen.

Aan de andere kant heb ik voor Macro2 de variabele "A" zo lang gedeclareerd. Als u deze code probeert uit te voeren, zal dit de VBA-fout "ByRef Argument Type Mismatch" veroorzaken.

Oplossing 1: om dit soort situaties te vermijden, is de eerste oplossing om de variabele in beide procedures te declareren en hetzelfde gegevenstype toe te wijzen.

Oplossing 2: een alternatieve oplossing is om de variabeledeclaratie verplicht te maken door het woord “Option Explicit” bovenaan de module toe te voegen.

Wat dit zal doen is dat voordat het VBA "ByRef Argument Type Mismatch" -fout laat zien, het ons daadwerkelijk vraagt ​​om de variabele eerst te declareren.

Option Explicit komt dus altijd van pas in VBA.

Dingen om te onthouden

  • ByRef is het tegenovergestelde van By Val.
  • ByRef draagt ​​de referentie van de ene procedure naar de andere.
  • De variabelenaam, het gegevenstype moet in beide procedures hetzelfde zijn.
  • Elke variabele moet afzonderlijk worden gedeclareerd in het geval van meerdere variabelen.