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