【入門編】フォームの「KeyPreview」プロパティと「KeyDown」イベントによるショートカットキーの実装 – Access VBA解析バイブル

スポンサーリンク

Access開発の「神髄」へようこそ:KeyPreviewで実現する、プロ仕様のショートカットキー実装術

こんにちは。Accessという大海原を航海する皆さんに、今日は「UIの操作性を劇的に向上させる魔法」を授けます。

マクロの記録を卒業し、VBAというコードの力でAccessを掌握し始めた皆さん。今、皆さんが直面しているのは「ボタンをマウスでクリックするだけの操作性」という壁ではないでしょうか?

業務アプリの真価は、「手をキーボードから離させないこと」にあります。今日は、フォームの `KeyPreview` プロパティと `KeyDown` イベントを使い、まるで市販の業務システムのような「ショートカットキー制御」を実装する方法を伝授します。

1. なぜ「KeyPreview」なのか?:イベントの伝播を制する

Accessのフォームには、テキストボックスやボタンといった「コントロール」が配置されていますよね。通常、キーボードの入力イベントは、その時フォーカス(選択)されているコントロールが優先して受け取ります。

ここで問題が発生します。「どのコントロールにフォーカスがあっても、特定のキー操作(例:F5で更新、Ctrl+Sで保存)を検知したい」という時、すべてのコントロールにイベントを書くのは悪夢です。

そこで登場するのが `KeyPreview`(キープレビュー) です。

  • KeyPreview = True にすると: フォーム上のどのコントロールでキーが押されても、まずは「フォーム自身」がそのイベントを横取りしてチェックできます。
  • KeyPreview = False(デフォルト)だと: フォームまでイベントが届かず、コントロール単体で処理を完結させなければなりません。

「フォームが司令塔になる」ために、まずはこのプロパティをオンにする。これが自動化エンジニアの第一歩です。

2. 実装コード:フォームの頭脳を書き換える

では、実際のコードを見ていきましょう。今回は「F5キーでデータの更新(再クエリ)」「Ctrl+Sで保存」を実装する例です。

フォームのプロパティシートで `KeyPreview` を「はい」に設定した後、フォームのイベントタブから「キーダウン時」に以下のコードを記述してください。

‘ フォームのKeyDownイベント
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

‘ Shift変数はキーの組み合わせを判別するためのビットフラグです
‘ acCtrlMask は Ctrlキーが押されている状態を表します

Select Case KeyCode

‘ F5キーが押された場合(再クエリ)
Case vbKeyF5
DoCmd.Requery
MsgBox “データを更新しました。”, vbInformation

‘ Ctrl + S が押された場合(保存)
Case vbKeyS
If (Shift And acCtrlMask) > 0 Then
If Me.Dirty Then Me.Dirty = False ‘ レコードを確定(保存)
MsgBox “保存完了!”, vbInformation
End If

End Select

End Sub

このコードの「設計思想」

1. `Select Case` の活用: `If…Then` を重ねるより、将来的にショートカットが増えた際に圧倒的に管理しやすくなります。
2. `Shift And acCtrlMask`: これがプロの書き方です。`Ctrl`キーと`S`キーの同時押しを、ビット演算というコンピュータの根源的な仕組みでスマートに判定しています。
3. `Me.Dirty` の活用: Accessのライフサイクルを知る者にとって、`Dirty`プロパティは必須です。保存ボタンを押さずとも、フォームの「更新状態」をコードで確実に制御できます。

3. 陥りやすいエラーと回避策

初心者が必ずと言っていいほどハマる罠が2つあります。

その1:KeyCodeが効かない

`KeyCode` はキーボードの「物理キー」を指します。もし「入力された文字」を判定したい場合は `KeyPress` イベントを使いますが、今回のようなシステム制御には `KeyDown` が最適です。また、`KeyCode` を `0` に書き換えると、そのキー入力を「なかったこと」にできます(例:特定の入力フォームで特定のキーを無効化する等)。

その2:イベントが競合する

フォームに「コンボボックス」などが配置されている場合、そのコントロール側でも独自のキーイベントを持っていると、処理が二重に走ることがあります。その場合は、イベントの最後に `KeyCode = 0` を入れることで、親イベントへの伝播を止めることが可能です。

最後に:プロフェッショナルへの道

「KeyPreview」を使いこなすことは、単なるショートカットの実装ではありません。「ユーザー体験(UX)を設計者の意図通りに制御する」という、アプリケーションアーキテクトとしての第一歩なのです。

最初は難しく感じるかもしれませんが、このコードを自分のフォームに貼り付け、実際にキーを叩いてみてください。「自分のコードでソフトが反応する」という快感こそが、エンジニアとしての最大の報酬です。

ここをクリアした皆さんなら、次は `KeyPress` や `KeyUp` との使い分け、あるいは「アプリケーション全体」でショートカットを効かせるためのグローバルなフック処理にも挑戦できるはずです。

Access VBAの奥深さは、まだまだこんなものではありません。次回の講義でも、現場で使える「本物の知見」をお届けしますね。応援しています!

タイトルとURLをコピーしました