![メイン画像](https://topview.jp/uploads/2024/06/1717430660-vbscript-データ型-バリアント型-variant-とは-1024x615.png)
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
計算結果が元のデータ型を超えると自動で拡張される
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 - オーバーフローしました。
アカウントを作成 して、もっと沢山の記事を読みませんか?
この記事が気に入ったら ことりと さんを応援しませんか?
メッセージを添えてチップを送ることができます。
この記事にコメントをしてみませんか?