VBA ByRef-argumenttype komt niet overeen Fout - Top 3 redenen en foutoplossingen

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 deze manieren om variabelen te declareren is door de woorden "ByRef" en "ByVal" te gebruiken.

Wat betekent ByRef?

"ByRef" betekent "By Reference" met dit woord, we kunnen in feite argumenten doorgeven aan procedures (voor zowel sub & 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, respectievelijk Macro1 en Macro2. 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, is het op het moment dat we de regel met code "Macro2 A" uitvoeren, gesprongen naar de volgende VBA-subprocedure van de bovenstaande procedure.

Nu kunnen we zien dat de waarde van de 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 hebben toegewezen aan deze variabele "A" uit 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 het gooien van een VBA-foutmelding als "ByRef Argument Type Mismatch".

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

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. Bekijk bijvoorbeeld 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 variabele "A" gebruikt en in Macro2 de variabele "B". 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

Ook al zijn variabelenamen hetzelfde, toch 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 het gegevenstype Geheel getal in Macro1, en in Macro2 kreeg dezelfde variabele het gegevenstype 'Lang' toegewezen.

Wanneer we deze code uitvoeren, veroorzaakt dit een VBA-fout 'ByRef Argument Type Mismatch'.

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

Oplossing: het gegevenstype moet in beide procedures hetzelfde zijn.

Foutreden 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, voor Macro2, heb ik 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 voorkomen, 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" boven aan de module toe te voegen.

Wat dit zal doen is dat voordat het VBA "ByRef Argument Type Mismatch" -fout laat zien, het ons eigenlijk vraagt ​​om eerst de variabele 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.

Interessante artikelen...