コントロールでキーを押したり離したりしたときに発生するイベント(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 となります。
			
| 定数 | 値 | 説明 | 
|---|---|---|
| fmShiftMask | 1 | Shift キーが押されました | 
| fmCtrlMask | 2 | Ctrl キーが押されました | 
| fmAltMask | 4 | Alt キーが押されました | 
			対象のコントロールにフォーカスがある状態でキーが押されると KeyDown イベントが発生し、キーが離されると KeyUp イベントが発生し、それぞれのイベントに対するイベントプロシージャが呼び出されます
			
それでは簡単なサンプルで試してみます。ユーザーフォームにテキストボックスを設置しました。
			 
			
			テキストボックスに対する 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
			 
			
これでコードの記述は完了です。では実際に試してみます。「Sub/ユーザーフォームの実行」をクリックしてください。
			 
			
ユーザーフォームが表示されました。
			 
			
このテキストボックスには、キーボードに表示されている数字キーを押して数字をの文字を入力することはできますが、それ以外の文字のキーを押しても入力されません。( BackSpace キーだけは押すと文字を削除できます)。
			 
			
			今回は KeyDown イベントのイベントプロシージャだけを使用しましたが、フォーカスがあるコントロールに対してキーを押したときに何らかの処理を行うことができました。
			
ユーザーフォームにおけるKeyPressイベントとは
			ユーザーフォームにおける KeyPres イベントがどのような時に発生するのか、また発生したときのイベントプロシージャの記述方法について解説します。
			
どのようなときにイベントが発生するのか
			KeyPres イベントはユーザーフォームまたはコントロールにフォーカスがあるときに ANSI キーを押すと発生します。 KeyDown イベントと異なり ANSI キーを押したときだけイベントが発生します。
			
KeyPresイベントのイベントプロシージャ
			KeyPres イベントに対するイベントプロシージャは次のような形式となっています。
			
Private Sub オブジェクト_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) End Sub
			イベントプロシージャの引数である KeyAscii には押されたキーのコードを表す数値が入力されています。イベントプロシージャの中で 0 を設定することでキーが押されていないことにすることができます。
			
			対象のコントロールにフォーカスがある状態で ASCII キーが押されると KeyPress イベントが発生しイベントプロシージャが呼び出されます
			
それでは簡単なサンプルで試してみます。ユーザーフォームにテキストボックスを設置しました。
			 
			
			テキストボックスに対する KeyPress イベントのイベントプロシージャの中で、入力されたキーを大文字に変換して表示します(キーコードを文字に変換したあと、文字を大文字に変換し、変換した文字をキーコードに変換して KeyAscii に設定しています)。
			
Option Explicit
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    KeyAscii = Asc(StrConv(Chr(KeyAscii), vbUpperCase))
End Sub
			 
			
これでコードの記述は完了です。では実際に試してみます。「Sub/ユーザーフォームの実行」をクリックしてください。
			 
			
ユーザーフォームが表示されました。
			 
			
このテキストボックスにフォーカスがあるときにアルファベットの文字をキーボードで押すと、大文字に変換されてテキストボックスに表示されます。
			 
			
KeyDown、KeyUp、KeyPressイベントの発生する順番
			コントロールにフォーカスがあるときにキーを押すと、 KeyDown イベント、 KeyUp イベント、 KeyPress イベントが発生します。どの順番にイベントが発生するのかを確認してみます。
			
ユーザーフォームにテキストボックスを設置しました。
			 
			
テキストボックスに対する 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
			 
			
			何かキーを押してください。( KeyPress イベントが発生するように ASCII 文字のキーを押してください)。
			
			 
			
			イミディエイトウィンドウを確認すると、 KeyDown 、 KeyPress 、 KeyUp の順番でイベントが発生することが確認できます。
			
			 
			
