では、先ほどのXとYの値をそれぞれ入力して、数値として足し算したい場合はどうするかというと、関数を用いた明示的な型変換が必要になる。
先ほどのコードを、関数を用いて明示的に型変換を行うようにする。
Option Explicit
Dim strX, strY, dblX, dblY, dblSum
strX = InputBox("Xの値を入力してください。")
If IsNumeric(strX) Then
dblX = CDbl(strX)
Else
dblX = 0
End If
strY = InputBox("Yの値を入力してください。")
If IsNumeric(strY) Then
dblY = CDbl(strY)
Else
dblY = 0
End If
dblSum = dblX + dblY
MsgBox strX & "+" & strY & "=" & dblSum
このスクリプトを先ほどと同じようにXに100、Yに50を入力すると、次のような結果になる。
このように、文字列を数値に明示的な変換を行うと、正しい演算が行える。
ここではまずInputBox関数で入力した文字列が、数値に変換可能かをIsNumeric関数で調べている。IsNumeric関数は、引数に渡された文字列が数値に変換可能だとTrueを返す。
変換可能だということが分かったら、あとは実際に変換を行う。その際に用いるのがCDbl関数である。この関数は、Double以外の型(Stringやほかの数値型)をDoubleに変換する関数である。これが明示的な型変換である。
明示的な型変換に用いる関数としては、次のようなものがある。
関数名 | 説明 |
---|---|
CBool | ブール型(Boolean)に変換 |
CByte | バイト型(Byte)に変換 |
CCur | 通貨型(Currency)に変換 |
CDate | 日付(時刻)型(Date)に変換 |
CDbl | 倍精度浮動小数点型(Double)に変換 |
CInt | 整数型(Integer)に変換 |
CLng | 長整数型(Long)に変換 |
CSng | 単精度浮動小数点型(Single)に変換 |
CStr | 文字列型(String)に変換 |
明示的な型変換に用いる関数(変換関数) |
VBScriptは型を宣言することがないため、暗黙の型変換が行われる場面が多く、通常は型変換を意識しなくてもよいのだが、先ほどの100+50=10050のような例もあるので、これらの変換関数を用い、型を意識したコードの記述を心掛けた方がよい。
次の例題では、文字列から日付への変換を行ってみよう。InputBoxで入力した文字列が日付かどうかを判定し(IsDate関数を用いる)、実際に日付型に変換し、現在との年間隔(つまり、年齢だ)を求めるスクリプトを組んでみよう。日付の計算には、前回解説した関数が利用できる。
IsDate関数とCDate関数の組み合わせがキーとなる。IsNumeric関数とCDbl関数の組み合わせと基本は同じである。
なお、DateDiff関数の戻り値はLongなので、ここでは明示的にCStr関数を使って文字列型に変換している。関数の戻り値など、型があらかじめ分かっている場合は、IsNumeric関数などで変換可能かを調べる必要はない。
VBScriptのどのデータ型にも属さない特殊な値として、Empty値とNull値がある。
Empty値とは、初期化されていない値のことである。つまり、変数を宣言し、代入する前に格納されている初期値である。
Option Explicit
Dim valEmpty
MsgBox TypeName(valEmpty)
このようなスクリプトを実行すると、結果は“Empty”となる。
Empty値は、文字列として扱われる場合は長さ0の文字列("")、数値として扱われる場合は0、ブール値として扱われる場合はFalseと等しくなる。つまり、
Option Explicit
Dim valEmpty
MsgBox valEmpty & "生きることは、戦うことでしょう?"
は、長さ0の文字列""と、ある文字列が結合された文字列が表示される。
また、
Option Explicit
Dim valEmpty
MsgBox valEmpty + 1
を実行すると0+1が計算され、1と表示される。
また、
Option Explicit
Dim valEmpty
If valEmpty Then
MsgBox "True"
Else
MsgBox "False"
End If
を実行すると、Falseと判定されるため、“False”が表示される。
VBScriptにはEmpty値が存在するために、変数に値を代入しなくてもすぐに初期値として用いることができるので便利だが、意図した型とは違う型として扱われることを防ぐためには、変数を宣言した後、初期値を代入した方がよい(valEmpty = "" 、valEmpty = 0 、valEmpty = Falseなどとする)。
なお、IsEmpty関数に変数を引数として渡すと、変数がEmptyならTrueを返すので、初期化されているかいないかが分かる。
この関数を利用して、InputBox関数で「キャンセル」ボタンをクリックしたかどうか判別できる。
Option Explicit
Dim strMessage
strMessage=InputBox("あなたの座右の銘を入力してください。")
If IsEmpty(strMessage) Then
MsgBox "キャンセルをクリックしました。"
ElseIf strMessage="" Then
MsgBox "何も入力されていません。"
Else
MsgBox "あなたの座右の銘は「" & strMessage & "」です。"
End If
キャンセルをクリックすると、InputBox関数の戻り値はEmptyになるため、IsEmpty関数の結果がTrueとなる。何も入力せずにOKを押したときは、長さ0の文字列("")が返されるので、両者を区別することができる。ちょっとしたテクニックとして覚えておこう。
Null値は、Empty値とは違い、「無効な値」を意味する。WSHでは主にデータベースを扱う際、Nullの項目を変数に代入するとNull値が格納される。x = NullのようにしてNullを変数に代入することもできる。
Null値は無効な値なので、数値演算などを行うとNull値のままになる。また、関数などの引数に渡すとエラーが発生することもある。論理演算を行う際もNull値が含まれると特有の扱いをされるので注意が必要だ。
なお、IsNull関数にNull値を引数として渡すとTrueを返される。これを利用すると、変数がNullかどうかを判別できる。
今回は、VBScriptを使ううえで必要となる知識、「変数の型」を取り上げ、その種類と取り扱いを述べるとともに、型同士の相互変換を行ううえでの注意点を中心に述べた。次回もやはりVBScriptを扱ううえで欠かせない知識となる、「配列」を取り上げて詳説する予定である。
Copyright© Digital Advantage Corp. All Rights Reserved.