对于大多数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
答案 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
Class
为CheckBox
上的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名为CheckBox1
,CheckBox2
和CheckBox3
:
然后,我们的通用事件处理程序将允许我们定义一个位置来处理KeyDown
事件并在一个位置设置CheckBox
状态。
您可以直接处理KeyDown
的{{1}}事件,并在那里输入您的具体逻辑。也许您应该查看UserForm
和KeyUp
,具体取决于您认为表单的工作方式。
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