變種

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()