解決済み

KeyDownイベントが機能しない

  • 暇なときにでも
  • 質問No.5372942
  • 閲覧数4244
  • ありがとう数7
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 99% (346/349)

エクセル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イベントが反応しないのですが
何が原因なのでしょうか?

新ブックを作ってテストしているので
余計な動作に邪魔されていないと思います。

ご指摘よろしくお願いします。

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

  • 回答No.1

ベストアンサー率 50% (379/747)

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

お礼率 99% (346/349)

アクセスとエクセルでは違うのですね。

コマンドボタンを設置して
コマンドボタンのKeyDownイベントにコードをコピペしたらできました。
ありがとうございました。
投稿日時 - 2009-10-17 23:01:09
感謝経済、優待交換9月20日スタート

その他の回答 (全3件)

  • 回答No.4

ベストアンサー率 44% (21/47)

画面にコマンドボタンを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

お礼率 99% (346/349)

仕組みは良くわかりませんができました。
takana_様有難うございます。
投稿日時 - 2009-10-19 22:06:38
  • 回答No.3

ベストアンサー率 57% (3570/6233)

こんにちは。

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

お礼率 99% (346/349)

クラスモジュールも使うのですね!試してみます。ありがとうございました。
投稿日時 - 2009-10-17 23:07:00
  • 回答No.2

ベストアンサー率 56% (295/524)

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

お礼率 99% (346/349)

リンク先のコードを自分で一部変更しました。
どうもこの方法だとうまく行きませんでした。
投稿日時 - 2009-10-17 23:04:06
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
このやり方知ってる!同じこと困ったことある。経験を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


より良い社会へ。感謝経済プロジェクト始動

ピックアップ

ページ先頭へ