- ベストアンサー
テキストボックスの数値チェック
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)
- みんなの回答 (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 など。 外しましたらご容赦願います。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17070)
#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
お礼
imogasi様 ありがとうございます。 おっしゃるとおりに、定数宣言がるのるのですから、あえて変数を使用する必要はありませんが、私としては、何故定数だとOKで変数の場合に正常に比較出来ないのかも知っておきたかった次第です。 他の方に指摘されましたが、文字列を数値に変換したうえで比較する方法がベストのようです。 ありがとうございました。
- sendaitaro
- ベストアンサー率25% (6/24)
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 きちんとデバッグできてなかったら ごめんなさい。
お礼
sendaitaro様 ありがとうございます。 ご指摘通り、Compare関数を採用するのがスマートなようです。 参考にさせていただきます。 ありがとうございました。
お礼
onlyrom様 ありがとうございます。 おっしゃるとおり、数値に変換する方法が一番の解決方法のように 思います。 たまたま、VB側で面倒みてくれていたのですね。 ありがとうございました。