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 - オーバーフローしました。

いいなと思ったら応援しよう!