按下回车键模拟复选框点击无效

3
我复制并稍微修改了这篇文章底部找到的代码,以便在我创建的工作表表单中允许在表单控件之间使用Tab键。以下是与KeyCode = vbKeyEnter相关的部分:
Select Case KeyCode
Case vbKeyTab
    Dim Backward As Boolean
    Backward = (Shift And fmShiftMask)

    Call MoveFocus(Cntrl:=Cntrl, TabIndex:=TabIndex, Backward:=Backward)

Case vbKeyEnter
    Select Case TypeName(Cntrl)
    Case TxtBoxType
        If Not (Cntrl.EnterKeyBehavior And Cntrl.MultiLine) Then
            Call MoveFocus(Cntrl:=Cntrl, TabIndex:=TabIndex)
        End If
    Case Else
        On Error Resume Next
        Application.Run Sheet1.CodeName & "." & Cntrl.name & "_Click"
        On Error GoTo 0
    End Select
End Select

这段代码可以用于在控件之间前后切换,但我在使用回车键勾选或取消复选框控件时遇到了问题。它可以用来操作单选按钮,但是对于复选框则不起作用。如果我在 CheckBox1_Click 事件中添加 CheckBox1.Value = True,那么它就可以被勾选为真,但自然而然地,它不能被取消为假。我尝试添加以下 IF 语句以根据当前值将其设置为 true 或 false,但什么也没有发生。

If CheckBox1.Value = True Then
    CheckBox1.Value = False
Else
    CheckBox1.Value = True
End If

另外需要说明的是:当我按下回车键时,如果表单控件没有任何反应,它会将活动单元格向下移动到活动列。有什么建议吗?

1
空格键一直是切换复选框的接受方法。你为什么要重写Windows GUI系统? - user4039065
我想我不知道空格键是复选框切换键(在这方面还有点新手)。此外,我为创建表单的人请求了它 - 使用左手制表符和右手数字键盘输入数字/输入。我会确保空格键对我有效,并询问是否对他有效。如果不行,有没有办法让它与回车键一起工作?感谢您的帮助,Jeeped。 - SincereApathy
如果 KeyCode = 13,则 CheckBox1.Value = Not CheckBox1.Value 的代码按预期工作... - Dirk Reichel
听起来对我来说,构建一个用户窗体来处理这个数据输入任务会更容易。 - jkpieterse
1个回答

4

这可能或可能不是对编程问题的答案;我会让投票者决定。
Q. 模拟Enter键单击复选框无效

为什么要这样做呢?你花费时间和精力故意“破坏”一个正常工作的系统。长期以来,空格键一直被接受为切换复选框的按键,TabShift+Tab用于在表单控件之间导航,Enter↵OK的默认按键。

所谓“正常工作的系统”,是指整个Mac/Windows/Linux GUI系统以及数百万人已经习惯的标准实践。你可以从任何有能力的办公室工作者手中拿走鼠标,他们的生产力也不会受到影响。他们可以通过系统和应用程序进行导航,执行工作,因为系统中的所有内容,从设置视频分辨率到在自定义表单中输入工人的时间卡数据,都是同样的方式工作

把一个Windows用户放在他的第一台Mac前面。他们可以使用程序并完成工作,因为绝大多数操作(特别是用于应用程序的基本操作)都是相同的。把一个Mac用户放在Linux机器前面,你会得到相同的结果。机器和其程序的基本日常操作是相同的。

如果您要创建一个专有系统,将所有培训、实践和经验扔掉,那么任何潜在的求职者带着办公室经验的简历有什么意义呢?

使用空格键切换复选框的功能早在Windows 3.0之前就存在了。建立更好的捕鼠器和重新发明轮子¹之间是有区别的。


¹ 如果您认为维护GUI标准不值得追求,请考虑Office 2007功能区所引起的反弹。一个完全专门用于生产添加功能区的子行业被孵化出来,以恢复Office 2003的功能。


我不反对你的看法,并计划让空格键发挥其魔力。如果我知道空格键是标准,我就不会提出这个问题了。我从未接受过正式的Excel培训,也从未注意到这一点。也许没有必要深入研究,但现在我有点好奇,为什么代码设置模拟点击可以工作,而空格键却不能工作。是否因为相同的内部进程允许空格键工作,而设置阻止此功能以维护其设计意图? - SincereApathy
说实话,我并没有仔细查看你提供的代码,但是从所有意图和目的来看,如果你足够想要重定向任何东西,那么你可以这样做;即使你必须一直拦截通过Windows内核消息泵传递的消息。[Tab]和[Shift]+[Tab]导航应该是内置的。如果它不能正常工作,则需要修改窗体控件的Z顺序。我可能会稍后研究这个问题,作为一种智力锻炼,但我需要时间来构建一个“测试台”用户窗体,而我现在没有。 - user4039065
一个被证明非常关键的注意事项是,表单控件直接放在工作表上,而不是在用户窗体或框架中。我后来才知道,将它们放在框架中可能会让我设置选项卡索引顺序。然而,我已经有了超过60个控件的完整布局,并尝试找到一种避免在框架中重建整个表单的方法。 - SincereApathy
编程表单控件的 Z 轴顺序,请参阅 What order does a For Each Next loop through my checkboxes。请仔细阅读,它与您预期的相反。 - user4039065

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接