型名の区別(2)

Variantを使うなと言う説明の中で次のようなプログラムをみかけた。
Dim x,y
x = TextBox1
y = TextBox2
MsgBox x + y
TextBoxというのはVBで使えるGUIのパーツの一つで、文字を入力できる箱のことである。
ふたつの箱に数値を入れるとその合計を表示するという期待である。
実際には例えば3と4を入れると34と表示されてしまう。
なぜならTextBox1は文字列を返すからであり、xは文字列変数となり、x,yともに文字列だから文字列の結合となってしまうわけです。
これを持ってVariantを使うのは危険だという趣旨の警鐘です。

しかしこのプログラム自体(VBAの仕様含め)がVariant以前に穴が多すぎるのが問題なのです。
確かに変数宣言を数値型にすれば数値として計算され期待通りになるのかもしれない。
しかしそれで良しとする考えが間違っています。
少なくとも文字列を返している以上は、明示的に数値変換して取り扱うべきです。

それ以前に使用者が数値を入れてくれるという前提(期待)が間違っています。
文字が入った数値をミスタイプで入れてしまうかもしれないのですから。
変数宣言を数値型にしたと仮定しましょう。
Dim x as Long,y as Long
x = TextBox1
y = TextBox2
MsgBox x+y
このプログラムは、数値以外が入力された時点でエラーで停止してしまいます。
ユーザーの誤操作でプログラムが止まってしまうなど言語道断です。
ではどうすればいいか。
一度文字列で受け取って、入力された文字列(値)の妥当性をチェックをするべきです。
(わざとエラーにしてエラーGOTOを使うというやり方もありますが)

その処理を入れれば次はその文字列を明示的に数値に変換します。
具体的には、例えばIsNumericという「数値ならTrue」を返す組み込み関数を使います。
このチェックでFalseなら「数字以外は入れるな」とユーザーに知らせます。
明示的数値変換はVal関数を使います。
単純に数字かのチェックだけやるとしたら次のようになるでしょう。
Dim x,y
x = TextBox1
y = TextBox2
If IsNumeric(x) Then
x = Val(x)
Else
MsgBox "数値ではありません"
End If
If IsNumeric(y) Then
y = Val(y)
Else
MsgBox "数値ではありません"
End If
MsgBox Val(x)+Val(y)
実際には数値の範囲のチェックであるとか色々やるべきことはあります。
手抜きサンプル例でVariantを使っては駄目だという論理は納得できません。

重要なのはなにか値を受け取ったらそれが何であるかをきちんとプログラムで認識して処理をすることではないでしょうか。
よくわからないものをわからないからVariantに突っ込むのはバグとなり問題になって当然です。

明示的に数値にするのならVal関数があるわけです。
明示的に文字列にするならStr関数があります。
明示的に文字列として連結するのなら“&”演算子があります。
前に述べたように+演算子に問題があるのでそのことを意識して使う必要があります。
それをやらずにVariant悪玉論になることには疑問に感じます。
comments (0)

コメント

Comment Form