What is variant in vba excel

A VBA Variant is a VBA variable that has not been declared to have a specific data type.  It can therefore hold any type of data that VBA variables are able to hold – be it text, numbers, dates, time or objects.  

Variants use more memory than variables in which the data type is specified, and therefore can slow down the execution of the program that you are running. 

If you have large procedures or complicated code, this speed can be extremely important in the efficient running of your program. So the rule of the thumb should be to always specify what data is going to be held in your variable by explicitly declaring them.

Why would I use a variant then?

There may be some occasions where you need to use a variant.  When you declare your variables, you are restricted to what type of data is stored in the variable – so if you declare an integer, for example, the data that is stored in that variable has to be between -32768 to 32767.  If the number that is going into that variable falls outside of that scope, your code will end up throwing an error.

This would be particularly annoying if you were importing data into Excel from a database using VBA code for example – some of the data may need ‘cleaning’ – a number may perhaps have a rogue letter in it and therefore if imported as a number, would end up breaking the program at that point.  Using a variant variable could solve this problem.

Sub Test1()
Dim ProductPrice As Currency
Dim Qty As Double
Dim TaxAmount as Currency
Dim FinalAmount as Currency

ProductPrice = "$5.00 "
Qty = "10"
TaxAmount = "$4.14"
FinalAmount = "$54.14"

Range("A1 ") = ProductPrice
Range("B1 ") = Qty
Range("C1 ") = TaxAmount
Range("D1 ") = FinalAmount

However, when you try to run this code, the following error appears.

Messagebox showing "Run-time error '13': Type Mismatch"

This is due to the dollar signs that are in the data – the Product Price, Tax Amount and Final Amount have been declared as numbers – yet the data being populated into those variables contains a $ – therefore turning the number into a string – hence an error will occur.

However, if you amend your code…

Sub Test2()
Dim ProductPrice As Variant
Dim Qty As Variant
Dim TaxAmount as Variant
Dim FinalAmount as Variant

ProductPrice = "$5.00 "
Qty = "10"
TaxAmount = "$4.14"
FinalAmount = "$54.14"

Range("A1 ") = ProductPrice
Range("B1 ") = Qty
Range("C1 ") = TaxAmount
Range("D1 ") = FinalAmount

The correct information will then go into your Excel file:

Excel row is populated correctly

If you look at the formula bar, you will see that Excel has brought in A1, C1 and D1 as numbers formatted for currency.

The number 5 is in the formula bar

So even though you declared your variables as variants, Excel cleverly knew to bring them in as numbers.

Things to remember and to watch out for

Variant variables take more memory and slow down your program

The Variant data type is automatically specified by the type of data it takes in – so in the four variables we created, three of them would have been string variables and one would have been a number variable.

Variant variables take in any data – which might make your code more difficult to debug.

In summary, if you know what data you are going to be storing in your variable, a good rule to follow is to always EXPLICITLY declare your variables ie as a string, integer, double or single for example.  If you are worried about data being stored that it not of a specific type – then declare your variable IMPLICTLY using a VARIANT.

Excel VBA Tutorial about data typesHave you ever thought about the main purpose of Visual Basic for Applications?

In Excel VBA Programming for Dummies, Excel authority John Walkenbach provides the following interesting answer to this question:

VBA’s main purpose is to manipulate data.

For purposes of this VBA tutorial, the key term within the above statement is “data”. If the main purpose of Visual Basic for Applications is to manipulate data, having a good understanding of what are the different VBA data types is essential for mastering VBA.

My purpose with this post is to help you understand VBA data types and how to work with them. In this guide, I cover and thoroughly explain the most relevant aspects of the different VBA data types, including the following:

In this particular post, I don’t cover the topic of variable declaration in detail. This is covered in this blog post about variable declaration.

How Data Is Stored And Why VBA Data Types Are Important

Data is generally stored in the computer’s memory. If you have a basic understanding of computers, you’re probably familiar with how this works.

However, for VBA purposes, there is an important distinction to be made between objects and variables. As Walkenbach explains in Excel VBA Programming for Dummies:

  • Some data is stored in objects.
  • Other data is stored in variables.

I explain what “objects” and “variables” are in this VBA Tutorial for Beginners. To summarize:

  • An object is what is manipulated by Visual Basic for Applications.

    Some examples of objects are Excel workbooks, worksheets, cell ranges and cells.

  • A variable is a storage location paired with a name. You generally use variables to represent a particular value. In other words, variables act as placeholders for values.

    You can create variables in Visual Basic for Applications by declaring them. You determine the name and characteristics of any variable you create. One of the characteristics that you can determine is the VBA data type.

The ability to determine the characteristics of the variables you create in VBA is probably the main reason why understanding VBA data types is important. Let’s see why this is the case:

VBA data types determine the way in which data is stored in the memory.

There are several VBA data types. These data types have different nominal allocation requirements. This means that different types use a different amount of bytes.

The general rule that you should apply when determining which data type to use is set forth by John Walkenbach in Excel VBA Programming for Dummies:

In general, choose the data type that uses the smallest number of bytes but can still handle all the data you want to store (…).

The reason for this is that there is an inverse relation between execution speed and the amount of bytes used by the relevant data. In other words, the more bytes your data uses, the slower your VBA application runs.

As this makes it clear, in order to be able to make appropriate decisions about the VBA data types that you want to use, you must understand the basic characteristics of each of the main types. Mastering this topic is very important, particularly as you start creating and developing more complex VBA applications. The main reason for this is that inadequate choices of VBA data types can result in slower execution of those applications and, in general, an inefficient use of the memory.

Introduction To Why You Shouldn’t Always Allow VBA To Handle Data Types Automatically

Programming languages are usually classified as strongly typed or weakly typed.

Strongly typed languages usually require that you define the data type for every variable that you use. Visual Basic for Applications isn’t one of these languages. Therefore, VBA is able to handle the details related to data types automatically.

More precisely, if you don’t declare the VBA data type for a particular variable, Visual Basic for Applications uses the default type. The default VBA data type is called Variant, and I explain it below.

The question is:

Should you allow Visual Basic for Applications to automatically set the VBA data types for the variables you use?

Generally, no. You should get used to declaring the VBA data types of the variables you create always.

However, the answer to the question isn’t as straightforward as the statement above may make it seem.

Allowing Visual Basic for Application to automatically deal with VBA data types for variables has advantages. The main advantage is, evidently, that by allowing VBA to handle data types, you don’t have to do it yourself. This may sound more convenient, but wait…

As I mentioned above, inappropriate choices of VBA data types can result in problems down the road, including slower application execution. More precisely, if you always rely on the default Variant data type, you’ll likely start noticing that your VBA applications run relatively slow and require more memory than necessary. I explain the reason for this below.

Therefore, if you’re committed to becoming a powerful VBA user, you must have a good grasp of VBA data types and, when required, be able to choose the most appropriate one.

So, should you always deal with VBA data types yourself?

Generally, declaring the variables that you use in order to determine their VBA data type explicitly is a good practice. However, if you don’t want to do this, you can carry out your own cost-benefit analysis considering the following criteria:

  • As explained in Excel VBA Programming for Dummies, “letting VBA handle your data typing results in slower execution and inefficient memory use.”
  • Despite the above, Microsoft explains how using the Variant data type allows you to handle data more flexibly.
  • How noticeable are the issues of slower execution and inefficient memory use generally depends on the size and complexity of the relevant VBA application. Therefore, in small applications or applications that don’t use many variables, allowing Visual Basic for Applications to handle the VBA data types directly shouldn’t generate big issues.
  • However, when you’re working with big and/or complex applications, letting VBA deal with data types automatically isn’t very advisable. In these cases, you want to conserve as much memory as possible. A good knowledge of VBA data types is essential in achieving an efficient use of memory when developing VBA applications.

In the words of John Walkenbach:

Letting VBA handle data types may seem like an easy way out – but remember that you sacrifice speed and memory.

In addition to the above, as explained in Mastering VBA for Microsoft Office 2013, not declaring the variables makes your VBA code harder to read and debug.

There are additional reasons to always declare your variables when working with Visual Basic for Applications. Let’s take a look at 2 further reasons, explained by Walkenbach in Excel 2013 Power Programming with VBA and Excel VBA Programming for Dummies.

Reason #1: Possible Misinterpretation Of Intended VBA Data Type When Using Variant VBA Data Type

According to Mastering VBA for Microsoft Office 2013, one of the disadvantages of using the Variant VBA data type is that VBA can misinterpret the data sub-type that you intended. This can lead to “rather obscure bugs”.

Let’s take a look at a very simple example, involving strings and numbers, to illustrate this point.

Take a look at the following piece of very simple VBA code.

VBA code with Variant data type

