You will encounter the ‘ByRef argument type mismatch’ error in Excel VBA if you call a procedure or function and feed it with an argument of a different data type than the one expected by the procedure or function.
For instance, you will encounter the ‘ByRef argument type mismatch’ error if you call a procedure or function that expects an argument of string data type and pass an argument of integer data type to it.
What Does ByRef Mean in VBA?
‘ByRef’ is short for ‘By Reference.’
When you use ‘ByRef’ in a procedure, you pass the address of an argument instead of the value.
Passing the variable’s address means the procedure can access the actual variable and change its value.
By default, arguments are passed by reference unless specified otherwise.
‘ByRef’ is the opposite of ‘ByVal’ (By Value).
Passing a variable by value is when you pass a copy of the variable’s value to a procedure instead of passing the address.
Passing a variable’s value allows the procedure to access a copy of the variable without being able to change its actual value.
In this tutorial, I will show you four ways to fix Excel VBA’s ‘ByRef argument type mismatch’ error.
Method #1: Match the Data Types of Arguments Passed With those Expected
Ensure that the data types of the variables you pass as arguments match those expected by the procedure or function you have called.
Suppose you have the following code, which triggers the ‘ByRef argument type mismatch’ error.
Sub mainProcedure()
Dim myValue As Integer
myValue = 350
Call myProcedure(myValue)
End Sub
Sub myProcedure(ByRef inputValue As String)
Debug.Print inputValue
End Sub
The error happens because the ‘mainProcedure’ subroutine passes an argument ‘myValue,’ which is of Integer data type, to the ‘myProcedure’ subroutine that expects an argument of String data type.
To fix the error, you can either change the data type of the ‘myValue’ variable to a String that matches the data type expected by ‘myProcedure,’ or change the data type of the argument expected by ‘myProcedure’ to an Integer that matches the data type of the ‘myValue’ argument passed by ‘mainProcedure.’
Also read: VBA Runtime Error 91 – How to Fix?
Method #2: Use Explicit Conversion When Passing Arguments
When passing arguments, you can use explicit conversion to avoid the ‘ByRef argument type mismatch’ error.
Explicit conversion refers to using conversion functions such as ‘CStr,’ ‘Cint,’ ‘CDbl,’ etc.
Here’s an example:
Sub mainProcedure2()
Dim myValue As Integer
myValue = 350
Call myProcedure2(CStr(myValue))
End Sub
Sub myProcedure2(ByRef inputValue As String)
Debug.Print inputValue
End Sub
In this example, the ‘mainProcedure2’ subroutine declares an integer variable ‘myValue’ and then calls the ‘myProcedure2’ subroutine, passing ‘myValue’ after explicitly converting it to a string using the’CStr’ function.
By using ‘CStr(myValue),’ you ensure that even though ‘myValue’ is an integer, it gets converted to a string before being passed to ‘myProcedure2.’
This way, you avoid the ‘ByRef argument type mismatch’ error that might occur if you directly pass an integer to a procedure expecting a string.
Also read: VBA Type Mismatch Error (Error 13)
Method #3: Enter ‘Option Explicit’ at the Top of Your Modules
The ‘Option Explicit’ statement is a directive in VBA that forces you to explicitly declare all variables before using them in the code.
Including Option Explicit at the beginning of a VBA module requires you to explicitly declare every variable using the ‘Dim,’ ‘ReDim,’ ‘Static,’ ‘Private,’ ‘Public,’ or ‘Const’ keywords before using it.
The ‘Option Explicit’ directive forces you to declare all variables, helping catch undeclared variables that might lead to type mismatches.
Suppose you have the following code in a module without the ‘Option Explicit’ statement at the top:
Sub mainProcedure3()
Dim myValue, iValue As Integer
myValue = 350
iValue = 450
Call myProcedure3(myValue)
End Sub
Sub myProcedure3(ByRef inputValue As Integer)
Debug.Print inputValue
End Sub
You will encounter the ‘ByRef argument type mismatch’ error when you run the code.
The error occurs because the ‘mainProcedure3’ subroutine passes a variant ‘myValue’ variable (no specific data type) to the ‘myProcedure3’ subroutine expecting an argument of Integer data type.
Unlike some programming languages, VBA doesn’t let you declare a group of variables as a particular data type by separating the variables with commas.
For example, the following statement in the above code, although valid, does not declare all the variables as integers:
Dim myValue, iValue As Integer
In VBA, only ‘iValue’ is declared an integer; the ‘myValue’ variable is declared a variant.
To declare ‘myValue’ and ‘iValue’ as integers, use the following statement:
Dim myValue As Integer, iValue As Integer
To prevent the mistake of trying to declare a group of variables as a specific data type by separating them with commas, you can add the statement ‘Option Explicit’ at the top of the module.
This declaration will make VBA require you to explicitly declare each variable you plan to use in your code.
If you want VBA to add the statement for you in each module automatically, you can do the following:
- In VB Editor, open the ‘Tools’ menu and select ‘Options.’
- Select the ‘Require Variable Declaration’ checkbox on the’ Options’ dialog box and click OK.
Note: VBA will automatically add ‘Option Explicit’ in new modules. For older modules, you must add the statement manually.
Method #4: Use the Variant Data Type
You can use the Variant data type if an argument’s data type is uncertain. However, because this data type can slow your code, only use it when necessary.
The code example below uses the variant data type to handle a ‘Cancel’ click:
Sub mainProcedure4()
Dim userAge As Variant
userAge = InputBox("Enter your age:")
Call myProcedure4(userAge)
End Sub
Sub myProcedure4(ByRef inputValue As Variant)
Debug.Print inputValue
End Sub
Explanation of the Variant Data Type
The ‘Variant’ data type is versatile and can hold any data type, including numbers, strings, dates, and objects.
When you declare a variable as a ‘Variant,’ it can dynamically change its data type at runtime based on the value assigned to it.
The ‘Variant’ type is handy when you need a variable to handle different data types dynamically.
Although the ‘Variant’ type has flexibility, it has some trade-offs. Unlike variables with specific data types, variables of the ‘Variant’ type consume more memory.
Additionally, runtime dynamic type checking can slow down the code.
In this article, I explained the ‘ByRef argument type mismatch’ error and showed four ways to fix it.
I hope you found the tutorial helpful.
Other Excel articles you may also like: