コマンドボタンクリックではなく、ファンクションキーを押下することで処理を実行したいことがあります。
マウスでコマンドボタンまでカーソルを移動してクリックする数秒を考えると、ボタン1つ押下するだけで処理が実行できた方が効率的です。
今回はVBAでファンクションキー押下時の処理を制御する方法をご紹介します。
各入力項目はENTERキーまたはTABキーで移動できるように設計するほうが入力項目の多いフォームの場合、断然効率的です。
タブキーの移動順は大変重要ですのでフォームが完成したらタブキーで入力したい順番通りにフォーカスが移動することを確認しましょう。
ACCESSのキー定数
まずはAccessでキー割り当てによく使う定数を確認します。
数字やアルファベットなどの入力にもそれぞれキー定数が割り当てられています。
キー | 定数 |
F1キー ~ F16キー | vbKeyF1 ~ vbKeyF16 |
A ~ Z | vbKeyA ~ vbKeyZ |
0 ~ 9 | vbKey0 ~ vbKey9 |
[テンキー] 0 ~ 9 | vbKeyNumpad0 ~ vbKeyNumpad9 |
マウスの左ボタン | vbKeyLButton |
マウスの右ボタン | vbKeyRButton |
マウスの中央ボタン | vbKeyMButton |
Cancelキー | vbKeyCancel |
BackSpaceキー | vbKeyBack |
Tabキー | vbKeyTab |
Clearキー | vbKeyClear |
Enterキー | vbKeyReturn |
Shiftキー | vbKeyShift |
Ctrlキー | vbKeyControl |
Menuキー | vbKeyMenu |
Pauseキー | vbKeyPause |
CapsLockキー | vbKeyCapital |
Escキー | vbKeyEscape |
Spaceキー | vbKeySpace |
PageUpキー | vbKeyPageUp |
PageDownキー | vbKeyPageDown |
Endキー | vbKeyEnd |
Homeキー | vbKeyHome |
← | vbKeyLeft |
↑ | vbKeyUp |
→ | vbKeyRight |
↓ | vbKeyDown |
Selectキー | vbKeySelect |
PrintScreenキー | vbKeyPrint |
Executeキー | vbKeyExecute |
Snapshotキー | vbKeySnapshot |
Insキー | vbKeyInsert |
Delキー | vbKeyDelete |
Helpキー | vbKeyHelp |
NumLockキー | vbKeyNumlock |
*(乗算記号) | vbKeyMultiply |
+(加算記号) | vbKeyAdd |
Enterキー(テンキー) | vbKeySeparator |
-(減算記号) | vbKeySubtract |
.(小数点記号) | vbKeyDecimal |
/(除算記号) | vbKeyDivide |
フォームのキーイベント取得プロパティをONにする
VBAでキーイベントの処理を記載しているのにキー押下に反応しない場合は、フォームのプロパティ【キーイベント取得】が「いいえ」になっていないか確認してください。
このプロパティが「はい」になっていないと、キークリック時イベントに処理を記載していても動作しません。
ファンクションキーイベントを取得する
以下はF2~F12までのキー押下イベントでそれぞれのメッセージを表示するサンプルプログラムです。
KeyDownイベントの引数KeyCodeをファンクションキーイベントの定数と比較して処理を記述します。
処理したいファンクションキーが1つや2つならIF文で処理してもOKです。
数が多ければSELECT CASE文で処理してください。
尚、F1キーにはAccessのヘルプが割り当てられているので通常は使用しません。
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case vbKeyF2: MsgBox "F2キー押下" Case vbKeyF3: MsgBox "F3キー押下" Case vbKeyF4: MsgBox "F4キー押下" Case vbKeyF5: MsgBox "F5キー押下" Case vbKeyF6: MsgBox "F6キー押下" Case vbKeyF7: MsgBox "F7キー押下" Case vbKeyF8: MsgBox "F8キー押下" Case vbKeyF9: MsgBox "F9キー押下" Case vbKeyF10: MsgBox "F10キー押下" Case vbKeyF11: MsgBox "F11キー押下" Case vbKeyF12: MsgBox "F12キー押下" End Select End Sub
補助キーとの組み合わせでイベントを取得する
KeyDownイベントではKeyCodeの他にもう一つ引数を持っています。
Shift変数です。この変数で「Shift」「Ctrl」「Alt」などの補助キーが同時に押下されているかどうかを判断できます。
以下のサンプルプログラムではF5キーの押下処理で、全ての補助キーの組み合わせでメッセージを出し分けるようにしています。
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case vbKeyF2: MsgBox "F2キー押下" Case vbKeyF3: MsgBox "F3キー押下" Case vbKeyF4: MsgBox "F4キー押下" Case vbKeyF5: Select Case Shift Case 0: MsgBox "F5キー単独押下" Case 1 MsgBox "SHIFT+F5キー押下" Case 2 MsgBox "CTRL+F5キー押下" Case 3 MsgBox "SHIFT+CTRL+F5キー押下" Case 4 MsgBox "ALT+F5キー押下" Case 5 MsgBox "SHIFT+CTRL+F5キー押下" Case 6 MsgBox "CTRL+ALT+F5キー押下" Case 7 MsgBox "SHIFT+CTRL+ALT+F5キー押下" End Select Case vbKeyF6: MsgBox "F6キー押下" Case vbKeyF7: MsgBox "F7キー押下" Case vbKeyF8: MsgBox "F8キー押下" Case vbKeyF9: MsgBox "F9キー押下" Case vbKeyF10: MsgBox "F10キー押下" Case vbKeyF11: MsgBox "F11キー押下" Case vbKeyF12: MsgBox "F12キー押下" End Select End Sub
引数Shiftはビットフィールドになっています。
補助キー | ビット | 定数 |
なし | 0 | なし |
Shiftキー | 1 | acShiftMask |
Ctrlキー | 2 | acCtrlMask |
Altキー | 4 | acAltMask |
これらのキーを組み合わせる(合計する)ことにより、複数のキーの組み合わせも判断できます。
複合キーの組み合わせは0を含めて全部で8通りになります。
先のサンプルプログラムではShift変数の8通りのCASEを全て(0~7まで)記述しています。
(例)SHIFT+Ctrl = 1 + 2 = 3
定数が用意されていますので、CASE文には数値ではなく【acShiftMask+acCtrlMask】のように記述してもOKです。
このように補助キーを組み合わせて入力されたキーを取得できますので、隠しコマンドを記述することもできますね。