This Excel VBA Data Types Tutorial is accompanied by an Excel workbook containing the data and macros I use (including the Variant_Concatenation macro above). You can get immediate free access to this example workbook by subscribing to the Power Spreadsheets Newsletter.

The 3 main statements of the Variant_Concatenation macro above carry out the following actions:

  • “ExVar = “1”” assigns 1 to the variable ExVar. Since ExVar hasn’t been declared, it is of the Variant VBA data type.
  • “ExVar = ExVar + ExVar + ExVar” performs an operation. The + operator is applied to the variable ExVar.
  • “MsgBox ExVar” displays a dialog box with the expression that is currently stored by the variable ExVar.

The question is, what is the value displayed in the message that appears within the dialog box at the end of the Variant_Concatenation macro?

At first glance, it may appear that the dialog box should display the number 3. After all, the second line seems to be adding ExVar three times, and ExVar has previously been assigned 1. 1 + 1 + 1 = 3, right?

Well…

Even though the reasoning above makes sense, the rules that apply in Visual Basic for Applications can be slightly different to what we’re used to. Let’s take a look at the actual dialog box that is displayed when I run the Variant_Concatenation macro:

Example of result obtained when working with VBA data type Variant

111? Where’s the 3 that we were expecting?

If you’re familiar with VBA, you may have noticed some of the issues that the piece of VBA code that appears above has. Note how, when assigning 1 to the variable ExVar, the number 1 is enclosed in quotation marks (“”).

Example of VBA data type Variant variable

This means that the number 1 is actually a string instead of a number. When you’re working with variables that contain strings and you use the + operator, Visual Basic for Applications concatenates all the strings.

Therefore, if “1” is a string, “1 + 1 + 1” is not equal to 3. The correct answer, in that case, is the one that appears in the dialog box above: 111.

Microsoft explains this particular characteristic of the Variant VBA data type by stating that, when a Variant variable contains digits, the interpretation depends on the context. Therefore, depending on such context, those digits may be interpreted as either a string (as in the example above) or the actual value.

This particular problem is not caused exclusively by the use of the Variant VBA data type. The assignment of the variable could’ve probably been better structured. Nonetheless, this is a further reason to avoid relying on the Variant data type always.

If you still want to rely on the Variant VBA data type, there are ways to determine the VBA data sub-type of any Variant variable. I show how you can apply these methods to the Variant_Concatenation macro in a section below.

Reason #2: Shortcut For Inserting Variables In VBA Code When Working With Declared Variables

Let’s take a look at the following piece of VBA code. The purpose of this macro is to delete blank rows in Excel. Notice how the variable iCounter is properly declared.

vba code example why declare variables

Imagine that you’re creating the first version of this macro. And you’re typing at the following point:

Shortcut for typing VBA code with declared variables

Theoretically, you must type the whole name of the variable: “iCounter”. However, since the variable has been declared at the beginning of the Sub procedure, you can use the keyboard shortcut “Ctrl + Spacebar” once you’ve written the first couple of characters (usually 2 or 3 are enough). When you do this, the Visual Basic Editor does one of the following:

  • If it knows exactly to what particular word (this applies to variables, reserved words or functions) you’re referring to, it completes the entry.

    This is what happens in the case above. The following image shows what happens once I use the “Ctrl + Spacebar” shortcut:

    Example of VBA variable typing shortcut

  • If it isn’t sure about what word you’re referring to, it displays a list of possible words from which you can select.

    For example, let’s assume for a second that the Delete_Empty_Rows macro that appears above has 2 declared variables: iCounter and iCounter1. In that case, the Visual Basic Editor looks as follows:

    Example of shortcut for completing VBA variables

How To Remind Yourself To Declare VBA Data Types

You may be convinced that it is a good idea to always declare VBA data types when creating variables. However…

We all forget things sometimes.

Therefore, it’s not surprising that, from time to time and despite our best efforts to the contrary, we forget to determine the VBA data type of a variable. Additionally, since Visual Basic for Applications is able to handle VBA data types automatically, you may not even notice this happening.

Fortunately, you can force yourself to declare all the variables that you use. To do this, you simply need to use the Option Explicit statement.

When enabled, the Option Explicit statement requires that you explicitly define all the variables in the VBA module where that particular statement appears.

How do you enable the Option Explicit statement?

Easy, simply type “Option Explicit” at the top (before any other code) of the relevant VBA module. You only need to do this once per module. However, you’ll need to include the statement in any separate modules to which you want the Option Explicit option to apply.

If you want to take it a step further, you can have the Visual Basic Editor automatically insert the Option Explicit statement at the beginning of any future VBA modules. You can do this by customizing the code settings of the VBE in order to enable the Require Variable Declaration option. I explain how to do this in this VBE tutorial.

If the Option Explicit statement is enabled, you’ll simply not be able to run VBA code that contains undeclared variables.

Enabling the Option Explicit statement has an additional advantage: it helps you to spot typos or misspellings that, otherwise, might have been difficult to see. Let’s see how this works in practice by checking a macro that deletes empty rows.

For this example, I’ll use the macro whose VBA code appears in the image below, named Delete_Empty_Rows_2. I explain this macro in detail (and show how it works in practice) in this post.

VBA code including VBA data types

In this particular macro, 2 variables are declared at the beginning: aRow and BlankRows. Both variables are of the Range VBA data type.

Now, let’s focus on the BlankRows variable. The image below shows how this particular variable is used several times in this particular Sub procedure.

VBA data type example: variable

Imagine that, while typing the VBA code, a typo somehow manages to squeeze in (just one). Instead of typing “BlankRows” (the appropriate name), you type “BlamkRows” (similar, but not the same).

Example of typo in VBA variable name

As you may imagine, such typos may be difficult to spot in some situations. If you don’t notice the mistake, the macro may not work as originally intended.

However, if you have enabled the Option Explicit statement, Visual Basic for Applications displays a prominent warning. Take a look at the screenshot below and notice how easy is to notice that “BlankRows” is misspelled.

vba code with variable not defined

Variant VBA Data Type

Variant is the default VBA data type. In other words, this is the data type that Visual Basic for Applications uses when you don’t determine the type yourself at the moment of declaring a variable. You can, however, also declare a Variant variable explicitly.

In Excel VBA Programming for Dummies, John Walkenbach likens the Variant VBA data type with a chameleon. In other words, data that is of the Variant type “changes type depending on what you do with it.” This allows you to work with data more flexibly.

This sounds great! Who wouldn’t want this?

Well…

Not having to worry about VBA data types sounds great in theory but isn’t as simple in practice. Variant is, as a general rule, not the most efficient data type. This inefficiency is caused, funnily enough, by its chameleon-like characteristics.

More precisely, in order for Variant to behave like a chameleon and change of type depending on the context, Visual Basic for Applications must carry out certain checks for determining like which type should Variant behave. As you can imagine, carrying out these checks repeatedly requires more time and memory.

As explained in Mastering VBA for Microsoft Office 2013, the Variant VBA data type requires more memory than any of the other data types, excluding very long strings. More precisely:

  • Variant variables with numbers require 16 bytes of memory.
  • Variables of the Variant data type with characters usually require 22 bytes of memory plus the memory required by the string.

And this is one of the reasons why I generally suggest that you get used to declaring the VBA data type of your variables and use other VBA data types different from Variant. When you do this, Visual Basic for Applications doesn’t need to be constantly carrying checks (as it does with Variant). This usually results in faster, snappier and better VBA applications, and more efficient memory management.

Let’s take a look at a few additional characteristics of the Variant VBA data type:

  • When it comes to numeric data, you can store numbers within the following ranges:

    For negative numbers: -1.797693134862315E308 to -4.94066E-324.

    For positive numbers: 4.94066E-324 to 1.797693134862315E308.

  • Variant’s ability to handle different types of VBA data isn’t absolute. In particular, Variant variables can’t contain fixed-length string data.

    I explain what fixed-length string data is below. In that same section, I also explain the String data type, which is the one you’ll have to use in such cases.

  • Variables of the Variant VBA data type can contain 4 additional special values:

    Value #1: Empty, meaning that no value has been assigned to the variable. You can see an example of this below.

    Value #2: Error, which is used for purposes of indicating errors in the relevant procedure.

    Value #3: Nothing, which you can use when disassociating a variable from an object it was previously associated to.

    Value #4: Null, which indicates that the variable contains no valid data.

Byte VBA Data Type

The Byte VBA data type is the one that requires less memory: only 1 byte.

Variables whose VBA data type is Byte can be used to store numbers between 0 and 255.

Boolean VBA Data Type

If you’ve ever studied Boolean algebra, you may remember that the states of the variables are TRUE and FALSE.

The Boolean VBA Data Type follows this logic. In other words, variables whose VBA data type is Boolean can only be set to one of the following 2 values:

  • TRUE.
  • FALSE.

