Excel VBA – alt keydown事件每隔一段时间在用户窗体上触发

第一次发布,相当新的VBA和编码。

我有一个Excel 2010用户窗体,有一个button来打开电子表格。 当按下修改键时,我有button创build一个新的文件。

我写了下面的代码:

Private Sub CommandButton4_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Debug.Print "X" & Shift If Shift = 4 Then CommandButton4.Caption = "New File" NewFile = True CommandButton4.ControlTipText = "New File" End If End Sub Private Sub CommandButton4_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Debug.Print "Y" CommandButton4.Caption = "Open File" NewFile = False CommandButton4.ControlTipText = "Open File" End Sub 

除了Alt键以外,KeyDown和KeyUp事件都会触发。 例如,按下Shift键,我得到一个debugging输出:X1 Y X1 Y

但是,按Alt我得到:X4 Y Y X4 Y Y

我的表单中的其他一切工作正常,但我不知道为什么其他每个Alt KeyDown都没有注册。 没有KeyDown的情况下怎么会有KeyUp?

我已经search了一个答案,错误报告或修复,并找不到一个。 有任何想法吗?

您可以使用API​​调用轻松解决您的挑战,以检测ALT键是否closures。

插入到一个新的模块

 Public Declare Function GetKeyState Lib "user32" (ByVal key As Long) As Integer 

并尝试这一点:

 Private Sub CommandButton1_Click() If GetKeyState(KeyCodeConstants.vbKeyMenu) And &H8000 Then MsgBox "Yes" Else MsgBox "no" End If End Sub 

vbKeyMenu是ALT键。 And &H8000只需要查看“实时”密钥状态(返回值有另一个可以切换的位,见这里 )

编辑:你看到的现象是以下几点:
ALT键并看到X4 Y ,按下键。 你会看到用户窗体的系统菜单popup。 alt键跟随它的目的,并将焦点移到系统菜单,并在下一次按下时返回到button。 如果button具有焦点,则用户窗体显然首先处理按键,并在button接收到按键之前将焦点移动到系统菜单。