メイン画像

VBScript - データ型(バリアント型(Variant)とは)

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 関数、または TypeName 関数を使って取得できる。

VarType 関数

VarType(varname)

変数 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)

変数 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

計算結果が元のデータ型を超えると自動で拡張される

ByteIntegerLongSingleを格納している Variant に対して計算を行い、結果が元のデータ型の範囲を超えた場合、結果は Variant 内で次に大きいデータ型に昇格される。

  • ByteInteger
  • IntegerLong
  • Long または SingleDouble
  • CurrencyDouble → 実行時エラー

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

アカウントを作成 して、もっと沢山の記事を読みませんか?


この記事が気に入ったら ことりと さんを応援しませんか?
メッセージを添えてチップを送ることができます。


この記事にコメントをしてみませんか?


酒とアクアリウムが最近の楽しみ。

おすすめの記事