In general Boolean algebra, TRUE and FALSE are usually denoted by 1 and 0 respectively. However, in Visual Basic for Applications, conversions between Booleans and numeric VBA data types work slightly different:

  • When converting a Boolean variable to a numeric VBA data type, TRUE becomes –1 and FALSE becomes 0.
  • When converting a numeric VBA data type into a Boolean, 0 becomes FALSE and all other values (regardless of whether they’re negative or positive) become TRUE.

Boolean variables require 2 bytes of memory.

Currency VBA Data Type

As you’d expect, the Currency VBA data type is generally used in connection with monetary matters. However, as I explain below, you can use it for other purposes as well.

The Currency VBA data type is exact. The Single and Double data types that I explain below are rounded.

Currency variables can be used to store both positive and negative numbers. They’re stored as numbers in an integer format that is scaled by 10,000. As a consequence, these variables give fixed-point numbers whose length is up to:

  • 15 digits to the left side of the decimal point.
  • 4 digits to the right side of the decimal point.

As a consequence of the above, this data type allows for a range of values between -922,337,203,685,477.5808 and 922,337,203,685,477.5807.

Due to the fact that the Currency VBA data type is exact and these variables give fixed-point numbers, Currency is particularly useful for monetary calculations or fixed-point calculations where accuracy is very important.

The Currency data type takes up 8 bytes of memory.

Date VBA Data Type

This is another VBA data type whose name is self-explanatory.

Indeed, you won’t be surprised to confirm that Date variables can be used to store values that represent dates, times or both.

However, if you’ve been working with Excel for a while, you may have noticed that the way Excel and Visual Basic for Applications work with numbers isn’t necessarily the easiest to understand. Therefore, I provide a short introduction to this topic below.

As explained in Mastering VBA for Microsoft Office 2013, “VBA works with dates and times as floating-point numbers”. Let’s take a quick look at what this means:

Introduction To Floating-Point And Fixed-Point Numbers

Floating-point is a way of representing numbers. Under this formula, a number is represented in an approximate way to a certain number of significant digits. This is then scaled using an exponent.

However, the most critical point to understand is that the reason why this formula is called “floating-point” is due to the fact that the decimal point “floats”.

Computers can also store numbers as fixed-point numbers. You can see an example of this in the Currency VBA data type explained above. In the case of fixed-point numbers, the decimal points doesn’t “float”. It remains fixed in a certain location and, therefore, the number has always a fixed number of digits after or before the decimal point.

Working with floating-point numbers, generally, demands more computational resources. Therefore, the suggestion made in Mastering VBA for Microsoft Office 2013 is to use fixed-point numbers “whenever practical”.

Date Variables

Now that you have a basic understanding of floating-point and fixed-point numbers, let’s take a closer look at what the Date VBA data type can do.

In general terms, Date variables can store values representing:

  • Dates between January 1, 100 and December 31, 9999.
  • Times between midnight (00:00:00) and 23:59:59.

These values are stored as floating-point numbers, as follows:

  • The date appears to the left of the decimal point.
  • The time appears to the right of the decimal point.

The following are examples of how variables of numeric VBA data types are converted to the Date type:

  • 0 represents midnight.
  • 0.5 is midday.
  • Negative integers are dates before December 30, 1899.

Date VBA variables require 8 bytes of memory.

Decimal VBA Data Type

Decimal is one of VBA’s numeric data types.

More precisely, the Decimal VBA data type can be used to store integers scaled by a power of 10. This scaling factor varies depending on how many digits there are to the right side of the decimal point. The maximum number of these digits that a Decimal variable can hold is 28.

Considering the above, the following are the largest and smallest values for a Decimal variable:

  • If there are no decimal places at all: +/-79,228,162,514,264,337,593,543,950,335.
  • With the maximum number of decimal places (28), the largest value is +/-7.9228162514264337593543950335 and the smallest (excluding 0) is +/-0.0000000000000000000000000001.

In other words, the Decimal VBA data type gives you the largest amount of digits in order to represent a particular number. Therefore, it’s more appropriate for cases where you are performing calculations with large numbers that need to be very precise and can’t be subject to rounding errors.

The precision of the Decimal data type, comes at a cost in the form of a large memory requirement. The Decimal VBA data type requires 12 bytes, which is larger than the other numeric data types.

As explained by Microsoft, you can’t declare the Decimal VBA data type directly (just as you do with the other data types). Strictly speaking, Decimal is a sub-type of Variant. Therefore, in order to use Decimal, you must use the CDec conversion function.

Double VBA Data Type

The Double VBA data type is one of the non-integer numeric data types. This means that, just as decimal, it can be used to hold both integers and fractions.

More precisely, you can use Double to store floating-point numbers within the following ranges:

  • For negative numbers: -1.79769313486231E308 to -4.94065645841247E-324.
  • For positive numbers: 4.94065645841247E-324 to 1.79769313486232E308.

I provide a brief introduction to floating-point numbers above. You may however be wondering, why is this type of VBA data called double?

“Double” stands for “double-precision floating-point”. This makes reference to the number format which determines how the computer handles the number. There is also a Single VBA data type (explained below).

Double VBA variables require 8 bytes of memory.

Integer VBA Data Type

You can use the Integer VBA data type for storing integers between -32,768 to 32,767.

Integer variables only require 2 bytes. Due to its low memory requirements, the Integer VBA data type is usually the most efficient and better performing option for purposes of storing integers that fall within its range.

As explained by Microsoft, you can also use the Integer data type for purposes of representing enumerated values. Enumerated values:

  • Usually contain a finite set of unique natural numbers. Each of these numbers has a particular meaning.
  • Are commonly used for purposes of selecting among different options.

Long VBA Data Type

“Long” makes reference to “Long Integer”. As implied by its name, you can use the Long VBA data type for storing integer values that are within a “longer” range than the range of the Integer data type.

More precisely, by using the Long VBA data type you can store numbers between -2,147,483,648 and 2,147,483,647. If this range is still not enough for your purposes, you may want to use the Double VBA data type.

Long variables require 4 bytes of memory. As you’d expect, this is more than Integer variables (2), but less than Double variables (8).

Object VBA Data Type

You can use the Object VBA data type for purposes of storing addresses that refer to objects. In general, Object variables are a convenient way to refer to objects.

Variables of the Object type take up 4 bytes of memory.

Single VBA Data Type

I anticipated the existence of the Single VBA data type when introducing the Double type above. “Single” refers to “single-precision floating-point”, the number format that determines how the computer handles the number.

You can use the Single VBA data type for storing numbers within the following ranges:

  • For negative values: -3.402823E38 to -1.401298E-45.
  • For positive values: 1.401298E-45 to 3.402823E38.

Single variables require 4 bytes, half of those required by the Double VBA data type (8).

String VBA Data Type

For purposes of programming, a string is generally defined as a sequence of characters that represents the characters themselves (not a numeric value or other similar thing). Within Visual Basic for Applications, the String VBA data type is generally used to store text. However, this doesn’t mean that you should only use letters within String variables. In addition to letters, String variables can contain numbers, spaces, punctuation and special characters.

There are 2 different kinds of Strings. The amount of characters and memory required varies depending on the type.

Type #1: Variable-Length Strings

Variable-length String variables can contain anything from 0 up to approximately 2 billion characters. They take up 10 bytes of memory plus the memory that is required for the string itself.

Type #2: Fixed-Length Strings

Fixed-length String variables can contain between 1 and approximately 64,000 characters. These particular String variables require the amount of memory required by the string.

According to Mastering VBA for Microsoft Office 2013, fixed-length String variables “are rarely used in most programming”. The main exception is when managing databases where a rule specifying a maximum string length applies.

You may wonder what happens if the data that is assigned to a fixed-length String variable is different from the fixed length. Visual Basic for Applications handles this matter differently depending on whether the data assigned is shorter or longer than the fixed length:

  • If the data assigned is shorter, VBA adds trailing spaces in order to reach the fixed length.
  • If the assigned data is longer, Visual Basic for Applications truncates the data after the fixed length is reached. For these purposes, characters are counted from left to right.

    For example, if you assign the string “Tutorial” to a fixed-length String variable with a length of 3 characters, Visual Basic for Applications only stores “Tut”.

Other VBA Data Types

The above sections explain the most common VBA data types. From time to time, you may encounter some other data types, such as the ones I briefly introduce below.

LongLong VBA Data Type

The LongLong VBA data type is only valid on 64-bit platforms. This makes reference to how your computer is handling information.

According to tech website TweakTown, 92.8% of new Windows computers utilize 64-bit operating systems. You can find more information about the 32-bit and 64-bit versions of Windows here, including how to check which version your computer is running.

