コントロールでキーを押したり離したりしたときに発生するイベント(KeyDown,KeyUp,KeyPressイベント)

ユーザーフォームに設置したコントロールでキーを押したときに発生するイベントが KeyDown イベントおよび KeyPress イベント、そしてキーを離したときに発生するイベントが KeyUp イベントです。ここでは Excel のユーザーフォームで KeyDown、 KeyUp および KeyPress イベントがどのようなときに発生するのかやイベントが発生したときに呼び出されるイベントプロシージャの記述方法について解説します。

(Last modified: )

ユーザーフォームにおけるKeyDownおよびKeyUpイベントとは

ユーザーフォームにおける KeyDown イベントおよび KeyUp イベントがどのような時に発生するのか、また発生したときのイベントプロシージャの記述方法について解説します。

どのようなときにイベントが発生するのか

KeyDown イベントはユーザーフォームまたはコントロールにフォーカスがあるときにキーを押すと発生します。

KeyUp イベントはユーザーフォームまたはコントロールにフォーカスがあるときにキーを離すと発生します。

このイベントは ANSI キーを押したときにも発生しますが、主にファンクションキーなどの拡張キーや HOME や矢印などの移動キー、数字キーなどのキーが押されたかどうかを検出するのに使用されます。 ANSI キーを押したときの処理は KeyPress イベントが使用されます。

KeyDownおよびKeyUpイベントのイベントプロシージャ

KeyDown イベントおよび KeyUp イベントに対するイベントプロシージャは次のような形式となっています。

Private Sub オブジェクト_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

End Sub
Private Sub オブジェクト_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

End Sub

イベントプロシージャの引数である KeyCode には押されたキーのコードを表す数値が入力されています。イベントプロシージャの中で 0 を設定することでキーが押されていないことにすることができます。

引数の Shift の値を参照することで Shift キー、 Ctrl キー、および Alt キーが押されているかどうか参照できます。いずれも押されていない場合は 0 となります。

定数説明
fmShiftMask1Shift キーが押されました
fmCtrlMask2Ctrl キーが押されました
fmAltMask4Alt キーが押されました

対象のコントロールにフォーカスがある状態でキーが押されると KeyDown イベントが発生し、キーが離されると KeyUp イベントが発生し、それぞれのイベントに対するイベントプロシージャが呼び出されます

サンプルコード

それでは簡単なサンプルで試してみます。ユーザーフォームにテキストボックスを設置しました。

ユーザーフォームにおけるKeyDownおよびKeyUpイベントとは(1)

テキストボックスに対する KeyDown イベントのイベントプロシージャの中で、入力されたキーのキーコードを調べ、数字の 0 から 9 の文字のキー、または BackSpace キー以外のキーが押された場合はキーの入力を無効にします。( Excel では文字毎のキーコードを定数で定義しており、その定数と比較しています。定数の一覧はこのページの最後に記載しています)。

Option Explicit

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode <> vbKeyBack And (KeyCode < vbKey0 Or KeyCode > vbKey9) Then
        KeyCode = 0
    End If
End Sub

ユーザーフォームにおけるKeyDownおよびKeyUpイベントとは(2)

これでコードの記述は完了です。では実際に試してみます。「Sub/ユーザーフォームの実行」をクリックしてください。

ユーザーフォームにおけるKeyDownおよびKeyUpイベントとは(3)

ユーザーフォームが表示されました。

ユーザーフォームにおけるKeyDownおよびKeyUpイベントとは(4)

このテキストボックスには、キーボードに表示されている数字キーを押して数字をの文字を入力することはできますが、それ以外の文字のキーを押しても入力されません。( BackSpace キーだけは押すと文字を削除できます)。

ユーザーフォームにおけるKeyDownおよびKeyUpイベントとは(5)

今回は KeyDown イベントのイベントプロシージャだけを使用しましたが、フォーカスがあるコントロールに対してキーを押したときに何らかの処理を行うことができました。

ユーザーフォームにおけるKeyPressイベントとは

ユーザーフォームにおける KeyPres イベントがどのような時に発生するのか、また発生したときのイベントプロシージャの記述方法について解説します。

どのようなときにイベントが発生するのか

KeyPres イベントはユーザーフォームまたはコントロールにフォーカスがあるときに ANSI キーを押すと発生します。 KeyDown イベントと異なり ANSI キーを押したときだけイベントが発生します。

KeyPresイベントのイベントプロシージャ

KeyPres イベントに対するイベントプロシージャは次のような形式となっています。

Private Sub オブジェクト_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

End Sub

イベントプロシージャの引数である KeyAscii には押されたキーのコードを表す数値が入力されています。イベントプロシージャの中で 0 を設定することでキーが押されていないことにすることができます。

対象のコントロールにフォーカスがある状態で ASCII キーが押されると KeyPress イベントが発生しイベントプロシージャが呼び出されます

サンプルコード

それでは簡単なサンプルで試してみます。ユーザーフォームにテキストボックスを設置しました。

ユーザーフォームにおけるKeyPressイベントとは(1)

テキストボックスに対する KeyPress イベントのイベントプロシージャの中で、入力されたキーを大文字に変換して表示します(キーコードを文字に変換したあと、文字を大文字に変換し、変換した文字をキーコードに変換して KeyAscii に設定しています)。

Option Explicit

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = Asc(StrConv(Chr(KeyAscii), vbUpperCase))
End Sub

ユーザーフォームにおけるKeyPressイベントとは(2)

これでコードの記述は完了です。では実際に試してみます。「Sub/ユーザーフォームの実行」をクリックしてください。

ユーザーフォームにおけるKeyPressイベントとは(3)

ユーザーフォームが表示されました。

