- 締切済み
VBAに関する質問です!!
下記のコードで実行すると、「値が大きすぎます。」と出るのはなぜですか? ※得点1にはユーザーフォーム上で3が、大問1には2が入力されており、tokuは8が抽出されている状態です。 ata = 得点1 dai = 大問1 toku = WorksheetFunction.VLookup(級, Sheets("sheet1").Range("I:O"), dai + 2, False) If ata > toku Then MsgBox "値が大きすぎます。" 得点1.SetFocus 'TabIndex最後のコントロールにフォーカスをセット SendKeys "+({TAB})" 'TabIndex 最初の TextBox1 にフォーカスをセット Exit Sub End If お願いします。(>人<;)
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- rivoisu
- ベストアンサー率36% (97/264)
質問する前に if文のところでBreakして ata toku の値をイミディエイトウインドウで確認すればいいのではないでしょうか? 絶対あなたの思っている値が入ってないはずです。
- うぃず(@Wizard_Zero)
- ベストアンサー率69% (344/495)
#2 hige_082 さんの方法で解決すると思いますが、補足的に説明を。 プログラムでは「数字」と「数値」は別物であり、混合で比較すると今回のような不整合が発生します。 ためしに次のコードを動かしてみてください。 Sub Main() Dim A, B A = "3" ' 3という「数字」 B = 8 ' 8という「数値」 MsgBox A > B MsgBox Val(A) > Val(B) End Sub 値の大きさによる比較をするなら「数値」にそろえるべきで、そのための関数が「Val」です。Val以外にもCIntやCDbl等の「数字→数値」変換関数があります。動作が微妙に違うので詳しく知りたければ調べてみるとよいでしょう。 また、MsgBoxで変数の中身を見るのも結構ですが、MsgBoxではすべて「文字列(数字)」に置き換えられてしまい、数値と数字の違いによる結果の相違には気づかないことがよくあります。変数に格納されたデータを調べるには MsgBox TypeName(A) と書けば、数字(String)なのか数値(Integer)なのかが分かります。 ではなぜ数字と数値が混在してしまったのか。 TextBoxから取り出したデータはすべて文字列、つまり「数字」になります。対して、シートから取り出した値は、セルに収められたデータ形式に依存します。セルに数値が入っていれば「数値」として受け取るため、このような現象が起こります。
- imogasi
- ベストアンサー率27% (4737/17069)
得点1 大問1 この前段階で適当な数値にセットしているのか。 そんなことを書きもせず、簡単な実例もあげず、質問するのはおかしい。 プログラム作成はコードそのものもある(ここに注目しがちだ)が、データのほうとの合作(相性)作業だ。 >普通ta > toku に ならない理由ぐらい説明しておいたら。
- hige_082
- ベストアンサー率50% (379/747)
>ata = 得点1 の得点1は、textboxそれともconboboxかな だとすれば、ataの値は文字列型の数字となると思います 計算に使用するなら、数値型に変換する必要があるかも知れません >ata = 得点1 >dai = 大問1 >toku = WorksheetFunction.VLookup(級, Sheets("sheet1").Range("I:O"), dai + 2, False) の下に ata=cint(ata) dai=cint(dai) toku=cint(toku) を追加してみてください 参考まで
- camputer
- ベストアンサー率64% (22/34)
toku = WorksheetFunction.VLookup(級, Sheets("sheet1").Range("I:O"), dai + 2, False) の下に MsgBox (ata & "/" & dai & "/" & toku) と追記&実行してみてはいかがでしょう. 希望通りの値が取れていれば「3/2/8」と表示されるはずですが..
補足
回答ありがとうございます。 何度 MsgBox (ata & "/" & dai & "/" & toku) で確認してみても「3/2/8」となるのですが、 その先を実行すると、なぜか「値が大きすぎます。」と表示されてしまいます。 なぜ(?.?)?