You can use the LongLong VBA data type to store numbers between -9,223,372,036,854,775,808 and 9,223,372,036,854,775,807.

LongLong variables require 8 bytes of memory.

LongPtr VBA Data Type

LongPtr isn’t (strictly speaking) a VBA data type. More precisely, the way LongPtr behaves depends on which platform is the relevant procedure running.

  • In 32-bit platforms, LongPtr becomes Long.
  • In 64-bit platforms, LongPtr becomes LongLong.

Both the range of values that can be stored using a LongPtr variable and the memory requirements vary accordingly.

As explained by Microsoft, one of the main uses of LongPtr is for pointers and handlers.

User-Defined VBA Data Types

Visual Basic for Applications allows you to create your own VBA data types. As you’d expect, these data types are known as user-defined data types.

In order to create a user-defined data type, you use the Type statement. These data types can contain 1 or more elements from the following:

  • Data types.
  • Arrays.
  • User-defined data types that have been defined previously.

User-defined VBA data types are highly dependent on their different components. For example:

  • The number of bytes required by a particular user-defined VBA data type depends on its elements.
  • The range of each of those elements is the one that applies to the relevant data type.

I may explain further details of user-defined VBA data types in future VBA tutorials. Please make sure to enter your email address below if you want to join the Power Spreadsheets Newsletter and be notified whenever I publish new material.

How To Decide Which VBA Data Type To Use

Now that you know about the main different VBA data types, you may be wondering…

How do I decide which VBA data type to use for a particular variable?

You already know the basic rule for choosing data types proposed by John Walkenbach. Under this general rule, your choice of data type is determined by the answers to the following 2 questions:

  • Which VBA data type(s) is(are) able to handle the data that you want to store?
  • Out of the VBA data type(s) that can handle the data you want to store, which data type uses the smallest number of bytes?

These guidelines may still feel a little bit general. Therefore, below are some general suggestions provided by Richard Mansfield in Mastering VBA for Microsoft Office 2013:

  • If the relevant variable will only contain logical values (TRUE and FALSE), use the Boolean VBA data type.
  • If the variable will always contain a string, use the String VBA data type.
  • If the variable will contain an integer use either the Integer or the Long VBA data type. The choice between Integer and Long depends on how big the relevant numbers are.

    Remember that neither Integer nor Long variables can be used to store fractions. Which takes us to the following point…

  • If the variable you’re declaring may contain fractions, use the Single or Double VBA data types. The decision to choose one or the other depends on the range of values the variable may store.
  • If you’ll be using the variable in operations where you can’t have rounding errors (you require no-rounding fractions), use the Currency or Decimal VBA data types. As in the previous cases, the exact choice of variable depends on the size of the exact numbers you’ll be storing.

You’ll notice that, in several of the above cases, which data type you should use depends on the range of values that you want the variable to be able to handle. Learning how to choose the appropriate VBA data type (considering factors such as the range) is critical and, as computers become more powerful and VBA develops, there may be further changes to the available data types.

For example, loop counters used to be declared using the Integer VBA data type, which can’t be larger than 32,767. Recent versions of Microsoft Excel can have 1,048,576 rows. This clearly exceeds the range that Integer variables can handle. Therefore, a more appropriate choice is using the Long VBA data type.

As you practice with Visual Basic for Applications, you’ll start becoming better and more comfortable deciding which VBA data type to use.

However, if you’re still not sure how these rules apply to a particular situation, this is a case where the Variant VBA data type may be of help. Let’s take a look at…

How To Find Out The VBA Data Sub-Type Of A Variant Variable

Remember that the Variant VBA data type behaves like a chameleon. Variant changes its sub-type depending on what particular action you’re carrying out with it.

Despite the downsides of relying on the Variant VBA data type that I have explained throughout this VBA tutorial, Variant can be quite helpful for purposes of testing a particular variable and determining what is the most appropriate data type to use.

Let’s take a look at 3 ways you can do this. In all examples, I use the Variant_Concatenation macro that I used above to illustrate how the Variant data type may result in possible misinterpretations of your intended VBA data type.

This Excel VBA Data Types Tutorial is accompanied by an Excel workbook containing the data and macros I use. You can get immediate free access to this example workbook by subscribing to the Power Spreadsheets Newsletter.

Testing A Variable Using The Variant VBA Data Type

I may cover the topic of debugging in future VBA tutorials. In this section I simply show you how to use the Locals Window and the Step Into command for purposes of determining which particular data type to use.

You can do this in the following 6 simple steps, as explained in Mastering VBA for Microsoft Office 2013.

Step #1: Display The Locals Window

For purposes of this process, the Locals Window of the Visual Basic Editor must be visible. This window displays all the variables in the relevant procedure, as well as their values.

You can usually see the Locals Window at the bottom of the VBE.

Location of the Locals Window in the VBE

If you can’t see the Locals Window in your VBE, you can ask the Visual Basic Editor to display it by clicking on “Locals Window” within the View menu.

Open Locals Window in Visual Basic Editor

Step #2: Step Into The Relevant VBA Sub Procedure

You can step into a procedure by using the “F8” keyboard shortcut or by choosing “Step Into” in the Debug menu of the Visual Basic Editor.

step into vba sub procedure

Once you’ve stepped into the procedure, the Visual Basic Editor takes you to the first line of code in the macro.

Visual Basic Editor when stepping into macro

Step #3: Step Through Procedure And Find Out Variant Sub-type of Variable

Every time you click the Step into command or the “F8” keyboard shortcut, the Visual Basic Editor executes a line of code and steps into the next. Do this for purposes of stepping through the VBA Sub procedure and finding out what is the Variant VBA sub-type that Visual Basic for Applications automatically assigns to the relevant variable.

The following 2 screenshots show how this works in the case of the Variant_Concatenation macro that’s been used as example:

  • Notice how, initially, the ExVar variable contains the special value Empty. This means that the variable hasn’t been initialized.

    Variant VBA data sub-type

  • In the following screenshot you can see how the ExVar variable is of the String sub-type just one step later.

    Variable with String VBA data sub-type

Bear in mind that just because a variable of the Variant VBA data type is behaving in a certain way, it doesn’t mean that this is the most appropriate data type to use. Remember that one of the possible downsides of using this particular data type is that the Visual Basic Editor may misinterpret your intended VBA data type.

Step #4: Test The Procedure

Step a couple of times into the procedure following the steps I described above. Your purpose is to determine that the variable is being assigned the same VBA data sub-type in a consistent manner. Once you’ve determined that this is the case, you can proceed to the step #5.

Step #5: Declare Variable With VBA Data Type

Once you’ve determined that the relevant variable is behaving appropriately and that it is being assigned the same data sub-type in a consistent manner, declare the variable using the VBA data type you’ve found.

Step #6: Test VBA Code

Once you’ve determined the VBA data type that you consider appropriate for the variable, test your VBA code in order to make sure that the data type is the right one.

Finding Out The VBA Data Sub-Type Of A Variant Variable Using The TypeName Function

Visual Basic for Applications allows you to determine the VBA data type of a variable by using the TypeName function. When applied, the TypeName function returns a string displaying the VBA data sub-type information of a particular Variant variable.

Let’s see how you can apply the TypeName function to the Variant_Concatenation macro.

For these purposes, I start with the VBA code of the original macro that I use in the previous examples:

Example of VBA code for TypeName function

And I add several message boxes that display the VBA data type of the ExVar variable at different stages of execution of the macro. The new macro is called “Variant_Concatenation_TypeName”. The relevant statements (which are highlighted in the image below) are of the form “MsgBox TypeName (varname)”, where:

  • “MsgBox” makes reference to the MsgBox function.
  • “varname” is the Variant variable whose VBA data sub-type you want to find out (in this case ExVar).

VBA code with TypeName function

You already know that, since the ExVar variable isn’t declared, its VBA data type is Variant. Additionally, based on the previous section where we used the Step Into command for purposes of testing the variable, you know that the ExVar variable is not initialized at first (is Empty) and, after the assignment is made, it behaves like a string variable.

The expectations described above match what the message boxes display once the Variant_Concatenation_TypeName variable is executed. More precisely:

  • The first message box to appear returns Empty, as expected.

    Screenshot of message box with Empty VBA data type

  • The second and third message boxes confirm that (now) the ExVar variable is of the String VBA data sub-type.

    Message box with String VBA data type

Finding Out The VBA Data Sub-Type Of A Variant Variable Using The VarType Function

You can also use the VarType function for purposes of finding out the VBA data type of a particular variable.

