【2/17】今年は「濃厚」技術トーク!@ITメールセミナー スラッシュドット    はてなブックマーク  Yahoo!ブックマークに登録  印刷
   
基礎解説
チェック式 WSH入門 第5回

5.明示的な型変換と特殊な値

Microsoft MVP
Visual Developer - Scripting
牟田口 大介
2006/09/22

明示的な型変換

 では、先ほどの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関数を用いる)、実際に日付型に変換し、現在との年間隔(つまり、年齢だ)を求めるスクリプトを組んでみよう。日付の計算には、前回解説した関数が利用できる。

マーカーで隠れたところを、1つずつクリックしてチェックしてみよう。 マーカーで隠れたところを、1つずつクリックしてチェックしてみよう。
Dim strDate, dtmDate

strDate = InputBox("あなたの生年月日を入力してください。")

        MsgBox "あなたの年齢は"  & _
Else
        MsgBox "正しい日付を入力してください。"
End If

 IsDate関数とCDate関数の組み合わせがキーとなる。IsNumeric関数とCDbl関数の組み合わせと基本は同じである。

 なお、DateDiff関数の戻り値はLongなので、ここでは明示的にCStr関数を使って文字列型に変換している。関数の戻り値など、型があらかじめ分かっている場合は、IsNumeric関数などで変換可能かを調べる必要はない。

VBScriptの特殊な値EmptyとNull

 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を扱ううえで欠かせない知識となる、「配列」を取り上げて詳説する予定である。End of Article


 INDEX
  [基礎解説]チェック式 WSH入門
  第5回 データ型について理解を深めよう
    1.VBScriptのデータ型
    2.形名の調査と数値データ型
    3.ブール・データ型
    4.暗黙の型変換
  5.明示的な型変換と特殊な値
 
 基礎解説

ホワイトペーパーTechTargetジャパン

Windows Server Insider フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

スキルアップ/キャリアアップ(JOB@IT)

- PR -
- PR -

お勧め求人情報

キャリアアップ 〜JOB@IT
@IT Special -PR-
  企業の仮想化に足りない“発想”とは?
仮想化運用管理のキモは意外なところに!

New!
  操作もマニュアルも分かりやすい!
ユーザー視点で開発されたPC管理ツール

New!
  仮想化すればコストは削減できるか?
仮想化に必要な「3つの視点」を解説する

  セキュリティを知り尽くす上野氏が登壇!
@ITメールソリューションLive! in Tokyo

  運用管理の課題を“2つの観点”から分析
ユーザー満足度の高い「仮想環境」とは?

  世界に通用するストレージの作り方とは?
製品に込めた思いを富士通の開発者に聞く

  OSSで手間も時間も、障害も減った――
「マピオンの事例」オープンソース活用法

  「ノートPCの持ち出し禁止」で大丈夫?
情報漏えいを防ぐ管理手法とインフラは?

  1日の処理を1秒に――MySQLの達人が語る
「コスト削減」できるチューニング

  ドキュメント作成を自動化して、SEの作業
効率を大幅アップ! Visio 2007の魅力

  急速に広がるHyper-Vでのサーバ仮想化
そのベストプラクティスをデルが解説

  @IT主催セミナーで語られた、「担当者に
求められるセキュリティ対策」をレポート

  @IT「Windows 7」 特設サイトオープン!
最新情報・移行ノウハウを公開しています