メイン画像

VBScript 変数

VBScript 変数


VBScript の変数の型は、すべてバリアント型(Variant)になる。

バリアント型(Variant)の特徴は以下のとおり。

  • 初期値は Empty となる。
  • どんなデータ型でも格納できる。
  • 値が格納されたら、その値のデータ型で保持される。
    たとえば、整数(Integer)を格納した場合、その Variant は Integer として扱われる。

Variant の内部データ型

Variant に値を格納したとき、どのデータ型になるのか。

サンプル VarType 関数の戻り値 TypeName 関数の戻り値 備考
Dim a 0 Empty 変数の初期値は Empty になる。
a = Null 1 Null  
a = 1 2 Integer  
a = 32768 3 Long Integer の範囲を超えたため Long になる。
a = 2147483648 5 Double Long の範囲を超えたため Double になる。
a = 1.0 5 Double Single で扱える範囲の実数を格納しても Single にはならなかった。
a = CSng(1) 4 Single Single にするときはCSng関数で明示的に型変換する。
a = CCur(1) 6 Currency Currency にするときはCCur関数で明示的に型変換する。
a = #1993-05-31#
a = #10:08:32#
a = #1993-05-31 10:08:32#
7 Date  
a = "文字列" 8 String  
Set a = CreateObject("Scripting.Dictionary") 9 Dictionary  
Set a = CreateObject("ADODB.Stream") 9 Stream  
Set a = CreateObject("Excel.Application") 8 Application VarType 関数からなぜか 8 が返される。8 は文字列なのだが……。
a = True
a = False
11 Boolean  
a = CByte(&H00C9) 17 Byte Byte にするときはCByte関数で明示的に型変換する。
a = Array(1,2,3) 8204 Variant()  

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

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

Empty の扱い

変数が Empty かどうか判定するときはIsEmpty関数を使う。

e.g. 以下のコードを実行すると、メッセージ「Empty です」が表示される。

Dim val

If IsEmpty(val) Then
    MsgBox "Empty です"
Else
    MsgBox "Empty ではありません"
End If

Empty が数値として扱われる場合は 0 となる。
文字列として扱われる場合は空文字(““)となる。

e.g. 以下のコードを実行すると、メッセージ「0 です」に続けて「空文字です」が表示される。

Dim val

If IsEmpty(val) Then
    If val = 0 Then
        MsgBox "0 です"
    End If
    
    If val = "" Then
        MsgBox "空文字です"
    End If
Else
    MsgBox "Empty ではありません"
End If

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


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


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


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

おすすめの記事