我希望在不使用加速键的情况下关闭(或其他命令)。
例如,当用户按下F4时,将从Excel打开以下表单。我也希望用F4关闭(卸载我)。
这是我目前正在使用的,虽然看起来不必要地大:
Private Sub TextBoxA_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxB_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxC_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxD_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxE_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxF_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxG_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxH_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxI_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxJ_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxK_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxM_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxN_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Private Sub TextBoxO_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
moveme Val(keycode)
End Sub
Sub moveme(keycode As Integer)
If keycode = 115 Then Unload Me
End Sub
我想我正在寻找类似的东西,但我不知道:
loop:
Private Sub TextBox[i]_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
Sub moveme(keycode As Integer)
If keycode = 115 Then Unload Me
End Sub
答案 0 :(得分:2)
由于多种原因,每个文本框都需要自己的事件处理程序,同时,虽然我理解你想要做什么,但是你不能在程序之外执行语句,所以你不能比如,在程序之外创建一系列Private Sub TextBox[i]...
。
幸运的是,使用Application.OnKey
可能有更简单的方法。
在标准模块中,您有一个初始化表单的宏,请执行以下操作:
Sub showform()
'Displays/initializes the form and assigns hotkey function to F4
Application.OnKey "{F4}", "CloseForm"
UserForm1.Show vbModeless
End Sub
Sub CloseForm()
'Sub to close the userform when F4 is pressed
Unload UserForm1
'optionally, revert F4 to its normal behavior
'Application.OnKey "{F4}"
'reset F4 to open the form:
Application.OnKey "{F4}", "showform"
End Sub
如果您已经在使用F4打开表单,则需要稍微调整一下逻辑,例如检查表单是否已经显示,或者是否有错误处理等。
但是有一些问题:在表单具有焦点时无效,因此除非显示表单vbModeless
,否则无效。这对于显示vbModal
的表单不起作用,因为当表单以这种方式显示时,只会识别表单事件,因此热键不会触发关闭函数,除非它是从表单对象的事件处理程序调用。
否则,我认为您无法按照自己的方式处理每个表单对象的事件,或者可能正在探索WithEvents
选项。
答案 1 :(得分:2)
在Access中,您可以将函数直接放入控件的事件代码框中,包括多个控件的相同函数。
在Excel和Word中,我认为唯一的方法是使用WithEvents。这里有一些关于该主题的一些信息的链接。如果这还不够,谷歌“Excel WithEvents”。 (WithEvents是一个词。)
答案 2 :(得分:2)
David和Pete给了我一些很好的研究见解,所以我把Pete的标记正确 - Excel先生论坛链接非常有帮助。为了代码,我最终得到了以下内容,但没有将其标记为正确,因为它可能对其他用户来说太窄了。
Userform1代码
Dim TBs() As New TBClass
Private Sub UserForm_Initialize()
Dim TBCount As Integer
Dim Ctrl As Control
TBCount = 0
For Each Ctrl In Absence_Viewer.Controls
If TypeName(Ctrl) = "TextBox" Then
TBCount = TBCount + 1
ReDim Preserve TBs(1 To TBCount)
Set TBs(TBCount).TBGroup = Ctrl
End If
Next Ctrl
'Do other stuff
End Sub
名为TBClass的类模块代码
Public WithEvents TBGroup As MSForms.TextBox
Private Sub TBGroup_KeyDown(ByVal keycode As MSForms.ReturnInteger, ByVal Shift As Integer)
If keycode = 115 Then Unload Userform1
End Sub