在键盘(快捷键)的帮助下处理/执行/管理用户窗体中的任务

Handling / Performing / Managing tasks in Userform with the help of keyboard ( shortcut keys )

我有一个User-form

对于 Check-Boxes/Buttons 的大部分,我分配了一个 Key。可以通过按下来执行:

Alt + 分配键

我用谷歌搜索了以下代码。

Private Sub UserForm_Initialize()

Me.PASTE.Accelerator = "V"
Me.CEEMEA.Accelerator = "C"

End Sub

问题是我必须按 Alt 键才能执行任何给定任务。

问。有没有不用按 AltKey 的快捷方式?

Robin 的原始答案后我的进步

首先,我将焦点设置在 按钮上。

Private Sub UserForm_Initialize()

    Me.Macros.SetFocus

End Sub

然后在Macro_Keydown Event我把下面的代码。

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

    If KeyCode = vbKeyB Then
    Bulgaria.Value = Not Bulgaria.Value
    ElseIf KeyCode = vbKeyE Then
    Estonia.Value = Not Estonia.Value
    ElseIf KeyCode = vbKeyH Then
    Hungary.Value = Not Hungary.Value
    ElseIf KeyCode = vbKeyA Then
    Latvia.Value = Not Latvia.Value
    ElseIf KeyCode = vbKeyL Then
    Lithuania.Value = Not Lithuania.Value
    ElseIf KeyCode = vbKeyM Then
    Macedonia.Value = Not Macedonia.Value
    ElseIf KeyCode = vbKeyP Then
    Poland.Value = Not Poland.Value
    ElseIf KeyCode = vbKeyR Then
    Romania.Value = Not Romania.Value
    ElseIf KeyCode = vbKeyU Then
    Ukraine.Value = Not Ukraine.Value
    End If

End Sub

更新答案

原来的答案并没有真正符合要求,因为在处理 UserForm 事件时,例如KeyDown 适用于没有其他控件的窗体,不适用于有控件的窗体。这是因为事件仅在窗体具有焦点时才起作用。当窗体有其他控件时,它永远不会获得焦点。此外,无法将焦点设置到 UserForm 上。几乎所有的表单都会有一些其他的控件,所以原来的答案几乎没有用。因此,让我们无耻地改编 Andy Pope on MSDN 中的一个想法来满足 OP 的要求。

首先,在项目中插入一个VBA Class,代码如下:

Public WithEvents m_objGroupCheckBox As MSForms.CheckBox

Private Sub m_objGroupCheckBox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    MsgBox "Keypress was: " & Chr(KeyCode) & " on " & m_objGroupCheckBox.Caption
    Select Case Chr(KeyCode)
        Case 1:
            UserForm1.CheckBox1.Value = Not UserForm1.CheckBox1.Value
        Case 2:
            UserForm1.CheckBox2.Value = Not UserForm1.CheckBox2.Value
        Case "3"
            UserForm1.CheckBox3.Value = Not UserForm1.CheckBox3.Value
    End Select
End Sub

ClassUserForm 上的 CheckBox 定义了通用事件处理程序。出于本示例的目的,我们将使按键 1、2 和 3 切换表单上 3 CheckBox 的复选框状态。

其次,将代码放在Userform的初始化事件中。它创建了此自定义 class 的集合,该集合引用回 UserForm 上创建的原始复选框。

Private m_colCheckBoxes As Collection

Private Sub UserForm_Initialize()

    Dim lngIndex As Long
    Dim objGroupCheckBox As clsGroupCheckBox

    Set m_colCheckBoxes = New Collection
    For lngIndex = 1 To 3
        Set objGroupCheckBox = New clsGroupCheckBox
        Set objGroupCheckBox.m_objGroupCheckBox = Me.Controls("CheckBox" & lngIndex)
        m_colCheckBoxes.Add objGroupCheckBox, CStr(m_colCheckBoxes.Count + 1)
    Next

End Sub

所以现在,如果我们在设计器中有一个像这样的 UserForm,每个 CheckBox 名为 CheckBox1CheckBox2CheckBox3:

然后,我们的通用事件处理程序将允许我们定义一个地方来处理 KeyDown 事件并在一个地方设置 CheckBox 状态。

原始答案 - 没有看起来那么有用:(

您可以直接处理 UserFormKeyDown 事件,并在其中输入您的特定逻辑。也许您还应该查看 KeyUpKeyPress,具体取决于您认为表单的工作方式。

MSDN 指出 '..."A" 和 "a" 作为相同的键返回。它们具有相同的键码值。但请注意,打字机键上的“1”和数字小键盘上的“1”作为不同的键返回,即使它们生成相同的字符。' - MSDN Link

您也可以处理 SHIFT、CTRL 和 ALT。

Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode >= vbKeyA And KeyCode <= vbKeyZ Then
        MsgBox "You pressed " & Chr(KeyCode)
    ElseIf KeyCode >= vbKeyF1 And KeyCode <= vbKeyF12 Then
        MsgBox "Function time!"
    End If
End Sub
'VBA Shortcut Keys not work in UserForm [Partially Solved]

Public Sub CallSub() 'code must be in Module
'-do this code-


Private Sub Workbook_Activate() 'code must be in (ThisWorkbook)
Application.OnKey "^{f5}", "callSub"

'^ this code only work with Excel Worksheet not in Userform


Private Sub XxX_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 'code must be in Userform with SHOWMODAL = False
If KeyCode = 17 Then AppActivate "microsoft excel"  

'XxX means all CommandButton and Textbox and Listbox and Combobox
'Keycode 17 is Ctrl Key if you are using Ctrl+F5 - when you press Ctrl it will activate Excel Worksheet