[ VBA ] KeyDown と KeyPress イベントの発生条件と順序

Pocket

VBA を使ってテキストボックスやボタンなどのキーボード入力イベントである KeyDown と KeyPress イベントの違いや発生順序について、このページでは掲載しています。

スポンサーリンク

イベントの発生順序

KeyDown イベントと KeyPress イベントの発生順序を以下のスクリプトを使って確認したところ、

  1. KeyDown イベント
  2. KeyPress イベント

となりました。

Private Sub CommandButton1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Debug.Print "KeyDown"
    
    If (KeyCode = vbKeyReturn) Then
        Debug.Print ("エンターキーが押された")
    End If

    ' シフトキーが押されているときは 1 となる。
    If (Shift = 1) Then
        If (KeyCode = vbKeyShift) Then
            Debug.Print ("シフトキーだけ押された")
        Else
            Debug.Print ("シフトキーも一緒に押された")
        End If
    End If
End Sub

Private Sub CommandButton1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

    Debug.Print "KeyPress"

End Sub

KeyDown:キーボードが押され始めたが、まだ押されたとは判断できない状態

KeyPress:キーが押されたと判断された状態

といったところでしょうか?

イベントの発生条件

キー入力イベントが発生する条件は、KeyDown と KeyPress イベントでは異なります。

KeyDown イベントは、どのキーでもイベントが発生します。英数字や F1 ~ F10 のようなファンクションキーなど全てのキーでイベントが発生します。

一方の KeyPress イベントは英数字などのアスキーコードのみで発生するイベントです。シフトキーやファンクションシーなどの制御文字のキー入力ではイベントが発生しません。

KeyDown イベントではパラメーターが KeyCode なのに対して、KeyPress イベントではパラメータは KeyAscii であることからもわかります。

パラメータ名もちゃんと考えられています。見習いたいものです。

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *