Excel “在”期间将用户踢出单元格;DoEvents";

Excel “在”期间将用户踢出单元格;DoEvents";,excel,vba,Excel,Vba,当用户编辑单元格时,有没有一种方法可以使用VBA按enter键、向下键或选择另一个单元格?我正在为孩子们创建一个小测验,希望确保孩子在键入答案后没有按enter键,密码不会中断 抱歉,如果不清楚,我是VBA新手 我正在尝试为一些学生创建一个5倍表测验。 宏的目的是发布问题,然后让他们回答6秒钟,然后休息3秒钟 由于用户将是儿童,我希望使其尽可能防弹。 为此,我计划如下: -大部分的床单都会受到保护,所以他们只能做很少的事情 -答案单元格是自动选择的,所以孩子们只需要输入数字 -在6秒钟结束时,代

当用户编辑单元格时,有没有一种方法可以使用VBA按enter键、向下键或选择另一个单元格?我正在为孩子们创建一个小测验,希望确保孩子在键入答案后没有按enter键,密码不会中断

抱歉,如果不清楚,我是VBA新手

我正在尝试为一些学生创建一个5倍表测验。 宏的目的是发布问题,然后让他们回答6秒钟,然后休息3秒钟

由于用户将是儿童,我希望使其尽可能防弹。 为此,我计划如下:

-大部分的床单都会受到保护,所以他们只能做很少的事情

-答案单元格是自动选择的,所以孩子们只需要输入数字

-在6秒钟结束时,代码将他们踢出应答单元格,并检查应答

我正在与最后一颗子弹搏斗,特别是当学生们还在编辑答案单元格时,踢他们。我尝试过:Application.SendKeys“{ENTER,False}”

子测试()
暗暂停时间,休息时间,时间1,时间2,时间3,i
i=1
我13岁以下的时候去做
表(“测试SG”)。范围(“N_1”)。值=i
表(“测试SG”)。范围(“N_2”)。值=5
表格(“测试”)范围(“答案”)。选择
PauseTime=6'设置问题持续时间。
中断时间=3'设置中断持续时间。
time1=定时器设置开始时间。
time2=计时器+暂停时间
time3=计时器+暂停时间+休息时间
直到时间1>=时间2
DoEvents对其他流程的产量。
定时器1=定时器
环
Application.SendKeys“{ENTER,False}”
如果图纸(“测试”)范围(“回答”)=i*5,则
图纸(“教师区”)。范围(“开始”)。偏移量(0,i)。值=“Y”
其他的
图纸(“教师区”)。范围(“开始”)。偏移量(0,i)。值=“N”
如果结束
表(“测试表”)。范围(“A1”)。选择
直到时间1>=时间3
定时器1=定时器
环
i=i+1
环
端接头

您在这里遇到了一些问题(“为什么要使用excel?”),因为excel在输入过程中非常非常保护用户。在输入到工作表(或表单中的输入框)期间,几乎不可能获得控制权。我在相当多的搜索中找不到任何建议,只有在输入用户点击ENTER之后,“OnTime”事件才会被处理

必须进入第二条注释的范围并控制每一次击键是可能的,但这肯定是很难做到的,接管了通常由Excel处理的工作。也可以用Python或其他语言编写——如果您可以访问服务器,可以创建一个活动网页解决方案

如果你重新考虑你的基本设计,你可以很容易地留在Excel中:如果是多项选择,这真的是一种糟糕的教学方法吗?你可以输入很多选择,就像每个数字一样

在一堆单元格中填入可能的答案,以数字顺序排列,这样孩子就可以快速找到“37”。电子表格可以紧凑地显示10x10矩阵中的1-100,并提供100个选项。只需设置一个OnClick工作表事件-如果孩子点击了正确的单元格,那么是的,否则会出错。六秒钟后的OnTime事件取消OnClick事件并弹出一条太迟消息


以这种方式解决了几行问题,它与Excel擅长的东西一起工作,而不是与之对抗。

我喜欢Roy的建议,即从可能的解决方案表中选择一个答案,供孩子点击

<>如果你想让孩子键入一些东西,你应该考虑创建一个用户表单。这将允许你做一些很好的操作,比如显示一个时钟倒计时他们分配的6秒,并且可以将他们的各种答案保存到变量中,这些变量可以被标记,或者稍后作为管理员推送给你。(例如,可能保存到隐藏的工作表中)

这也会阻止你的孩子点击你的“答案”单元格,然后简单地输入问题来生成正确的答案。6s是一个很长的时间来打印出来!数据验证规则不会阻止您的孩子使用公式作弊


菲尔

由于用户将是儿童,我希望它尽可能防弹
-那为什么要使用Excel呢?如果您确实想使用Excel,为什么不创建一个用户表单呢?您可以钩住键盘事件,然后在按键到达Excel之前对其执行任何操作:注意,如果验证失败,单元格将不会退出编辑。这个相当烦人的特性将确保用户输入始终处于活动状态。但是,它确实会显示一个令人讨厌的对话框。我的建议是使用一个表单作为用户输入,并从输入了问题的单元格中提取标签文本,然后将用户的输入输出到特定单元格以检查答案。您可以将计时器构建到表单的循环中,一旦时间过去,该循环将自动更改它,并为下一个问题设置它。
Sub Test()

Dim PauseTime, BreakTime, time1, time2, time3, i
i = 1
Do While i < 13
    Sheets("Test_SG").Range("N_1").Value = i
    Sheets("Test_SG").Range("N_2").Value = 5    
    Sheets("Test_SG").Range("Answer").Select
    PauseTime = 6    ' Set question duration.
    BreakTime = 3    ' Set break duration.
    time1 = Timer    ' Set start time.
    time2 = Timer + PauseTime
    time3 = Timer + PauseTime + BreakTime
    Do Until time1 >= time2
        DoEvents ' Yield to other processes.
        time1 = Timer   
    Loop
    Application.SendKeys "{ENTER,False}"
    If Sheets("Test_SG").Range("Answer") = i*5 Then
        Sheets("Teacher_Zone").Range("Start").Offset(0,i).Value = "Y"
    Else
        Sheets("Teacher_Zone").Range("Start").Offset(0,i).Value = "N"
    End If
    Sheets("Test_SG").Range("A1").Select
    Do Until time1 >= time3
        time1 = Timer
    Loop
i = i + 1
Loop

End Sub