初めて自分の家と他人の家が違う、と意識した時

VB6ユーザ(初心者)です。
テキストボックスに入力した数値の範囲チェックを行い、任意の最小~最大範囲内か否かを判定しています。
最大の判定は問題無いのですが、最小側の判定は、正常な場合と、そうでない場合がありますので、どなたか教えてください。
例として、最小~最大範囲を-100~100とします。

1)正常な場合 1/2 「即値と比較する場合」
If Text1.Text < -100 Then '問題無く判定出来ます。

2)正常な場合 2/2 「定数と比較する場合」
  標準モジュールに下記定数を定義しています。
Public Const LimitMax As Long = 100
Public Const LimitMin As Long = -100

If Text1.Text < LimitMin Then '問題無く判定出来ます。

3)正常でない場合 「2)の定数を変数に代入して比較する場合」
Dim MinVal As Long

MinVal = LimitMin
If Text1.Text < MinVal Then '正常に判定出来ません。

上記1),2)の場合は、正常に判定されます。
しかし、上記3)の場合、テキストボックスに「-1」または「-10」等の数値を入力すると、必ず「-100より小さい」と判別されてしまいます。

変数の値を確認すると、正常に「-100」が代入されています。

判定方法に問題があるのでしょうか?或いはテキストボックスのTextプロパティ(文字列)と変数の比較自体に問題があるのでしょうか?

どなたか、アドバイスをお願いいたします。

開発環境は、以下の通りです。
 OS: Win2000
 VB: Ver6(SP6)

A 回答 (3件)

Text1.Text の値は常に文字列です。


数字を入力してもそれは文字列の数字ですから、
数値と比較するときは、数値に変換してから比較する
というのが基本です。

例えうまくいく場合があったとしても
それはVBの方で面倒をみてくれているわけで
本当の比較の仕方ではありません。

If Val( Text1.Text ) < MinVal Then
If CLng( TextBox1.Text ) < MinVal Then
If CInt( TextBox1.Text ) < MinVal Then
If CDbl( TextBox1.Text ) < MinVal Then

など。

外しましたらご容赦願います。
 
    • good
    • 1
この回答へのお礼

onlyrom様
ありがとうございます。

おっしゃるとおり、数値に変換する方法が一番の解決方法のように
思います。
たまたま、VB側で面倒みてくれていたのですね。
ありがとうございました。

お礼日時:2007/10/18 00:00

#1でおっしゃるように、テキストボックスの値をとると、文字列で帰っています。

もともと数字もキーボードから入るコードがとりあえず文字列だからです。
ーー
もうひとつ質問の解決には関係ないですが
Public Const LimitMin As Long = -100
と定義して置いて
MinVal = LimitMin
If Text1.Text < MinVal Then
とやる必要は無いと思います。
If Text1.Text < LimitMin Then で良いのではないですか。
戸惑います。
定数も、メモリ的には変数と同じで、約束事で、宣言に過ぎないと思います。ただVBの場合言語仕様で、変更しようとするとエラーにしてくれる効果はあります。
しかしその宣言が、意味論的にコード作成や、解読に威力を発揮するのです。
Public Const zeirituc = 0.05
Sub test01()
Dim kin As Currency
Dim zeiritu As Double
Dim zei As Currency
kin = 1000
zeiritu = 0.05
zei =int( kin * zeiritu)
MsgBox zei
End Sub
Sub test02()
Dim kin As Currency
Dim zei As Currency
kin = 1000
zei =int( kin * zeirituc)
MsgBox zei
End Sub
    • good
    • 0
この回答へのお礼

imogasi様
ありがとうございます。

おっしゃるとおりに、定数宣言がるのるのですから、あえて変数を使用する必要はありませんが、私としては、何故定数だとOKで変数の場合に正常に比較出来ないのかも知っておきたかった次第です。

他の方に指摘されましたが、文字列を数値に変換したうえで比較する方法がベストのようです。

ありがとうございました。

お礼日時:2007/10/18 00:08

VBらしく作るならこんなかんじでしょうか?


Private Sub Command1_Click()
Dim iret As Boolean
'Numeric_Check
If IsNumeric(Text1.Text) = True Then
'関数の引数に最大値、最小値、比較対象値をセット
iret = compare(100, -100, CLng(Text1.Text))
'戻り値がTrue(範囲内)
If iret = True Then
MsgBox "good"
Else
MsgBox "ng"
End If
Else
'Numeric_Err
MsgBox "数値を入力してください。"
End If
End Sub

Function compare(ByVal lmax As Long, ByVal lmin As Long, _
ByVal data As Long) As Boolean
'引数より比較結果をbooleanで返却
If data > lmin And data < lmax Then
compare = True
Else
compare = False
End If

End Function
きちんとデバッグできてなかったら
ごめんなさい。
    • good
    • 0
この回答へのお礼

sendaitaro様
ありがとうございます。

ご指摘通り、Compare関数を採用するのがスマートなようです。
参考にさせていただきます。

ありがとうございました。

お礼日時:2007/10/18 00:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報