Variants were first introduced in version 2 of Visual Basic as a flexible data type that could hold each of the simple data types. The Variant data type was extended substantially with version 4 to include Byte, Boolean, Error, Objects, and Arrays, and a little further with version 5 to include the Decimal data type. The Decimal data type was the first data type that was not available as a "first class" data type—it is available only within a Variant—and you cannot directly declare a variable as a Decimal.
In Visual Basic 6, UDTs have been added to the list, effectively completing the set. Now a Variant can be assigned any variable or constant, whatever the type.
A variety of functions convert to these subtypes and test for these subtypes. Table 4-1 shows the development of the Variant data type through the versions of Visual Basic, along with the matching functions.
Table 4-1 The Evolution of Variants
| Type | Visual Basic Name | Visual Basic Version | Convert Function | Test Function | 
| 0 | Empty | 2 | = Empty | IsEmpty | 
| 1 | Null | 2 | = Null | IsNull | 
| 2 | Integer | 2 | CInt | IsNumeric* | 
| 3 | Long | 2 | CLng | IsNumeric | 
| 4 | Single | 2 | CSng | IsNumeric | 
| 5 | Double | 2 | CDbl | IsNumeric | 
| 6 | Currency | 2 | CCur | IsNumeric | 
| 7 | Date | 2 | CVDate/CDate | IsDate | 
| 8 | String | 2 | CStr | |
| 9 | Object | 4 | IsObject | |
| 10 | Error | 4 | CVErr | IsError | 
| 11 | Boolean | 4 | CBool | |
| 12 | Variant | 4 | CVar | |
| 13 | Data Object | 4 | ||
| 14 | Decimal | 5 | CDec | IsNumeric | 
| 17 | Byte | 4 | CByte | |
| 36 | UDT | 6 | ||
| 8192 | Array | 4 | Array | IsArray | 
| 16384 | ByRef | Never? | 
*Strictly speaking, IsNumeric tests to see if a variable can be converted to a numeric value, and is not simply reporting on a Variant's subtype.
