借助键盘处理/执行/管理Userform中的任务(快捷键)

时间:2016-05-31 02:43:34

标签: vba ms-word word-vba userform word-2007

我有User-form userform

对于大多数Check-Boxes / Buttons,我分配了Key。可以按:

执行

Alt + Assigned-key

我用Google搜索了以下代码。

Private Sub UserForm_Initialize()

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

End Sub

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

Q值。如果没有按 Alt Key?

,有没有简单的方法

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

2 个答案:

答案 0 :(得分:4)

更新回答

原始答案并不真正符合要求,因为在处理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

ClassCheckBox上的UserForm定义了一个通用事件处理程序。出于此示例的目的,我们将按下1,2和3的按键切换表单上3 CheckBox的复选框状态。

其次,将代码放在Userform的initialize事件中。它创建了一个此自定义类的集合,该集合引用了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

enter image description here

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

enter image description here

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

您可以直接处理KeyDown的{​​{1}}事件,并在那里输入您的具体逻辑。也许您应该查看UserFormKeyUp,具体取决于您认为表单的工作方式。

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

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

KeyPress

答案 1 :(得分:0)

'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