The way VarType works is very similar to the way the TypeName function works. More precisely, the VarType function returns an integer that indicates what is the VBA sub-type of a Variant variable. The following are the values that can be returned by VarType:

  • 0: Empty.
  • 1: Null.
  • 2: Integer.
  • 3: Long.
  • 4: Single.
  • 5: Double.
  • 6: Currency.
  • 7: Date.
  • 8: String.
  • 9: Object.
  • 10: Error.
  • 11: Boolean.
  • 12: Variant. This particular value is only used with arrays.
  • 13: Data access object.
  • 14: Decimal.
  • 17: Byte.
  • 36: Variant containing user-defined types.
  • 8192: Array.

The syntax of VarType is also very similar to that of TypeName. More precisely, the syntax of VarType is “VarType (varname)”, where “varname” is the Variant variable whose VBA data sub-type you want to find.

Therefore, I simply create a new macro called “Variant_Concatenation_VarType”. The VBA code is almost the same as that in the previous example (Variant_Concatenation_TypeName). The only difference is that, instead of using TypeName, I use VarType.

VBA code with VarType function

You probably expect that, when the Variant_Concatenation_VarType macro is executed, the first message box returns the value that corresponds to Empty, while the second and third message boxes display the value corresponding to String.

This is indeed what happens:

  • The first message box to be displayed returns the number 0. This corresponds to Empty.

    Message box with value for empty VarType

  • The second and third message boxes display the number 8. This number makes reference to strings.

    Message box displaying value for String VBA data type

Conclusion

The main purpose of Visual Basic for Applications is to manipulate data. Therefore, in order to master VBA and macros, you must have a good understanding of what are the different VBA data types.

After reading this VBA tutorial you probably have a good understanding of the different VBA data types that you can use, and how to determine which type to use in each situation. Choosing which data type to use may seem awkward or a little bit difficult at first, but don’t worry…

As with most aspects of Visual Basic for Applications, the more you practice, the better you’ll become. Therefore, make sure you start using the knowledge about VBA data types that you’ve gained by reading this post in your day-to-day activities.

Books Referenced In This Excel Tutorial

  • Mansfield, Richard (2013). Mastering VBA for Microsoft Office 2013. Indianapolis, IN: John Wiley & Sons Inc.
  • Walkenbach, John (2013). Excel VBA Programming for Dummies. Hoboken, NJ: John Wiley & Sons Inc.
  • Walkenbach, John (2013). Excel 2013 Power Programming with VBA. Hoboken, NJ: John Wiley & Sons Inc.

Excel VBA Variant Data Type

Variant Data Type in VBA is a universal data type that can hold any data type, but while assigning the data type, we need to use the word “Variant.”

We all know how important variables are in VBA projects. Once the variable is declared, we need to assign a data type to the declared variables. Data type assignment in VBAData type is the core character of any variable, it represents what is the type of value we can store in the variable and what is the limit or the range of values which can be stored in the variable, data types are built-in VBA and user or developer needs to be aware which type of value can be stored in which data type. Data types assign to variables tells the compiler storage size of the variable.read more depends on what kind of data we need to assign to the declared variables.

Table of contents
  • Excel VBA Variant Data Type
    • How to Declare Variant Data Type?
    • VBA Variant Doesn’t Require Explicit Way
    • Things to Remember
    • Recommended Articles

For example, look at the below code.

Integer Type

In the above code, we declare the variable as “IntegerNumber. We assigned the data type as “Integer.

Before assigning the data type to the variable, we should be aware of the limitations of the variable. For example, since we have assigned the data type Integer, my variable can hold the numbers from -32768 to 32767.

Anything more than the data type limit will cause an error. So, if we want to store more than 32767 values, we need to assign the different data types which can hold more than 32767.

To overcome this limitation, we have a universal data type, “Variant.” This article will show you the complete guide on a Variant data type.

vba-variant

You are free to use this image on your website, templates, etc, Please provide us with an attribution linkArticle Link to be Hyperlinked
For eg:
Source: VBA Variant (wallstreetmojo.com)

How to Declare Variant Data Type?

We can declare the variant data type as the usual data type, but while assigning the data type, we need to use the word “Variant.”

Code:

Sub Variant_Example1()

    Dim MyNumber As Variant

End Sub

vba variant declaration

It makes the variable work any data now. We can assign any numbers, strings, dates, and many other things.

Below is the demonstration of the same.

Code:

 Sub Variant_Example1()

     Dim MonthName As Variant
     Dim MyDate As Variant
     Dim MyNumber As Variant
     Dim MyName As Variant

     MonthName = "January"
     MyDate = "24-04-2019"
     MyNumber = 4563
     MyName = "My Name is Excel VBA"

End Sub

vba variant example

We have assigned a date, number, and string to the above variable. So, the Variant data type allows us not to worry about what kind of data we will store or assign.

As soon as we declare a variable as a “Variant.” While coding, we don’t have to worry about our data type somewhere in the middle of the project. It makes the variable work flexibly to our needs. We can probably carry out our operations in the project with a single variable.

VBA Variant Doesn’t Require Explicit Way

The general procedure to declare a VBA variable is first to name it and then assign the data type. Below is an example of the same.

Explicitly Declaring Variable

It is the explicit way of declaring the variable. However, when we declare the Variant data type, we do not need to declare them explicitly. Rather, we can name the variable and leave out the data type part.

Code:

Sub Variant_Example1()

    Dim MyNumber

End Sub

In the above code, we have named the variable “MyNumber,” but after naming it, we have not assigned any data type.

I have left out As [Data Type Name] part because the moment we ignore the data type assignment part, the variable becomes variant.

Things to Remember

Even though the “Variant” data type is flexible with the data, we will store it, but this is not the popular data type. Looks strange but is TRUE. People avoid using this data type unless there is any specific reason to use it. Below are some of the reasons for avoiding the use of variants.

  • It ignores all the data mismatch errors.
  • The variant data type limits us from accessing the IntelliSense list.
  • VBA always guesses the best possible data type and assigns it accordingly.
  • In the case of the Integer data type limit, the variant data type does not notify us when it crosses 32767 limits.

Recommended Articles

This article is a guide to VBA Variant. Here, we discuss how to declare and use the Variant data type, which is universal and holds any data type in VBA except fixed-length string data. You can learn more about VBA from the following articles: –

  • VBA DoEvents
  • Refresh Pivot Table using VBA Code
  • Class Modules in VBA
  • VBA Outlook

In this Article

  • Variant Variable Type
  • Declare Variant Variable at Module or Global Level
    • Module Level
    • Global Level
  • Using a Variant to populate Excel
  • Declaring a Dynamic Array

Variant Variable Type

A Variant Variable can hold any time of data (string, integers, decimals, objects, etc.). If you don’t declare a variable type, your variable will be considered variant.

To declare an Variant variable, you use the Dim Statement (short for Dimension):

Dim varName as Variant
Dim rng as Variant

Then, to assign a value to a variable, simply use the equal sign:

varName = "John"
rng = Sheets(1).Range("A1")

Putting this in a procedure looks like this:

Sub strExample()
'declare the variants
    Dim strName As Variant
    Dim rng As Variant
'populate the variables
    strName = "Fred Smith"
    Set rng = Sheets(1).Range("A1")
'populate the sheet
    rng.Value = strName
End Sub

If you run the code above, cell A1 in Sheet 1 will be populated with “Fred Smith”

vba variant fredsmith

By the names declared above, we could conclude that the varName would contain text, and the objSheet would contain a worksheet object.  But actually, any type of data can be directed to the variable.

You could populate the variables declared above as follows and no error would occur.

varName = 6
objSheet - "Fred"

It is unusual to use variant variables and not considered good practice. On occasions, however, Variant variables are useful.

Declare Variant Variable at Module or Global Level

In the previous example, you declared the Variant variable within a procedure. Variables declared with a procedure can only be used within that procedure.

vba variant procedure declare

Instead, you can declare Variant variables at the module or global level.

Module Level

Module level variables are declared at the top of code modules with the Dim statement.

vba variant module declare

These variables can be used with any procedure in that code module.

Global Level

Global level variables are also declared at the top of code modules. However, instead of using the Dim statement, you use the Public statement to indicate that the string variable is available to be used throughout your VBA Project.

Public strName as Variant

vba variant public declare

If  you declared the variant variable at a module level and used in a different module, an error would occur.

vba variant module error

If you had used the Public keyword to declare the variant variable, the error would not occur and the procedure would run perfectly.

Using a Variant to populate Excel

Consider the following procedure:

Sub TestVariable
'declare a string to hold the product name
    Dim strProduct as string 
'declare an integer to hold the product quantity
    Dim iQty as integer
'declare doubles to hold the product price, and total price
    Dim dblPrice as Double
    Dim dblTotal as Double
'populate the variables
    strProduct = "All Purpose Flour"
    iQty = 3
    dblPrice = "$5.00"
    dblTotal = "$15.00"
'populate the Excel sheet
    Range("A1") = strProduct
    Range("A2") = iQty
    Range("A3") = dblPrice
    Range("A4") = dblTotal