キーコード毎に定義されている定数
Excel ではキーコードで表される数値毎に定数が定義されており、キーコードの値がどの文字を表すのか調べる場合に数値を比較する代わりにキーコードの値と定数を比較することができます。
| 定数 | 値 | 説明 | 
|---|---|---|
| vbKeyLButton | 0x1 | 左マウス ボタン | 
| vbKeyRButton | 0x2 | 右マウス ボタン | 
| vbKeyCancel | 0x3 | Cancel キー | 
| vbKeyMButton | 0x4 | マウスの中央ボタン | 
| vbKeyBack | 0x8 | Backspace | 
| vbKeyTab | 0x9 | Tab キー | 
| vbKeyClear | 0xC | Clear | 
| vbKeyReturn | 0xD | Enter | 
| vbKeyShift | 0x10 | Shift キーが押されました。 | 
| vbKeyControl | 0x11 | Ctrl キーが押されました。 | 
| vbKeyMenu | 0x12 | メニュー キー | 
| vbKeyPause | 0x13 | Pause | 
| vbKeyCapital | 0x14 | Caps Lock | 
| vbKeyEscape | 0x1B | Esc キー | 
| vbKeySpace | 0x20 | Space キー | 
| vbKeyPageUp | 0x21 | PageUp | 
| vbKeyPageDown | 0x22 | PageDown | 
| vbKeyEnd | 0x23 | End | 
| vbKeyHome | 0x24 | Home | 
| vbKeyLeft | 0x25 | ← | 
| vbKeyUp | 0x26 | ↑ | 
| vbKeyRight | 0x27 | → | 
| vbKeyDown | 0x28 | ↓ | 
| vbKeySelect | 0x29 | Select | 
| vbKeyPrint | 0x2A | PrintScreen | 
| vbKeyExecute | 0x2B | Execute | 
| vbKeySnapshot | 0x2C | Snapshot キー | 
| vbKeyInsert | 0x2D | Insert キー | 
| vbKeyDelete | 0x2E | Delete キー | 
| vbKeyHelp | 0x2F | Help | 
| vbKeyNumlock | 0x90 | Num Lock | 
次の定数は A から Z までのキーを表します。
| 定数 | 値 | 説明 | 
|---|---|---|
| vbKeyA | 65 | A キー | 
| vbKeyB | 66 | B キー | 
| vbKeyC | 67 | C キー | 
| vbKeyD | 68 | D キー | 
| vbKeyE | 69 | E キー | 
| vbKeyF | 70 | F キー | 
| vbKeyG | 71 | G キー | 
| vbKeyH | 72 | H キー | 
| vbKeyI | 73 | I キー | 
| vbKeyJ | 74 | J キー | 
| vbKeyK | 75 | K キー | 
| vbKeyL | 76 | L キー | 
| vbKeyM | 77 | M キー | 
| vbKeyN | 78 | N キー | 
| vbKeyO | 79 | O キー | 
| vbKeyP | 80 | P キー | 
| vbKeyQ | 81 | Q キー | 
| vbKeyR | 82 | R キー | 
| vbKeyS | 83 | S キー | 
| vbKeyT | 84 | T キー | 
| vbKeyU | 85 | U キー | 
| vbKeyV | 86 | V キー | 
| vbKeyW | 87 | W キー | 
| vbKeyX | 88 | X キー | 
| vbKeyY | 89 | Y キー | 
| vbKeyZ | 90 | Z キー | 
次の定数はキーボードの数字キーを表します。
| 定数 | 値 | 説明 | 
|---|---|---|
| vbKey0 | 48 | 0 キー | 
| vbKey1 | 49 | 1 キー | 
| vbKey2 | 50 | 2 キー | 
| vbKey3 | 51 | 3 キー | 
| vbKey4 | 52 | 4 キー | 
| vbKey5 | 53 | 5 キー | 
| vbKey6 | 54 | 6 キー | 
| vbKey7 | 55 | 7 キー | 
| vbKey8 | 56 | 8 キー | 
| vbKey9 | 57 | 9 キー | 
次の定数はテンキーの数字キーを表します。
| 定数 | 値 | 説明 | 
|---|---|---|
| vbKeyNumpad0 | 0x60 | 0 キー | 
| vbKeyNumpad1 | 0x61 | 1 キー | 
| vbKeyNumpad2 | 0x62 | 2 キー | 
| vbKeyNumpad3 | 0x63 | 3 キー | 
| vbKeyNumpad4 | 0x64 | 4 キー | 
| vbKeyNumpad5 | 0x65 | 5 キー | 
| vbKeyNumpad6 | 0x66 | 6 キー | 
| vbKeyNumpad7 | 0x67 | 7 キー | 
| vbKeyNumpad8 | 0x68 | 8 キー | 
| vbKeyNumpad9 | 0x69 | 9 キー | 
| vbKeyMultiply | 0x6A | 乗算記号 (*) キー | 
| vbKeyAdd | 0x6B | 加算記号 (+) キー | 
| vbKeySeparator | 0x6C | Enter | 
| vbKeySubtract | 0x6D | 減算記号 (-) キー | 
| vbKeyDecimal | 0x6E | 小数点 (.) キー | 
| vbKeyDivide | 0x6F | 除算記号 (/) キー | 
次の定数はファンクションキーを表します。
| 定数 | 値 | 説明 | 
|---|---|---|
| vbKeyF1 | 0x70 | F1 キー | 
| vbKeyF2 | 0x71 | F2 キー | 
| vbKeyF3 | 0x72 | F3 キー | 
| vbKeyF4 | 0x73 | F4 キー | 
| vbKeyF5 | 0x74 | F5 キー | 
| vbKeyF6 | 0x75 | F6 キー | 
| vbKeyF7 | 0x76 | F7 キー | 
| vbKeyF8 | 0x77 | F8 キー | 
| vbKeyF9 | 0x78 | F9 キー | 
| vbKeyF10 | 0x79 | F10 キー | 
| vbKeyF11 | 0x7A | F11 キー | 
| vbKeyF12 | 0x7B | F12 キー | 
| vbKeyF13 | 0x7C | F13 キー | 
| vbKeyF14 | 0x7D | F14 キー | 
| vbKeyF15 | 0x7E | F15 キー | 
| vbKeyF16 | 0x7F | F16 キー | 
-- --
Excel のユーザーフォームで KeyDown および KeyUp イベントがどのようなときに発生するのかやイベントが発生したときに呼び出されるイベントプロシージャの記述方法について解説しました。
( Written by Tatsuo Ikura )
 
				著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。
