ByRef Argumenttyp Mismatch i Excel VBA
I den här artikeln förklarar vi felet som uppstod när du använde Excel VBA ByRef som ”Fel i argumenttypen”. Innan det låt mig först presentera dig för “By Ref”. Variabler är nyckeln till vilket programmeringsspråk som helst och VBA skiljer sig inte heller. Vi har sett många sätt att deklarera variabler. Ett sådant sätt att deklarera variabler är att använda orden "ByRef" och "ByVal".
Vad betyder ByRef?
"ByRef" betyder "med referens", med hjälp av detta ord kan vi faktiskt skicka argument till procedurer (för både sub & funktion) genom referens. Detta skiljer sig från sin bror ”By Val” som inte är flexibel men fast i naturen.
För att förstå detta, låt oss ta en titt på nedanstående två makron.
Koda:
Sub Makro1 () Dim A Så länge A = 50 Makro2 A MsgBox A End Sub Sub Macro2 (ByRef A Så länge) A = A * 10 End Sub
Vi har två delprocedurer som heter Macro1 respektive Macro2. För att förstå detta bättre, kör makrot rad för rad genom att trycka på F8-tangenten.
Tryck på F8-tangenten för att fånga värdet för variabeln "A" som 50.
Nästa rad kod säger "Macro2 A", dvs namnet på det andra makrot och "A" är variabeln som definieras genom "By Ref" -ordet.
Som du kan se ovan när vi kör koden "Macro2 A" har den hoppat till nästa VBA-underprocedur från ovanstående procedur.
Nu kan vi se att värdet på variabeln "A" är 50 detta beror på att eftersom vi har använt ordet "ByRef" för att deklarera variabeln "A" som är samma som i Macro1 har den fångat upp det värde vi har tilldelat denna variabel " A ”från Macro1 .
Nu i denna makro ( Makro2 ) ekvation säger A = A * 10 dvs A = 50 * 100. Tryck på F8-tangenten tre gånger för att gå tillbaka till ovanstående makro ( Macro1 ).
Tryck nu en gång till på F8-tangenten för att se värdet på variabeln "A" i meddelandefältet i VBA.
Värdet säger 500.
Även om värdet vi har tilldelat i detta makro (Macro1) är 50, med hjälp av ByRef-ordet utlöste vi faktiskt Macro2-delprocessen genom att behålla värdet på variabeln "A" från Macro1 och sedan utföra värdet A genom att multiplicera 10.
Topp 3 skäl till VBA Byref Argumenttyp Mismatch
Ovan har vi sett hur “ByRef” fungerar men vi måste göra några av de misstag som alltid resulterade i att ett VBA-felmeddelande kastades som “ByRef Argument Type Mismatch”.
Detta beror på många anledningar och i det här avsnittet visar vi dig hur du åtgärdar detta fel och felsöker koden.
Du kan ladda ner denna VBA ByRef Argumenttyp Mismatch Excel-mall här - VBA ByRef Argumenttyp Mismatch Excel-mallFel Orsak nr 1 - Olika variabla namn
En av de främsta anledningarna till att få detta fel i Excel VBA beror på olika variabler som skickats i två procedurer. För ett exempel, se nedanstående koder.
Koda:
Sub Makro1 () Dim A Så länge A = 50 Macro2 B MsgBox A End Sub Sub Makro2 (ByRef A Så länge) B = B * 10 End Sub
I Macro1 har vi använt "A" -variabel och i Macro2 har vi använt "B" -variabel. Om du nu försöker köra koden får vi VBA-fel som "ByRef Argument Type Mismatch".
Som du kan se ovan har variabel "B" markerats eftersom typen av variabelnamn är en oöverensstämmelse.
Lösning: För att lösa problemet måste vi se till att variabelnamnen i båda procedurerna är exakta.
Fel Orsak 2: Olika variabla datatyper
Även om variabla namn är desamma orsakar det ett fel, det beror på datatypen vi tilldelar dem. Titta på koden nedan.
Koda:
Sub Makro1 () Dim A som heltal A = 50 Macro2 A MsgBox A End Sub Sub Macro2 (ByRef A Så länge) A = A * 10 End Sub
I ovanstående koder har jag förklarat variabeln "A" som heltal datatyp i Macro1 och i Macro2 tilldelades samma variabel datatypen som "Long".
När vi kör den här koden kommer det att orsaka ett vba-fel "ByRef Argument Type Mismatch".
Detta beror på att vi har tilldelat två olika datatyper för samma variabelnamn.
Lösning: Datatypen bör vara densamma i båda procedurerna.
Fel Orsak 3: Variabla datatyper saknas i en makro
Excel VBA-fel ”ByRef Argument Type Mismatch” kan inträffa på grund av datatyp som tilldelats i ett makro och inte tilldelats i ett annat makro.
Koda:
Sub Macro1 () A = 50 Macro2 A MsgBox A End Sub Sub Macro2 (ByRef A As Long) A = A * 10 End Sub
I ovanstående kod för Macro1 har jag inte förklarat någon variabel utan bara tilldelat värdet till variabeln.
Å andra sidan för Macro2 har jag deklarerat variabeln "A" så länge. Om du försöker köra den här koden kommer det att orsaka “ByRef Argument Type Mismatch” VBA-fel.
Lösning1: För att undvika denna typ av situationer är den första lösningen att deklarera variabeln i båda procedurerna och tilldela samma datatyp.
Lösning2: En alternativ lösning är att göra variabeldeklarationen obligatorisk genom att lägga till ordet “Option Explicit” högst upp i modulen.
Vad detta kommer att göra är att innan det visar VBA "ByRef Argument Type Mismatch" Error ber det oss faktiskt att deklarera variabeln först.
Så, Explicit Explicit kommer alltid till nytta i VBA.
Saker att komma ihåg
- ByRef är motsatsen till By Val.
- ByRef bär referensen från ett förfarande till ett annat.
- Variabelnamnet, datatypen ska vara densamma i båda procedurerna.
- Varje variabel måste deklareras separat om det finns flera variabler.