• ベストアンサー

KeyDownイベントが機能しない

エクセル2003を使用しています。 フォームを表示中に、エスケープキーを押したらフォームを閉じたいのですが KeyDownイベントが反応しません。 http://homepage1.nifty.com/tsware/tips/tips_251.htm を見てやってみたのですが 新ブックに新規フォームを挿入し、 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyEscape Then Unload Me End If MsgBox "" End Sub と記載し、フォームを実行しエスケープキーを押してみました。 しかし何も起こりません。 実験用のMsgBoxも表示されません。 「エスケープキーを押したらフォームを閉じる」以前に、 KeyDownイベントが反応しないのですが 何が原因なのでしょうか? 新ブックを作ってテストしているので 余計な動作に邪魔されていないと思います。 ご指摘よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.1

リンク先はアクセスの場合です エクセルとは少し違うようです エクセルのヘルプによると form上のフォーカスのあるコントロールのKeyDownイベントが実行対象のようです formのKeyDownイベントを使用するにはform上にコントロールを一つも配置しないか form上のコントロールにフォーカスを持たせないような処理をしないとならない したがって、質問のような処理をするならば form上のすべてのコントロールのKeyDownイベントに処理を書かなければならない 詳細はヘルプを参照してください

eurytdd
質問者

お礼

アクセスとエクセルでは違うのですね。 コマンドボタンを設置して コマンドボタンのKeyDownイベントにコードをコピペしたらできました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • takana_
  • ベストアンサー率44% (21/47)
回答No.4

画面にコマンドボタンを1個配置し、 プロパティからCancelを選択して、値をTrueにします。 ボタンクリックイベントを Private Sub CommandButton1_Click()   Unload Me End Sub とします。 以上でクリックしてもEscキーを押しても、フォームを閉じるようになります。 キャプションを「閉じる」か「キャンセル」にすれば普通の閉じるボタンとして使えますし、 表示したくなければ、フォームのInitializeイベントでボタンの位置を画面から追い出せば 見えなくなります。 Private Sub UserForm_Initialize()   CommandButton1.Top = -100 End Sub 蛇足ですが、ボタンのDefaultプロパティをTrueにすれば、Enterキーで反応するボタンになります。

eurytdd
質問者

お礼

仕組みは良くわかりませんができました。 takana_様有難うございます。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 Excel の場合は、オブジェクト名は、Form ではなく、UserForm ですが、#1さんのおっしゃるとおり、それぞれのコントロールのイベントの配下に入るので、通常、UserForm のKeyDown イベントが利きません。これは、Access のForm でも、プロパティでForm のキー・イベントの取得をしないと、キー・イベントを取得できません。 以前、私が書いた方法で、Application.Onkey で取る方法も、UserForm モーダルモードがOff であることが条件で、UserForm がアクティブな状態ですと、Esc キー・イベントが働きません。 http://oshiete1.goo.ne.jp/kotaeru.php3?qid=3447388 そこで、新たにコードを書いてみました。RaiseEvent で、イベントを設け、UserForm表示中にキーイベントを取得するようにしました。ただ、直接、Unload Me をしてしまうと、入力最中なども終わってしまうので、メッセージを付けました。 '------------------------------------------- ' UserForm Module '------------------------------------------- Private Sub UserForm_Activate()   myClass.inKeyChange vbKeyEscape End Sub Private Sub UserForm_Initialize()   Set myClass = New Class1 End Sub Sub myClass_keyEvent()  If MsgBox("終了してよろしいですか?", vbQuestion + vbOKCancel, "終了メッセージ") = vbOK Then   Unload Me  Else   myClass.inKeyChange vbKeyEscape  End If End Sub Private Sub UserForm_Terminate()  'イベント自体は終わっていますが、オブジェクトが残っています。  Set myClass = Nothing End Sub '------------------------------------------- 'Class Modlue, Module Name(Defalt): Class1 '------------------------------------------- Public Event myKeyEvent(ByVal mykey As Integer) Public Event keyEvent() Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer Public Sub inKeyChange(ByVal inkey As Long)   On Error Resume Next   Do Until GetAsyncKeyState(inkey) <> 0    DoEvents  Loop  RaiseEvent keyEvent  On Error GoTo 0 End Sub

eurytdd
質問者

お礼

クラスモジュールも使うのですね!試してみます。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • DreamyCat
  • ベストアンサー率56% (295/524)
