最近、VBを始めた超初心者ですがよろしくお願い致します。
現在、手始めに電卓を一から作っているのですがテンキーから数字及び
+-*/を各入力して最後にエンターキーで答えを出すようにしているのですが
どうしてもエンターキーを押すときのみ=ボタンの上にフォーカスが移動されないのです。
ですのでその状態でエンターを押しても現在、フォーカスがあるボタンの数字が入ってしまいます。さっぱりわからず頭を抱えております。
一応、下記にテンキー入力の所とイコールボタン(Command1)のソースを書いておきますのでご指導の程、よろしくお願いします。
----------------------------------------------------------------------
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
'キーボード入力対応
If KeyCode = 13 Then
Command1.SetFocus
Command1_Click
ElseIf KeyCode = 96 Then
Command11.SetFocus
Command11_Click
ElseIf KeyCode = 97 Then
Command2.SetFocus
Command2_Click
ElseIf KeyCode = 98 Then
Command3.SetFocus
Command3_Click
ElseIf KeyCode = 99 Then
Command4.SetFocus
Command4_Click
ElseIf KeyCode = 100 Then
Command5.SetFocus
Command5_Click
ElseIf KeyCode = 101 Then
Command6.SetFocus
Command6_Click
ElseIf KeyCode = 102 Then
Command7.SetFocus
Command7_Click
ElseIf KeyCode = 103 Then
Command8.SetFocus
Command8_Click
ElseIf KeyCode = 104 Then
Command9.SetFocus
Command9_Click
ElseIf KeyCode = 105 Then
Command10.SetFocus
Command10_Click
ElseIf KeyCode = 107 Then
Command12.SetFocus
Command12_Click
ElseIf KeyCode = 109 Then
Command13.SetFocus
Command13_Click
ElseIf KeyCode = 106 Then
Command14.SetFocus
Command14_Click
ElseIf KeyCode = 111 Then
Command15.SetFocus
Command15_Click
ElseIf KeyCode = 27 Then
Command16.SetFocus
Command16_Click
End If
End Sub
----------------------------------------------------------------------
Private Sub Command1_Click()
If Label1.Caption = "0." Then
MsgBox "最初の数字を入れてください", vbOKOnly, "警告"
Label1.Caption = "0."
Else
Label3.Caption = Y
Select Case 演算
Case 1
B = Val(X) + Val(Y)
Case 2
B = Val(X) - Val(Y)
Case 3
B = Val(X) * Val(Y)
Case 4
B = Val(X) / Val(Y)
End Select
X = Str(B)
Y = ""
B = ""
' 前後 = 1
' A = 1
End If
Label1.Caption = X
End Sub
----------------------------------------------------------------------
Form_KeyDownにEnterキーが押されたときを追加してみてください。
早速のご指導ありがとうございます。
>Form_KeyDownにEnterキーが押されたときを追加してみてください。
っていうのはどういう事でしょうか?
If KeyCode = 13 Then
Command1.SetFocus
Command1_Click
の部分がEnterキーを押した時のイベントになると思うのですが・・・
それともElseIfでもう一度、エンターを押された時のものを追加と
いう意味でしょうか?
初心者ですいません。
追記
Form_KeyDownを抜けるときに KeyCode=0 を入れておかないと処理の後に
キー入力が効いてしまいます。
>If KeyCode = 13 Then
Enterの処理とは気づきませんでした。すいません。
私の場合は、If KeyCode = vbKeyReturn Then と書いてしまうもので。。。
ややこしい書き方で申し訳ございません。
聞きたいのですが記述的には問題ないんでしょうか?
いろいろ調べてみたのですがエンターキーを押した時点では
KeyCodeには何も値が入らないような感じなんですがエンターキーを
押して何かをしようとする時は何か別の記述や定義をしないと
いけないのでしょうかね?
Chr$(13)だったりして
>聞きたいのですが記述的には問題ないんでしょうか?
Form_KeyDownがまずいのかもしれませんね。
何かボタンを押したことによって、そのボタンにフォーカスがあたりますから、
次のキー入力はForm_KeyDownに入らないのではないでしょうか?
Form_KeyDown内のソースを関数化してどのコントロールにフォーカスがあるときでも、その関数を呼ぶようにすればいいと思います。
>Chr$(13)
とやると”型が違います”とエラーがでますね。
複数のコマンドボタンをFormの上に配置するとなんかEnterキーが効いてないような
気がします。=のコマンドボタンだけ配置してEnterキーを押下するとちゃんと動作をしてくれるのですが・・・
>何かボタンを押したことによって、そのボタンにフォーカスがあたりますから、
>次のキー入力はForm_KeyDownに入らないのではないでしょうか?
一応、例として"15+20="という計算をするとしたらテンキーで"15+20"まではちゃんと入るのですが"=(Enterキー)"だけが動作しない状態です。
追記
テンキーの"1"を押して次に"5"を押すと画面にはちゃんと"15"と出てくるという事です。
Enterキーを押したときはForm_KeyDownイベントが発生しないということですか?
>Enterキーを押したときはForm_KeyDownイベントが発生しないということですか?
はい、その通りです。他のテンキーは全て動作するのですが・・・
Enterキーを押したとき、KeyPressイベントは発生しませんか?
>Enterキーを押したとき、KeyPressイベントは発生しませんか?
すいません、それは試していないです。今から退社するのでまた、明日にでも試してみたいと思います。
ABCさん、いろいろ教えていただいてありがとうございます。
っていうかさ、違うボタンにフォーカスがある状態でEnterキーを押せば、その現在フォーカスがあるボタンを押したことになるからそっちの処理が優先されるんじゃない?
簡単に言えば、各ボタンを押した時にフォーカスをボタンに移さなければいいのではないかと思うんだけど
ボタンを押した時にフォーカスをFormや数値表示部に与えればいいのではないかな?
通ってみたさんありがとうございます。
早速、明日、試してみたいと思います。
ご意見ありがとうございました。
一つ確認
当然、FormのKeyPreviewの値はTrueになっているんだよね?
>いな氏
ほかのキーは反応してるらしいから、なってるんじゃないかな?
と横レス。
> 名無し さん
ひょ〜っとしたら、
フォーカスの位置によって、設定して無くてもイベントが
反応しちゃってた・・・。とかいうこともあるしさ。(ないか
すいません、レス遅くなりました。
結局、各テンキーを押した時に全て=にフォーカスがいくような感じで
落ち着きました。
結局、最後までEnterキーを押してもKeycode=13にならないのはなぜかという疑問は残ったままになってしまいました。アドバイスをいただいたみなさまありがとうございました。
解決後で恐縮ですが、違ったらゴメンなさい。
キーボードとテンキーのEnterキーの値が違ったような…。
違うか…。
(今、テンキー持ってないから試せません)
>KEN さん
AT 互換機ならば一緒だと思います。
Enter によるフォーカス遷移ですが、CommandButton では普通取れませんよね。
2002 以降だと Button コントロールでも ProcessCmdKey などをオーバーライドすることで取れるんですがねぇ。
http://jeanne.wankuma.com/tips/form/27-cobolerform.html
ツイート | ![]() |