2

我想让我的用户窗体关闭(或其他命令)而不使用加速键。

例如,当用户按 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
4

3 回答 3

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选项。

于 2013-06-15T22:32:38.347 回答
2

在 Access 中,您可以将函数直接放入控件的事件代码框中,包括多个控件的相同函数。

在 Excel 和 Word 中,我认为唯一的方法是使用 WithEvents。这是一些有关该主题的信息的链接。如果这还不够,谷歌“Excel WithEvents”。(WithEvents 是一个词。)

奇普·皮尔逊的网站

Excel先生论坛

于 2013-06-15T22:34:20.707 回答
2

大卫和皮特给了我一些很好的研究洞察力,所以我将皮特标记为正确 - 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
于 2013-06-16T05:04:56.543 回答