回答No.2

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) これはご自分で記述を「変更」したのでしょうか? 自分で「書いた」のでしょうか? userformをダブルクリックすると左上のオブジェクト枠に UserFormと表示されるので、右上のモジュール枠から KeyDownを選び、その中にif以下を記述するだけです。 Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = vbKeyEscape Then MsgBox "esc" End Sub

eurytdd
質問者

お礼

リンク先のコードを自分で一部変更しました。 どうもこの方法だとうまく行きませんでした。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VB6.0 KeyDownイベントの対応

    VB6.0を使ってプログラム中ですが、下記の  Command10_KeyDown で、複合キー「 Ctrl + ↓」 だとイベント KeyDown を受信できるのですが、単純な キー「↓」だと、イベント KeyDown を受信でず、他のボタンにフォーカスが移ってしまいます。 Comman10_GotFocus に何か対応策を入れて、単純な キー「↓」のイベント KeyDown を受信する方法はないでしょうか? Private Sub Command10_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 40 Then execsub001() End If End Sub Private Sub Commnad10_Click() execsub001() End Sub Private Sub Comman10_GotFocus() 上記問題への対応策を此処に記述したい End If Private Sub execsub110() 内容は省略 End Sub

  • Keydownイベントについて

    VB6.0について質問です。 FormでKeydownイベントが動きません。 どのような原因が考えられますか? コードは以下のように記述しています。 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case vbKeyF8 cmd_F8.Value = True Case vbKeyF9 cmd_close.Value = True End Select End Sub

  • access2003 KeyDown の意味

    access2003です。 あるフォームのイベントプロシジャーの中に     Private sub btn_×_KeyDown(KeyCode As Integer, Shift As Integer) というのがありました。 この「 KeyDown」というのは、どういう操作が行われたときに実行されるのでしょうか。 「btn_×」というボタンにフォーカスがあるときにEnterキーが押されたときと思って いいのでしょうか。 よろしくお願いします。

  • VBA ユーザーフォームの Keypreview について

    いつもお世話になっています。 VBAのユーザーフォーム上で、KeyDown イベントを使いたいのですが、下のコードが動きませんでした。 Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If e.KeyCode = Keys.z Then MsgBox "効いてるよ!" End If End Sub エラー表示も出ません。 ウェブで調べたところ、VBでは「KeyPreview」プロパティーを「true」にすれば解決するという記事をあちこちで見かけましたが、VBA(Excel2003)のユーザーフォームプロパティには、そのような項目が見当たりません。コード上で無理やり設定してみるとエラーになります。 どのようにすれば解決するでしょうか? お知恵をお貸し下さい。

  • エクセルBVAのフォーム式のKeyCode~の意味がわかりません

    エクセルBVAです Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = vbKeyDown Then KeyCode = 0 End If End Sub ヘルプをみると キーを押したとき、およびキーを離したときに続いて発生します。KeyDown イベントはキーを押すと発生し、KeyUp イベントはキーを離すと発生します。 キーってenterのことですかね? なら、 If KeyCode = vbKeyDown Then KeyCode = 0 End If で、KeyCodeを0ににするってどういうことでしょうか?

  • KeyDownイベントで数字以外は発生しません。なぜでしょうか。

    KeyDownイベントで数字以外は発生しません。なぜでしょうか。 電卓を作っているのですが、キーボードからの対応をしているさなか大きな壁に当たりました。 フォームのKeyDownイベントでキーボードからの入力をキャッチする。 数字や演算、エンターキー。 フォームには、電卓を作るのに必要なボタンなどの配置はしてあります。 数字を表示する部分はLabel1にしています。 試験的に下記のソースで実験したところ、テンキーの数字以外、例えば演算キーをキーボードから入力すると、下記のソース通りならば、○算と表示されるはずです。しかし、なぜか数字と表示されます。 つまり、演算キーを押したにも関わらず、数字が入力されたとして処理されたということです。 なぜでしょうか。 そして、試験的にそれぞれが入力成功した時はLabelに表示されるようにしました。 Private Sub Form6_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown //↓エンターキーが押されたとき If e.KeyCode = Keys.Enter Then Label1.Text = "Enter" //↓演算キー及び点が入力されたとき ElseIf &H6A <= e.KeyCode <= &H6F Then Select Case e.KeyCode Case &H6A Label1.Text = "乗算" Case &H6B Label1.Text = "加算" Case &H6D Label1.Text = "減算" Case &H6E Label1.Text = "小数点" Case &H6F Label1.Text = "除算" End Select End If //↓delキーが押されたときの場合 If e.KeyCode = Keys.Delete Then Label1.Text = "Del" End If // ↓は数字1から9までが対象に入ります。 If &H60 <= e.KeyCode <= &H69 Then   Label1.Text = "数字" End If End Sub keycode表はマイクロソフトのキーコード定数を見て作りました。 僕がお伺いしたいのは、これらすべてを正常に対応させたいわけです。 数字、演算キー、その他のキーボード入力が正常にできるようにしたいのですが、どうもうまくできません。 なせかずべて数字ほうに行ってしまいます。これでは話にならないので、対処法はありませんか? 環境は Win7 Ultimate 64bit Visual Studio 2010 (VB) です。 何卒、よろしくお願い申し上げます。

  • 特定のキーを入力すると、visible=falseからtrueになるよ

    特定のキーを入力すると、visible=falseからtrueになるようにコーディングしたいのですがうまくいきません。次のようにalt+F12でFrameを表示させたいのですが全く反応しません。何故でしょう。 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case vbKeyF12 If Shift = vbAltMask Then Frame2.Visible = True End If End Select End Sub アドバイス願いますm(_ _)m

  • Ctrl+vのイベントを解除

    VB2010で、データグリッドビューのグリッドにペーストさせたくありません。 Ctrl+vのイベントを解除させる方法はないでしょうか? ご存知の方おしえてください。よろしくお願いします。 Private Sub DataGridView1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyDown If e.Control And e.KeyCode = Keys.V Then      'ココにイベント解除を入れたいです End If End Sub

  • 新規レコードへ移動しない

    Access2010を使用しています。 サブフォームからメインフォームの「登録」ボタンプロシージャをCallした時、メイン・サブフォーム共に新規レコードへ移動しなくて困っています。 具体的には、サブフォームにフォーカスがある時に「F12」を押すと画面の入力項目の内容刃そのままでメインフォームの「注文番号」テキストボックスにフォーカスが移動します。 メインフォームにフォーカスがあるか、マウスで「F12」をクリックすると画面の入力項目がクリアされて新規レコードへ移動します。 コードは以下の内容が記述してあります。 ーーーーーサブフォーム----- Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case 123 Call Me.Parent.Form_KeyDown(KeyCode, Shift) KeyCode = 0 End Select End Sub -----メインフォーム----- Public Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case 123 Call 登録_Click KeyCode = 0 End Select End Sub Private Sub 登録_Click() DoCmd.GoToRecord , , acNewRec Me.注文番号.SetFocus End Sub

  • vb コンボボックスのイベントについて

    こんばんわ。 コンボボックスで、 指定の値をマウス操作でクリックしたときと、 キーボードの上下で、移動後returnを押したときだけ、 MsgBox "処理実行" を実行したいです。 keystateを使ってみたのですが、前の情報が残っているのかうまくいきません。keystateの情報をクリアさせるか、シンプルに上記を動作させる何かよい方法はありますでしょうか。 Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer Dim flg1 As Boolean Private Sub form_load() Combo1.AddItem (11) Combo1.AddItem (22) Combo1.AddItem (33) Combo1.AddItem (44) End Sub Private Sub Combo1_Keyup(KeyCode As Integer, Shift As Integer) If KeyCode = 13 Then 'return flg1 = True Call Combo1_click End If End Sub Private Sub Combo1_click() If (GetKeyState(&H26) <> 0) Or (GetKeyState(&H28) <> 0) Then ' ↑↓ If flg1 = False Then Exit Sub End If End If MsgBox "処理実行" flg1 = False End Sub

このQ&Aのポイント
  • ブラザー製品の紙詰まりトラブルでお困りですか?本記事では、両面印刷時に2枚目が戻らずに紙が見えない場所に詰まってしまう問題を解決する方法を詳しく解説します。
  • お使いの環境についても詳しく教えていただき、無線LAN接続やひかり回線の使用状況なども確認してトラブルシューティングに役立てましょう。
  • さらに、ブラザー製品に関する質問についてもお答えしますので、お困りの方はぜひご覧ください!
回答を見る

専門家に質問してみよう