ユーザーフォームにおけるKeyPressイベントとは(4)

このテキストボックスにフォーカスがあるときにアルファベットの文字をキーボードで押すと、大文字に変換されてテキストボックスに表示されます。

ユーザーフォームにおけるKeyPressイベントとは(5)

KeyDown、KeyUp、KeyPressイベントの発生する順番

コントロールにフォーカスがあるときにキーを押すと、 KeyDown イベント、 KeyUp イベント、 KeyPress イベントが発生します。どの順番にイベントが発生するのかを確認してみます。

ユーザーフォームにテキストボックスを設置しました。

KeyDown、KeyUp、KeyPressイベントの発生する順番(1)

テキストボックスに対する 3 つのイベントのイベントプロシージャをそれぞれ次のように記述しました。イベントが発生するとイミディエイトウィンドウにでイベントの種類を出力します。

Option Explicit

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Debug.Print "KeyDown"
End Sub

Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Debug.Print "KeyUp"
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Debug.Print "KeyPress"
End Sub

KeyDown、KeyUp、KeyPressイベントの発生する順番(2)

何かキーを押してください。( KeyPress イベントが発生するように ASCII 文字のキーを押してください)。

KeyDown、KeyUp、KeyPressイベントの発生する順番(3)

イミディエイトウィンドウを確認すると、 KeyDownKeyPressKeyUp の順番でイベントが発生することが確認できます。

KeyDown、KeyUp、KeyPressイベントの発生する順番(4)

キーコード毎に定義されている定数

Excel ではキーコードで表される数値毎に定数が定義されており、キーコードの値がどの文字を表すのか調べる場合に数値を比較する代わりにキーコードの値と定数を比較することができます。

定数説明
vbKeyLButton0x1左マウス ボタン
vbKeyRButton0x2右マウス ボタン
vbKeyCancel0x3Cancel キー
vbKeyMButton0x4マウスの中央ボタン
vbKeyBack0x8Backspace
vbKeyTab0x9Tab キー
vbKeyClear0xCClear
vbKeyReturn0xDEnter
vbKeyShift0x10Shift キーが押されました。
vbKeyControl0x11Ctrl キーが押されました。
vbKeyMenu0x12メニュー キー
vbKeyPause0x13Pause
vbKeyCapital0x14Caps Lock
vbKeyEscape0x1BEsc キー
vbKeySpace0x20Space キー
vbKeyPageUp0x21PageUp
vbKeyPageDown0x22PageDown
vbKeyEnd0x23End
vbKeyHome0x24Home
vbKeyLeft0x25
vbKeyUp0x26
vbKeyRight0x27
vbKeyDown0x28
vbKeySelect0x29Select
vbKeyPrint0x2APrintScreen
vbKeyExecute0x2BExecute
vbKeySnapshot0x2CSnapshot キー
vbKeyInsert0x2DInsert キー
vbKeyDelete0x2EDelete キー
vbKeyHelp0x2FHelp
vbKeyNumlock0x90Num Lock

次の定数は A から Z までのキーを表します。

定数説明
vbKeyA65A キー
vbKeyB66B キー
vbKeyC67C キー
vbKeyD68D キー
vbKeyE69E キー
vbKeyF70F キー
vbKeyG71G キー
vbKeyH72H キー
vbKeyI73I キー
vbKeyJ74J キー
vbKeyK75K キー
vbKeyL76L キー
vbKeyM77M キー
vbKeyN78N キー
vbKeyO79O キー
vbKeyP80P キー
vbKeyQ81Q キー
vbKeyR82R キー
vbKeyS83S キー
vbKeyT84T キー
vbKeyU85U キー
vbKeyV86V キー
vbKeyW87W キー
vbKeyX88X キー
vbKeyY89Y キー
vbKeyZ90Z キー

次の定数はキーボードの数字キーを表します。

定数説明
vbKey0480 キー
vbKey1491 キー
vbKey2502 キー
vbKey3513 キー
vbKey4524 キー
vbKey5535 キー
vbKey6546 キー
vbKey7557 キー
vbKey8568 キー
vbKey9579 キー

次の定数はテンキーの数字キーを表します。

定数説明
vbKeyNumpad00x600 キー
vbKeyNumpad10x611 キー
vbKeyNumpad20x622 キー
vbKeyNumpad30x633 キー
vbKeyNumpad40x644 キー
vbKeyNumpad50x655 キー
vbKeyNumpad60x666 キー
vbKeyNumpad70x677 キー
vbKeyNumpad80x688 キー
vbKeyNumpad90x699 キー
vbKeyMultiply0x6A乗算記号 (*) キー
vbKeyAdd0x6B加算記号 (+) キー
vbKeySeparator0x6CEnter
vbKeySubtract0x6D減算記号 (-) キー
vbKeyDecimal0x6E小数点 (.) キー
vbKeyDivide0x6F除算記号 (/) キー

次の定数はファンクションキーを表します。

定数説明
vbKeyF10x70F1 キー
vbKeyF20x71F2 キー
vbKeyF30x72F3 キー
vbKeyF40x73F4 キー
vbKeyF50x74F5 キー
vbKeyF60x75F6 キー
vbKeyF70x76F7 キー
vbKeyF80x77F8 キー
vbKeyF90x78F9 キー
vbKeyF100x79F10 キー
vbKeyF110x7AF11 キー
vbKeyF120x7BF12 キー
vbKeyF130x7CF13 キー
vbKeyF140x7DF14 キー
vbKeyF150x7EF15 キー
vbKeyF160x7FF16 キー

-- --

Excel のユーザーフォームで KeyDown および KeyUp イベントがどのようなときに発生するのかやイベントが発生したときに呼び出されるイベントプロシージャの記述方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。