End Sub

When we run this code, the following error occurs.

vba variant error

Click Debug

vba variant debug

You cannot put a dollar sign into the variable as the variable is declared as a Double, and therefore cannot store string values.

Declare dblPrice and dblTotal as Variants which means you are not restricted to a data type.

Dim dblPrice as Variant
Dim dblTotal as Variant

Re-run the code and the data will appear in the Excel sheet as it should.

vba variant excel

Note that the data entered in A4 and A5 are automatically then converted by Excel to numbers.

vba variant excel data

Declaring a Dynamic Array

Variant variables are also useful when you are declaring a dynamic array as they allow the size of the array to change during run-time.

With a Variant Array, you do not need to define the array size. The size will automatically adjust.

Sub VariantArray()
    Dim arrList() As Variant
 'Define Values
    arrList= Array(1, 2, 3, 4)
'Change Values   
    arrList= Array(1,2,3,4,5,6)
'Output Position 4    
    MsgBox arrVar(4)
End Sub

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
vba save as

Learn More!

VBA Variant Data Type in Excel explained with syntax and examples.Variant Data Type in Excel VBA explained with syntax and examples. It is a special and universal data type to use for any kind of data except fixed length string. It is more flexible, but occupies more space in memory. Type declaration character is not available for variant data type.

There are two types of variant data types..

1. Variant (numbers) and
2. Variant (characters)

Variant (numbers):

The Variant (numbers) can contain any numeric value as large as Double.The Variant numbers occupies 16 bytes (128 bits).

Variant (characters):

The Variant (characters) can contain Same as variant variable-length String. The Variant characters occupies 22 bytes (176 bits) and the memory that is required for the Variant itself.

Table of Contents:

  • Overview of Variant VBA Data Type in Excel
  • Data Type Variant Syntax in Excel VBA
  • Example on the Data Type Variant in Excel VBA
  • Convert an Expression to Variant VBA Data Type
  • Instructions to Run VBA Macro Code
  • Other Useful Resources

Let us see Data Type Variant Syntax in Excel VBA.

Dim VariableName as Variant
'or
Dim VariableName

Where VariableName represents the name of the variable.
Variant represents type of data.

Example on the Variant in Excel VBA

Here is an example on the Variant numbers and characters in Excel VBA.

Sub VBAF1_Variant_DataType()
    
    'Variable declaration
    Dim Name As Variant
    Dim DateofJoin As Variant
    Dim Salary As Variant
    
    Name = "Patricia Katts"
    DateofJoin = #1/1/2019#
    Salary = 75000
    
End Sub

The above example accepted string, date and integer data types.

Convert an Expression to Variant Data Type in Excel VBA

You can convert an expression to Variant VBA data type using VBA CVar function. Click on the following link to learn about CVar function and complete tutorial and examples.

VBA CVar Function

Also read about all other data types.

VBA Data Types

Instructions to Run VBA Macro Code or Procedure:

You can refer the following link for the step by step instructions.

Instructions to run VBA Macro Code

Other Useful Resources:

Click on the following links of the useful resources. These helps to learn and gain more knowledge.

VBA Tutorial VBA Functions List VBA Arrays VBA Text Files VBA Tables

VBA Editor Keyboard Shortcut Keys List VBA Interview Questions & Answers Blog

VBA Variant

Excel VBA Variant Data Types

In VBA, we have different types of Variable data types. We use them when we need to specify some certain kind of input to be given. Suppose, for the whole number we use Integer, for the text we use String and for lengthy data set we use Long data type. And there are some more data types that we use different types of variable declaration. But what if I tell you that we can define all these variables in a single Data type. For that purpose, we have VBA Variant where we can define any type of variable which we want.

VBA Variant is as easy as using other data types. For defining any kind of variable use any name or alphabet to name it and then we choose data type which we want. Let’s see an example where we will see how a variable can be declared using Integer data type.

Integer Data Type

As we can see in the above screenshot, for Integer data type variable, we can use number ranging from -32768 to +32767. But if we choose a variant here instead of Integer, then it will work same as Integer but there will not be any limit as data type Variant consists of all kind of variable formation in it.

And Variant can be used as shown below.

Variant Data Type

How to Declare Variant Data Type in Excel VBA?

We will summarize the whole process of declaring variables in VBA by using VBA Variant. Let’s see an example where we will use traditional data types for declaring variables first.

You can download this VBA Variant Excel Template here – VBA Variant Excel Template

Steps to Declare Variant Data Type

Follow the below steps to declare Variant Data Type in Excel by using VBA code.

Step 1: Go to the VBA window, under the Insert menu tab select Module as shown below.

VBA Variant Example 1-1

Step 2: Now write the subprocedure for VBA Variant in any name as you want. We have used the name which can define the process which uses.

Code:

Sub VBA_Variant1()

End Sub

VBA Variant Example 1-2

Step 3: Now define a variable where we can store or print any kind of text or name. For that, we need to use a string data type.

Code:

Sub VBA_Variant1()

Dim Name As String

End Sub

VBA Variant Example 1-3

Step 4: Now define another variable where we can store or print any data. For that, we will again use a String data type.

Code:

Sub VBA_Variant1()

Dim Name As String
Dim DoB As String

End Sub

VBA Variant Example 1-4

Step 5: Now define another variable where we can store some numbers. For that, we will use an integer data type.

Code:

Sub VBA_Variant1()

Dim Name As String
Dim DoB As String
Dim Age As Integer

End Sub

Datatype Integer Example 1-5

Step 6: And at last, we will declare another variable where we will be storing lengthy number using datatype Long

Code:

Sub VBA_Variant1()

Dim Name As String
Dim DoB As String
Dim Age As Integer
Dim RollNo As Long

End Sub

Datatype Long Example 1-6

So basically here, we will be creating a database which will be having the name of a student, Date of Birth, Age, and Roll No. Now to complete this process, we will assign the values to each of the variables which we defined above.

Step 7: So we will declare the name of the student as Ashwani whose date of birth is 02 Sept 1990 and age is 29 and whose roll number is 16238627 in his certification exam as shown below.

Code:

Sub VBA_Variant1()

Dim Name As String
Dim DoB As String
Dim Age As Integer
Dim RollNo As Long

Name = "Ashwani"
DoB = "02-09-1990"
Age = 29
RollNo = 16238627

End Sub

VBA Variant Example 1-7

Please note, the value where we will use String data type are quoted in inverted commas as they as in Text. Now to print these values we can use Msgbox or Debug.Print.
Debug print is the best way here, as we have multiple values for which if we use Msgbox then we need to use separated msgbox to see the output. So, to avoid that, we will use Debug.Print

Step 8: Use Debug.Print function and write all the variable which we defined above separated by Commas as shown below.

Code:

Sub VBA_Variant1()

Dim Name As String
Dim DoB As String
Dim Age As Integer
Dim RollNo As Long

Name = "Ashwani"
DoB = "02-09-1990"
Age = 29
RollNo = 16238627

Debug.Print Name, DoB, Age, RollNo

End Sub

Use Debug Print function

Step 9: To see the output, open the Immediate Window from the View menu list. Or we can use a short cut key as Ctrl + G to get this window.

Immediate Window Example 1-9

Step 10: Run the code by pressing the F5 function key or click on the Play button located below the menu list.

VBA Variant Example 1-10

We will see, all the variable which we have declared above, we are able to see the values stored in each of the variables.

Step 11: Now we will replace each variables String, Integer and Long with Variant data type as shown below.

Code:

Sub VBA_Variant1()

Dim Name As Variant
Dim DoB As Variant
Dim Age As Variant
Dim RollNo As Variant

Name = "Ashwani"
DoB = "02-09-1990"
Age = 29
RollNo = 16238627

Debug.Print Name, DoB, Age, RollNo

End Sub

VBA Variant Example 1-9

Step 12: Again run the code. We will the same output as we got using different variable data type with the Variant data type.

VBA Variant Example 1-11

And if we compare the output, then both outputs are the same.

Pros & Cons of Excel VBA Variant

  • We can replace most of the data types with a single data type Variant.
  • VBA Variant is easy as using Integer or Long or String data types for declaring variables.
  • This saves time in thinking which type of data type we need to choose for variable declaration.
  • For each different data, we will get the same output by using a Variant data type as we could get using traditional variables.
  • We cannot use some certain types of variable data type such Double if we want to replace this with Variant.

Things to Remember

  • Use double quote (Inverted commas) if you want to declare text using Variant or any other data types.
  • We can choose any name to declare variable using Variant, as we used to perform with other types of data types.
  • VBA Variant has the limitation where cannot use IntelliSense list, which has inbuilt functions.
  • VBA always suggests the best possible data types we could declare of any type of data.

