变种

Dim Value As Variant    'Explicit
Dim Value               'Implicit

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

变量作为 VARIANT 结构存储在存储器中,该结构由字节类型描述符( VARTYPE ),后跟 6 个保留字节,然后是 8 字节数据区域组成。对于数字类型(包括 Date 和 Boolean),基础值存储在 Variant 本身中。对于所有其他类型,数据区域包含指向基础值的指针。

StackOverflow 文档

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

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。具有类型提示的文字将被强制转换为提示类型的变体。

结果类型
字符串值 字符串
整数范围内的非浮点数 整数
长范围内的非浮点数
长距离以外的非浮点数 double
所有浮点数 double

注意: 除非有特定原因要使用 Variant(即 For Each 循环中的迭代器或 API 要求),因此通常应避免常规任务的类型,原因如下:

  • 它们不是类型安全的,增加了运行时错误的可能性。例如,保存 Integer 值的 Variant 将自动将其自身更改为 Long 而不是溢出。
  • 它们通过要求至少一个额外的指针取消引用来引入处理开销。
  • Variant 的内存要求始终比存储基础类型所需的内存要求至少高 8 个字节。

转换为 Variant 的转换函数是 CVar()