VBA Variant

示例

Dim Value As Variant    'Explicit
Dim Value               'Implicit

Variant是一种COM数据类型,用于存储和交换任意类型的值,并且VBA中的任何其他类型都可以分配给Variant。在没有显式类型的As [Type]情况下声明的变量默认指定为Variant。

变量以VARIANT结构形式存储在内存中,该结构由字节类型描述符(VARTYPE),后跟6个保留字节和8个字节数据区域组成。对于数字类型(包括日期和布尔值),基础值存储在Variant本身中。对于所有其他类型,数据区域包含指向基础值的指针。

Variant的基础类型可以通过VarType()返回存储在类型描述符中的数值的TypeName()函数或返回字符串表示形式的函数来确定:

Dim Example As Variant
Example = 42
Debug.Print VarType(Example)    'Prints 2 (VT_I2)
Debug.Print TypeName(Example)   'Prints "Integer"
Example = "Some text"
Debug.Print VarType(Example)    'Prints 8 (VT_BSTR)
Debug.Print TypeName(Example)   'Prints "String"

因为Variants可以存储任何类型的值,所以根据下表,来自不带类型提示的文字的赋值将隐式转换为适当类型的Variant。具有类型提示的文字将转换为提示类型的Variant。

结果类型
字串值
整数范围内的非浮点数整数
远距离的非浮点数
超出范围的非浮点数
所有浮点数

注意:除非出于特殊原因使用Variant(例如,For Each循环中的迭代器或API要求),否则出于以下原因,对于常规任务通常应避免使用该类型:

  • 它们不是类型安全的,增加了运行时错误的可能性。例如,持有一个Integer值的Variant会自动将其自身更改为Long而不是溢出。

  • 它们通过要求至少一个附加的指针取消引用而引入处理开销。

  • Variant的内存要求始终至少比存储基础类型所需的内存至少高8个字节。

转换为Variant的强制转换函数为CVar()。