Recommended Articles

This is a guide to VBA Variant. Here we discuss how to declare Variant Data Type in Excel using VBA code along with practical examples and downloadable excel template. You can also go through our other suggested articles –

  1. VBA Workbook Open
  2. VBA Get Cell Value
  3. VBA Length of String
  4. VBA XML

VBA contains a special data type, the Variant. Internally, the Variant is highly complex, but it’s also extremely easy to use. The Variant is the default data type of VBA, so the following code casts myVar as a variant:

Dim myVar

The Variant data type allows you to use a variable with any of the intrinsic VBA data types, automatically working out what is the closest data type to the value you are assigning. When you consider the amount of processing required to determine what data type should be used for an abstract value, it’s a testament to the VB development team at Microsoft that the Variant is as quick as it is. However, there is a slight performance hit when using both variant data and functions that return variant data, which we discuss later in this chapter.

Another drawback to using variant data is that your code becomes at best horrible to read, and at worst unreadable! To illustrate, consider two versions of the same function, the first written exclusively with variants, the second using strong typing:

Private Function GoodStuff(vAnything, vSomething, _

vSomethingElse)

If vAnything > 1 And vSomething > «» Then GoodStuff = vAnything * vSomethingElse Else

GoodStuff = vAnything + 10 End If

End Function

Private Function GoodStuff(iAnything As Integer, _

sSomething As String, _ iSomethingElse As Integer) As Integer

If iAnything > 1 And sSomething > «» Then GoodStuff = iAnything * iSomethingElse Else

GoodStuff = iAnything + 10 End If

End Function I know which one I’d rather maintain!

The Variant 33

So how do you use variant data? Well, at the simplest level, you can ignore the fact that there are such things as data types (or, to be more precise, when using variants, you can ignore data subtypes). But to be a proficient VB programmer, if you use variants at all, it’s best to be aware that every item of variant data has a subtype (like Integer, Long, or String) that corresponds to one of the major data types. And Decimal data is something of an exception: it’s only available as a subtype of the Variant data type.

Special Variant Data Subtypes

In addition to all the intrinsic data types the following special data types:

detailed above, the variant also supports

Empty

The Empty subtype is automatically assigned to new Variant variables when you declare them, but before you explicitly assign a value to them. For instance, in the code fragment:

the subtype of varl is Empty, whereas var2 is only Empty for the brief period of time between the execution of the Dim statement on the first line and the assignment statement on the second line. In addition, a variable’s subtype is Empty if it has been explicitly assigned a value of Empty, as in the following code fragment:

Dim var1 varl = Empty

Null

Null is a special data subtype that indicates a variable doesn’t contain any valid data. Usually, a variable is assigned a null value to indicate that an error condition exists. In order for its subtype to be Null, a variable must have a Null value assigned to it explicitly, as in the following line of code:

varl = Null

A Null value also results from any operation in which the value of one or more of the expressions is Null, as the following code fragment shows:

dim myVarOne, myVarTwo, myVarThree ‘All three variables are EMPTY now myVarOne = 9

myVarTwo=NULL ‘We’ve made this variable NULL

myVarThree = myVarOne + myVarTwo ‘The result is NULL

Error

The Error subtype is used to store an error number. Error numbers are generated automatically by VBA, and can then be used by your error handling routine. Error-handling routines are discussed in Chapter 6, Error Handling.

Determining the Variant Subtype

Having the variant data type take care of your data typing is all well and good, but what happens when you need to know exactly what type of data is stored to a variable? VBA provides two functions: VarType, which returns a number that indi-

34 Chapter 3 — VBA Variables and Data Types cates the type of data stored to a variable; and TypeName, which returns a string containing the name of the data type.

VarType

The syntax of VarType is:

VarType( variablename)

where variablename is the name of the variable whose subtype you want to determine. You can provide the name of only a single variable at a time. The following table details the possible values returned by VarType and the data subtypes they represent. For purposes of reference, the table also lists the VBA constants you can use in your code to compare with the values returned by the VarType function.

Value

Data Subtype

VBA Constant

0

Empty

vbEmpty

1

Null

vbNull

2

Integer

vbInteger

3

Long Integer

vbLong

4

Single

vbSingle

5

Double

vbDouble

6

Currency

vbCurrency

7

Date

vbDate

8

String

vbString

9

OLE Automation Object

vbObject

10

Error

vbError

11

Boolean

vbBoolean

12

Array of Variant

vbVariant

13

Data access object

vbDataObject

14

Decimal

vbDecimal

17

Byte

vbByte

36

User-defined Type

vbUserDefinedType

8192

Array

vbArray

Actually, the VarType function never returns 8192, as shown in the table; this is only a base figure indicating the presence of an array. When passed an array, VarType returns 8192 plus the value of the array’s underlying data type. For example, if you pass the variable name of an array of string to VarType, the return value is 8200 (8192 + 8).

TypeName

The TypeName function allows you to write more readable, self-documenting code by returning the name of the data subtype rather than a more abstract number. The syntax for TypeName is:

result = TypeName( variable)

The Variant 35

Like the VarType function, TypeName is read-only; you can use it to determine the subtype of a variable, but you can’t use it to explicitly set the type of a variable. To do this, you must use the conversion functions discussed in the previous section. The following table shows the string that the TypeName function returns for each data subtype.

Return Value

Data Subtype

<object type>

Actual type name of an object

Boolean

Boolean value: True or False

Byte

Byte value

Currency

Currency value

Date

Date or time value

Decimal

Decimal (single-precision) value

Double

Double-precision floating-point value

Empty

Uninitialized

Error

Error

Integer

Integer value

Long

Long integer value

Nothing

Object variable that doesn’t yet refer to an object instance

Null

No valid data

Object

Generic object

Single

Single-precision floating-point value

String

Character string value

Variant()

Variant array

Unknown

Unknown object type

If you pass an array of a particular data type to TypeName, the same return string is used for the underlying data type of the array, suffixed with «()» to denote an array. Therefore if you pass the variable name of an array of strings to TypeName, the return value is «String()».

As for making your code more readable and easier to maintain, just look at this snippet:

If TypeName(x) = «Double» Then

Now you’ve no excuse for getting those nasty «type mismatch» errors!

Variant and Strongly Typed Data

The Variant might appear to be the answer to all your data type needs, but there’s a price to pay. The variant is more than a data type, it’s a program within itself. It takes a lot of processing to determine the data type of an abstract value. In tests I’ve carried out, an expression consisting of only variant data executes about 30% slower than the same expression using the correct intrinsic data types.

36 Chapter 3 — VBA Variables and Data Types

Variant and Strongly Typed Functions

The VBA language includes a number of string-handling functions that have two versions, one that returns a variant and the other that returns a string. The latter are suffixed with the old string-specifying character $ (for example, Left$), while the former simply include the name of the function (for example, Left).

I have put the two versions through some performance testing to determine if there is a significant difference in their performance. To simplify matters, I tested both Left and Left$ and Mid and Mid$. When using the strongly typed versions, I assigned the result to a string data type and passed string data types as parameters; when using the variant versions, I assigned the result to a variant and passed variant data types as parameters.

For example, here is a variant version of a sample code fragment that illustrates the performance tests:

Dim sString Dim sPartString sString = «ABCDEFGH»

sPartString = Mid(sString, 1, 2)

and here is the String version:

Dim sString As String Dim sPartString As String sString = «ABCDEFGH»

I found that the variant version of each function executed about 50% slower than its string counterpart. This obviously is a significant difference, and it suggests that we should use the typed versions of all functions whenever they are available.

Continue reading here: Declaring Variables and Constants

Was this article helpful?

In a computer system, variables and data types are almost used in every program to store and represent data. Similarly, Excel VBA also has variables and data types to store and represent data and its type. In this article, we will learn about VBA variables, their scope, data types, and much more.

VBA Variables

VBA(Visual Basic for Application) variables are similar to other programming languages variables, they act as a container that is used to store data(integer, string, floats, etc). We can use the variables in the code at multiple places and executer the programs.

Defining Variables In VBA

VBA gives permission to define variables in two ways:

  1. Implicitly – In VBA, we can implicitly declare variables using the assignment(=) operator. All the variables that are implicitly declared in VBA are of type “Variant“. The variant type variables required more memory space than usual variables. Example: label=”gfg”
  2. Explicitly – Explicitly we can declare variables using “Dim” keyword. Explicit variable also reduces the naming conflicts and spelling mistakes. Example: Num as password

Syntax For VBA Variables

// macro definition

Sub VBA_Variable_Example ()

        Dim <name>

End Sub

VBA Variables Rule:

  1. Its length should be less than 255 characters.
  2. No space is allowed between characters.
  3. It should not starts with an integer.
  4. Period(.) is not allowed in between the characters.
