在键盘(快捷键)的帮助下处理/执行/管理用户窗体中的任务
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
Class
为 UserForm
上的 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 名为 CheckBox1
、CheckBox2
和 CheckBox3
:
然后,我们的通用事件处理程序将允许我们定义一个地方来处理 KeyDown
事件并在一个地方设置 CheckBox
状态。
原始答案 - 没有看起来那么有用:(
您可以直接处理 UserForm
的 KeyDown
事件,并在其中输入您的特定逻辑。也许您还应该查看 KeyUp
和 KeyPress
,具体取决于您认为表单的工作方式。
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
我有一个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
Class
为 UserForm
上的 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 名为 CheckBox1
、CheckBox2
和 CheckBox3
:
然后,我们的通用事件处理程序将允许我们定义一个地方来处理 KeyDown
事件并在一个地方设置 CheckBox
状态。
原始答案 - 没有看起来那么有用:(
您可以直接处理 UserForm
的 KeyDown
事件,并在其中输入您的特定逻辑。也许您还应该查看 KeyUp
和 KeyPress
,具体取决于您认为表单的工作方式。
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