<Excel UserForm_KeyDownイベント発生条件>
こんにちは、三流プログラマーKen3です。 今回は、 No.30 Excel UserForm テキストボックスのイベント /vba/backno/vba030.html の続きです。 ファンクションキーを処理したくて、 UserForm_KeyDownイベントを探った結果です。 気楽に読んでください。 /* * 1. KeyDownイベントを探る。 */ テキストボックスの_KeyDownイベントに書いて、 なんとかファンクションキーが押されたことを判断してました。 今回は、フォームにもKeyDownイベントあるので、 ここに書いたら出来るんじゃないか?やったぁとヌカヨロコビシタ話です(笑) なかなか、うまく行かないね。。。。 ヘルプでKeyDownイベントの解説を見ると、 実行中のフォームで、フォームまたはそのコントロールにフォーカスがあるときに キーを押すと、KeyDown イベントが発生します。キーを押したまま離さないでいると 、KeyDown イベントと KeyPress イベントが交互に繰り返し発生します。キーを離す と KeyUp イベントが発生します。キーストロークはすべて、フォーカスがあるフォー ムまたはコントロールが受け取ります。 フォームは、コントロールが 1 つもないか、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ または表示されているすべてのコントロールが選択不可能に設定されている場合に限り、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ フォーカスを持つことができます。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ あらら、 UserForm_KeyDownイベントでまとめられると思ったのに。 余談ですが、 MSDNライブラリ http://www.microsoft.com/japan/msdn/library/default.asp から、 フレーズ(語句)検索 "KeyDown" すべてを含む で探すこともできます。 さらにあまり関係無いけど、 KeyPreview プロパティ ってのが、 .NET Framework クラス ライブラリ ならあって、フォームで簡単に受け取れるみたいです。 解説 このプロパティを true に設定すると、 KeyPress 、 KeyDown 、 KeyUp の各イベント をすべてフォームが受け取ります。フォームのイベントハンドラでキーストロークの処 理が完了してから、フォーカスを持つコントロールにそのキーストロークが割り当てら れます。たとえば、 KeyPreview プロパティが true に設定され、現在選択されている コントロールが TextBox の場合は、キーストロークがフォームのイベント処理メソッド で処理された後で、押されたキーを TextBox コントロールが受け取ります。キーボード イベントをフォームでだけ処理し、そのイベントをコントロールでは受け取らないよう にする場合は、フォームの KeyPress イベントまたは KeyDown イベントの e.Handled パラメータを true に設定します。 このプロパティを使用してアプリケーションのすべてのキーストロークを処理し、 フォームでキーストロークを処理するか、キーストロークを処理するために適切な コントロールを呼び出すことができます。たとえば、アプリケーションで ファンクション キーが使用される場合は、キーストローク イベントを受け取るコントロ ールごとにコードを作成するのではなく、 フォーム レベルでキーストロークを処理します。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ↑これがやりたいのに、、、 Excel97/2000のフォームにKeyPreview プロパティ無いんだよね、探したけど。 EXcel2002ならあるのかなぁ? それとも、サービスパックを当てると治るとか、、仕様だからムリかな。 /* * 2.ホントなのか? */ ユーザーフォームに1つでもフォーカスを受け取る項目が存在すると、 UserForm_KeyDownイベント フォームのKeyDownイベントが発生しないか、テストしてみた。 今回のサンプルは、 http://www.ken3.org/vba/lzh/vba032.lzh に test032-book.xlsとdb032.mdbが保存されています。 テストのフォーム1は、ラベルだけで、コントロールにフォーカスはあたりません。 この状態で、 UserForm_KeyDownイベントが発生するかチェックしてみるテストのフォーム2は、テキストボックス在りで、 コントロールにフォーカスは当たります。 この状態で同じ関数を書き、イベントが発生するかチェックする。
テスト実行してみると、う〜ん、ホントみたいだ。。。 KeyPreview プロパティぽいのも無いし。 1つ1つフォーカスのあたるコントロールに ファンクション判断つけるしかないのかなぁ。 何かいい手は無いのかなぁ。。。 /* * 3.Access97でも試してみました */ Access97でも試してみました。 同じ圧縮ファイルの、 http://www.ken3.org/vba/lzh/vba032.lzh にtest032-book.xlsとdb032.mdbが保存されています。 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If vbKeyF1 <= KeyCode And KeyCode < vbKeyF12 Then Select Case KeyCode Case vbKeyF4: 'F4 MsgBox "こんな感じでF4処理を書く" Case Else: MsgBox "F" & (KeyCode - vbKeyF1 + 1) & "が押されました" End Select End If End Sub と同じコードが入ってます。
結果は、Excelと同じで、テキストボックスが無いフォーカスあたらない フォームは、Form_KeyDownイベントが発生して、 テキストボックスありのフォーカスがほかのコントロールにあたるフォームは 反応しませんでした。。。 /* * 4.終わりの挨拶 */ なんか今回も、解決してない、 できないよの報告でした。 KeyDownイベント作りの参考、 ファンクションキーを取る参考なればうれしいけど。。。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。
|
あとは、項目別にMSでお勉強かな? ◆ マイクロソフト サイトの歩き方 ◇ How-To インデックス ◇ FAQ インデックス ◇ スキルレベル別おすすめコンテンツ ◇ テクノロジ マップ ◇ テーマ別技術資料一覧 |
| ※種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。 お奨め本の目次を見るだけでも勉強になったり |