How to intercept the user pressing a particular keyboard key when a UserForm control has the focus

Article contributed by Ibby and Dave Rado

If a you want to know if the user presses the Tab key or the Backspace key in a text box, for example; or the Down Arrow key in a Listbox or on an Option button, you can use code such as the following:

Private Sub OptionButton1_KeyDown(ByVal KeyCode As _
        MSForms.ReturnInteger, ByVal Shift As Integer)

If
KeyCode = wdKeyTab Then
    'Your code here
End If

End Sub

There are wdKey constants for most, but not all, of the KeyCodes you are likely to want to use; to get the full list of the constants, press F2 to open the Object Browser and search for wdKey.

So for example, there is a constant for the backspace key:

Private Sub TextBox1_KeyDown(ByVal KeyCode As _
        MSForms.ReturnInteger, ByVal Shift As Integer)

If
KeyCode = wdKeyBackspace Then
    'Your code here
End If

End Sub

But for some strange reason, there is no constant for the Down Arrow key. To get the value to use for KeyCodes that have no constant, use code such as the following:

Private Sub ListBox1_KeyDown(ByVal KeyCode As _
        MSForms.ReturnInteger, ByVal Shift As Integer)

MsgBox KeyCode

End Sub

If you do that, click the Listbox and press the Down Arrow key, it returns 40; so you can then use:

Private Sub ListBox1_KeyDown(ByVal KeyCode As _
        MSForms.ReturnInteger, ByVal Shift As Integer)

If
KeyCode = 40 Then    'Down Arrow key was pressed
    'Your code here
End If

End Sub