VBScript - データ型(バリアント型(Variant)とは)
VBScript の変数のデータ型は、すべてバリアント型(Variant)になる。
バリアント型(Variant)は次の特徴を持つ。
どんな値でも格納できる。数値でも文字列でも何でも OK 。
格納された値をどのデータ型として扱うかを「内部処理形式」として持つ。
たとえば整数を格納すれば内部処理形式は整数型となり、ブール型(True/False)を格納すれば内部処理形式はブール型となる。
内部処理形式の一覧
バリアント型(Variant)で持てる内部処理形式は以下のとおり。
Empty 値: 初期値が代入されていないことを表す
Null 値: 有効なデータを持たないことを表す
ブール型(Boolean): 真(True)または偽 (False) の真偽値
バイト型(Byte): 0 ~ 255 の整数
整数型(Integer): -32,768 ~ 32,767 の整数
長整数型(Long): -2,147,483,648 ~ 2,147,483,647 の整数
単精度浮動小数点数型(Single): -3.402823E38 ~ -1.401298E-45 (負の値) および 1.401298E-45 ~ 3.402823E38 (正の値) の実数
倍精度浮動小数点数型(Double): -1.79769313486232E308 ~ -4.94065645841247E-324 (負の値) および 4.94065645841247E-324 ~ 1.79769313486232E308 (正の値) の実数
通貨型(Currency): -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 の数値
日付(時刻)型(Date): 西暦100年1月1日~西暦9999年12月31日の日付を表す数字
文字列型(String): 約2GBまでの文字を格納できる可変長文字列
オブジェクト型: オブジェクトへの参照
エラー型: エラー番号を持つデータ型
内部処理形式を VarType 関数で判定する
VarType(varname)
VarType 関数は、変数 varname の内部処理形式を表す数値を返す。
vbEmpty(0): Empty 値(未初期化の変数)
vbNull(1): Null 値(無効な値)
vbInteger(2): 整数型(Integer)
vbLong(3): 長整数型(Long)
vbSingle(4): 単精度浮動小数点数型(Single)
vbDouble(5): 倍精度浮動小数点数型(Double)
vbCurrency(6): 通貨型(Currency)
vbDate(7): 日付型(Date)
vbString(8): 文字列型(String)
vbObject(9): オートメーション オブジェクト
vbError(10): エラー型
vbBoolean(11): ブール型(Boolean)
vbVariant(12): バリアント型(Variant)(バリアント型配列にのみ使用)
vbDataObject(13): 非オートメーション オブジェクト
vbByte(17): バイト型(Byte)
vbArray(8192): 配列(Array)
不具合?
Excel.Application を引数にすると vbString(8) が返される。
正しくは vbObject(9) ではないかと思うのだが……。
Dim xls
Set xls = CreateObject("Excel.Application")
WScript.Echo VarType(xls)
' → 8
内部処理形式を TypeName 関数で判定する
TypeName(varname)
TypeName 関数は、変数 varname の内部処理形式を表す文字列を返す。
戻り値の一例を以下に挙げる。
Empty: Empty 値
Null: Null 値
Integer: 整数型(Integer)
Long: 長整数型(Long)
Single: 単精度浮動小数点数型(Single)
Double: 倍精度浮動小数点数型(Double)
Currency: 通貨型(Currency)
Date: 日付型(Date)
String: 文字列型(String)
〈object type〉: 実際のオブジェクトの種類の名前 *後述
Boolean: ブール型(Boolean)
Byte: バイト型(Byte)
Variant(): 配列(Array)
*オブジェクトの場合、TypeName 関数はどのような文字列を返すのか。
例:Scripting.Dictionary は Dictionary が返された。
Dim a
Set a = CreateObject("Scripting.Dictionary")
WScript.Echo TypeName(a)
' → Dictionary
例:ADODB.Stream は Stream が返された。
Dim a
Set a = CreateObject("ADODB.Stream")
WScript.Echo TypeName(a)
' → Stream
計算結果が元のデータ型を超えると自動で拡張される
`Byte`、`Integer`、`Long`、`Single`を格納している Variant に対して計算を行い、結果が元のデータ型の範囲を超えた場合、結果は Variant 内で次に大きいデータ型に昇格される。
`Byte` → `Integer`
`Integer` → `Long`
`Long` または `Single` → `Double`
`Currency`、`Double` → 実行時エラー
例1 Byte → Integer
Dim a, b, c
a = CByte(128)
b = CByte(128)
c = a + b
WScript.Echo TypeName(c)
' → Integer
例2 Integer → Long
Dim d, e, f
d = 32767 'Integerの最大値
e = 1
f = d + e
WScript.Echo TypeName(f)
' → Long
例3 Long → Double
Dim g, h, i
g = 2147483647 'Longの最大値
h = 1
i = g + h
WScript.Echo TypeName(i)
' → Double
例4 Single → Double
Dim j, k, l
j = CSng(340282350000000000000000000000000000000) 'Singleの最大値 3.4028235E+38
k = CSng(1)
l = j + k
WScript.Echo TypeName(l)
' → Double
例5 Double の計算でオーバーフロー
Dim m, n, o
m = 1.79769313486231E+308
n = 0.00000000000001E+308
o = m + n
WScript.Echo TypeName(o)
' → 実行時エラー #6 - オーバーフローしました。
例6 Currency の計算でオーバーフロー
Dim p, q, r
p = CCur(922337203685477) 'Currencyの最大値 922,337,203,685,477.5807
q = 1
r = p + q
WScript.Echo TypeName(r)
' → 実行時エラー #6 - オーバーフローしました。