Disculpa la demora, ando viendo la final de la Copa América ja.
Claro, el evento solo dispara en el control que tenga el Foco. Mi respuesta fue generalizada. La manera correcta y completa de hacer esto y que sea aplicable para todo el formulario incluyendo sus controles es haciendo tu propia clase y creando un control general con el evento KeyDown e inicializar la clase en el evento Initialize del UserForm. Me tomé la molestia de hacer un ejemplo donde incluyo los controles mas comunes: TextBox, ComboBox, Labels, OptionButtons.
Video demo
Este es el poder de crear tus propias clases.
De esta forma no tienes que escribir el mismo código en cada evento de cada control. Es lo llamado "Escribe una vez, usa donde sea". Solo escribes una clase y luego la puedes usar en cualquier formulario de tu proyecto en una única Inicializacion:
Si te interesa el código es este:
Dim WithEvents uForm As MSForms.UserForm
Dim WithEvents txtBox As MSForms.TextBox
Dim WithEvents optBtn As MSForms.OptionButton
Dim WithEvents lbl As MSForms.ListBox
Dim WithEvents cmdBtn As MSForms.ComboBox
Event KeyDown(ByVal KeyCode As Integer, ByVal Shift As Integer)
Friend Sub DoKeyPreview(Parent As UserForm)
Dim ctr As Control
Set uForm = Parent
For Each ctr In Parent.Controls
Select Case TypeName(ctr)
Case "TextBox"
Set txtBox = ctr
Case "OptionButton"
Set optBtn = ctr
Case "ListBox"
Set lbl = ctr
Case "ComboBox"
Set cmdBtn = ctr
End Select
Next ctr
End Sub
Private Sub cmdBtn_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
RaiseEvent KeyDown(KeyCode, Shift)
End Sub
Private Sub uForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
RaiseEvent KeyDown(KeyCode, Shift)
End Sub
Private Sub txtBox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
RaiseEvent KeyDown(KeyCode, Shift)
End Sub
Private Sub optBtn_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
RaiseEvent KeyDown(KeyCode, Shift)
End Sub
Private Sub lbl_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
RaiseEvent KeyDown(KeyCode, Shift)
End Sub
Y en el UserForm solo escribes esto:
Dim WithEvents kp As KeyPreview
Private Sub UserForm_Initialize()
Set kp = New KeyPreview
kp.DoKeyPreview Me
End Sub
Private Sub kp_KeyDown(ByVal KeyCode As Integer, ByVal Shift As Integer)
If KeyCode = vbKeyF1 Then
If Shift = 2 Then
Call DeAtajo
End If
End If
End Sub
Ten en cuenta que el nombre del modulo de la clase debe ser igual al Objeto que estas inicializando:
Andy