Allowed Not Allowed
gfg_article gfg.article
dataStructureCourse1 1CourseDataStructure
geekforgeeks geeks for geeks

Example:

In this example, we will define a macro in excel, And we will enter the code inside that macro and execute the code to understand the working of VBA variables in excel.

Step 1: First, we will make our Developer option available in the Excel toolbar. For this, go to any of the tools(here, we are choosing Draw) and then right-click on it and select the “Customize the Ribbon..” option.

Customize-the-Ribbon

The excel will open pop-up options, there we need to check the Developer checkbox and click on OK. This will enable the Developer option and make it available in the excel top toolbar.

Developer-Option

Step 2: In this step, we will declare our variable in the visual basic editor. For this go to Developer > Visual Basic Editor.

Open-VBA-Editor

This will open the Visual Basic Code Editor, where we are required to write our VBA script.

Visual-Basic-Editor

Step 3: In this step, we will write our VBA scripts. For this, we will double click on ThisWorkbook under Microsoft excel objects in the left pan and open the editor and write the following code to it.

Sub VBA_Variable_GFG_Example()

Range(“a1”).Value = “Data Structure Course”

Range(“b1”).Value = “Data Structure Course”

Range(“c1”).Value = “Data Structure Course”

Var = “Data Structure Course”

Range(“a3”).Value = Var

Range(“b3”).Value = Var

Range(“c3”).Value = Var

End Sub

In the above, we can see without using variables if we want to make changes to the string “Data Structure Course” and add “GeeksForGeeks” before every string, we need to repeat it at three different places. But if we use a variable then we just need to change it at one place where we declare our variable. This will reduce the workload.

Sub VBA_Variable_GFG_Example()

Range(“a1”).Value = “Data Structure Course”

Range(“b1”).Value = “Data Structure Course”

Range(“c1”).Value = “Data Structure Course”

Var = “GeeksForGeeks – Data Structure Course”

Range(“a3”).Value = Var

Range(“b3”).Value = Var

Range(“c3”).Value = Var

End Sub

We will write this code in the VBS script editor and execute it. This will print the output string in the cells defined in the code.

VBA-Script

Once, we execute it using the Run button, we will get the following output.

Output

Scope Of VBA Variables

The scope of variables is determined when we declare the variable. In VBA, the scope tells where the variable may be used. There is three level of scopes of the variable:

1. Procedure Level: These are those variables that can be used within the procedure they are defined. A Procedure is either a Sub or a Function

Example: In this example, we will see the procedure level of the VBA variable’s scope. For this open the VBA editor and write the following code to it.

Sub sub1()

Dim res As String

res = “The variable which can be used within the procedure they are defined in.”

Range(“a1”).Value = res

End Sub

Procedure-Level-Scope

Once, we click on the Run button in the VBA editor, we will the output. The text will get printed to cell A1.

Final-output

2. Module Level: It is also known as the Private Module Level. It can be used by any procedures within the same module. These variables must be declared outside of all the procedures, at the top of the module.

Example: In this example, we will look for the module scope of variables. For this, we will create a new module. We will open VBA Editor and in the left pane (project explorer) we will Right-Click and create a new module add the following code to it.

Dim txt As String

Sub ProcedureDemo()

txt = “A Sub or Function is a Procedure, variables defined inside them only accessible within them”

Range(“a1”).Value = txt

End Sub

Sub PrivateModuleDemo()

txt = “Variable which is define inside a module, are accessible by all the procedures within that module”

Range(“a2”).Value = txt

End Sub

Module-Level

After this, we just need to click on the Run button. Also, when we run it, it asks for which macros to run, there we need to choose “Macros In: <All Projects>“.

Macros-In

 Once we run it, we will get the output in cells A1 and A2. 

Final-output

3. Public Module Level: As the name suggests, the public module variables scope is at the Project level. If we define any variable as a public module variable it can be used in any module inside that project.

Example: In this example, we will add two different modules and define a public VBA variable inside one module and try to access it from both modules. Below is the code for module1 and module2.

Module1

Public res As String

Sub demo_1()

res = “geeks”

Range(“a1”).Value = res

End Sub

Module2

Sub demo_2()

res = “geeksforgeeks”

Range(“a2”).Value = res

End Sub

Once, done with both the modules. Just click on the Run button. The output will get printed in cells A1 and A2,

Click-on-the-Run-button

Fig 12 – Output

Lifetime Of Variable

The variables can retain their value up to their scope. The lifetime of a variable tells about how long a variable can retain its value. In order to extend the scope and so, the lifetime of a variable we need to declare the variable with a static keyword. If we declare a variable with a static keyword, the variables will retain their value even after all the macros are finished execution.

Example: In this example, we will define a variable using the static keyword and execute it multiple time to check whether it retains the value or not. We need to write the following code to the VBA Editor.

Sub StaticVariableDemo()

Static count As Integer

count = count + 1

MsgBox (count)

End Sub

After this, we need to execute it. Every time we will click on the run button the MessageBox will return the updated value. (1, 2, 3…..) and thus it will extend its scope and lifetime.

Final-output

VBA Data Types

In computers, we use data types to differentiate between the integers and strings, etc. The data types which we will assign to a variable, decide what should be stored in that variable, i.e., the values that need to be stored in the variable is depends on the data type of the variable. In VBA, data types are divided into two major types:

1. Numeric Data Type: Numeric data types are used to perform mathematical operations such as addition, subtraction, etc. It is used to handle the numbers in various representations format. In numeric data type, the Integral Type represents only the whole numbers(zero, positive & negative). Non-Integral Types represent both the integer and the fractional part.

Data Types Memory Size Value Range
Byte 1 2yte 0 to 255
Integer 2 bytes -32,768 to 32,767
Long 4 bytes -2,147,483,648 to 2,147,483,648
Single 4 bytes Negative Values (-3.402823E+38 to -1.401298E-45) & Positive Values (1.401298E-45 to 3.402823E+38)
Double 8 bytes Negative Values (-1.79769313486232e+308 to -4.94065645841247E-324) & Positive Values (4.94065645841247E-324 to 1.79769313486232e+308)
Currency 8 bytes -922,337,203,685,477.5808 to 922,337,203,685,477.5807
Decimal 12 bytes No Decimal Places (+/- 79,228,162,514,264,337,593,543,950,335) & Up to 28 Decimal Places (+/- 7.9228162514264337593543950335)

2. Non-Numeric Data Type: Non-Numeric data types are not manipulated by the arithmetic operators. These are comprised of texts, data, etc.

Data Types Memory Size Value Range
String(fixed size/length) Equivalent to String’s length(in bytes) 1 to 65,400 characters
String(variable length) String’s length + 10 bytes 0 to 2 billion characters
Boolean 2 bytes True/False
Object 4 bytes Embedded object
Data 8 bytes January 1, 100 to December 31, 9999
Variant(numeric) 16 bytes Any value
Variant (text) Text’s length + 22 bytes 0 to 2 billion characters

Note: If we do not declare any data type, the VBA will be default makes variable as a variant type.

Example:

In this example, we will write a simple script to create a button and with one click of that button an event will occur and we will get the output.

Step 1: First we will insert a command button in our excel worksheet. For this go to Developer > Insert > Command Button and click on it.

Click-on-the-command-button

Fig 14 – Command Button

 After that, we can insert the button anywhere in the sheet we want. We just need to drag it over the excel sheet.

 Command-Button-View

Step 2: In this step, we will write the script for our button. For this just double-click on the button. This will open the VBA Script Editor where we will write the following code. In the below code, we are defining GFG and course as String data type and res as Integer data type.

Private Sub CommandButton1_Click()

Dim GFG As String, res As Integer, course As String

GFG = “GeeksForGeeks”

res = “01”

course = “Interview Preparation”

Range(“a1”).Value = GFG

Range(“b1”).Value = res

Range(“c1”).Value = course

End Sub

VBA-Script-For-Button

Step 3: In this step, we will save our script. For this click on the Save button in the VBA Editor. 

Saving-VBA-Button-Script

The excel will popup a window asking for saving the macros. We need to click “Yes” and it will save it.

Saving-Macro-To-Workbook

Step 4: Now, we will execute our script. For this, we need to click over the command button. But before clicking over it, we are required to come out of Design Mode. To move out of any mode just click on mode once.

Moving-Out-Of-Design-Mode

Once we are done with this, we will execute our script by clicking over the commandButton1. It will give the following output.

Final-Output

Note: If we write “01” in any cell in excel, it will print “1” by default. That’s why the in output, in cell b1 only “1” is printed.

Like this post? Please share to your friends:
  • What is unicode for ms word
  • What is understood by a course what attributes may qualify this word
  • What is udf in excel
  • What is type style in word
  • What is true love in one word