VBSプログラミング最初の一歩 VBScript

足し算でうまくいかないのはなぜ?

さきほどのようにInputBoxで2つの値を入力し、その値を元に計算して、結果を画面に出す、というプログラムはかけ算、割り算、引き算ではうまくいきます。しかし、足し算ではうまくいきません。

num1 = InputBox("値を入力してください")
num2 = InputBox("値を入力してください")

MsgBox num1 + num2

このプログラムで、例えば最初の入力で3を、次に5を入力したとします。すると答えは8ではなく、35になってしまいます。これはなぜでしょうか?

それは、InputBoxから返されるデータは、数値ではなく文字列だからです。
文字列であるデータを数式に書いているわけです。

しかし、それでもかけ算や割り算の時にはうまくいっていました。これはなぜでしょうか? それは、「文字列のかけ算」というものはありませんので、コンピュータが「あ、これは文字列を数値に変換してかけ算をやれということだな」と勝手に解釈してくれるからです。割り算や引き算の場合も同様です。

しかし、足し算のときだけは事情が違います。なぜなら文字列には足し算があるからです。VBScriptでは文字列同士を足し算していると文字列の連結とみなします。ですから、「3」と「5」という文字を連結して「35」となるわけです。

では、どうしたらよいでしょうか? 正しく足し算するためには、文字列として入力された値を数値データに変換してやる必要があります。以前、逆のことをする関数が出てきました。数値を文字列に変換する関数 CStr というものです。CStrと逆に文字列を数値に変換する関数として CInt (Change Integerの略)というものがあります。

str1 = InputBox("値を入力してください")
str2 = InputBox("値を入力してください")

num1 = CInt(str1)
num2 = CInt(str2)

MsgBox num1 + num2

いったん str1とstr2 に入力された文字列をCInt関数を使って数値に変換し、num1とnum2に入れています。こうするとnum1とnum2が数値になるので、うまく足し算できるわけです。

また、CIntを使う行とInputBoxを使う行をまとめることも出来ます。CInt関数の中にInputBox関数を書きます。

num1 = CInt(InputBox("値を入力してください"))
num2 = CInt(InputBox("値を入力してください"))

MsgBox num1 + num2

CIntの括弧の中にInputBoxを書いています。このように書くと、まず括弧の中のInputBoxから処理の実行が行われます。つまり、「値を入力してください」という画面が出て、値を入力する処理が行われます。そして、InputBoxが返すデータ(文字列)を今度はCInt関数が処理をして、数値データとしてnum1に返すわけです。

このようにInputBoxで入力した変数は常に「文字列」になるため、数値を入力してもらう場合には気をつける必要があります。数値を入力する際にはCIntを忘れないようにしましょう。

問題5-3:
値を入力し、その値に2を足した値を表示しよう。