VBA Access 2003 只允许在合理的时间内按下按钮一次

Posted

技术标签:

【中文标题】VBA Access 2003 只允许在合理的时间内按下按钮一次【英文标题】:VBA Access 2003 Only Allow Press Button Once Within Reasonable Amount Of Time 【发布时间】:2013-07-25 18:33:27 【问题描述】:

我在表单上有一个按钮,它从表单的列表框中获取行源,创建 Excel、工作表和查询表对象,将信息查询到 excel 中,然后将其全部格式化。问题在于,如果用户快速按下鼠标按钮,他或她将激活此按钮的次数与此相同。

我曾尝试将代码置于中间睡眠状态,但这只会导致每次按下按钮的持续时间与睡眠时间一样长,然后无论查询花费多长时间。我用过的:

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

我也尝试将焦点设置到另一个控件并禁用按钮,但我不太确定如何在设定的时间后重新启用它,因为即使将它放在子的末尾,Access 仍然每次按下按钮时执行按钮。

有什么建议吗?

【问题讨论】:

【参考方案1】:

第一次单击时禁用命令按钮,而不是等待固定的时间。然后进行长时间运行的操作,然后再次启用命令按钮。

假设命令按钮的名字是cmdToExcel ...

Private Sub cmdToExcel_Click()
    Me.txtNote.SetFocus
    Me.cmdToExcel.Enabled = False
    ' replace next line
    MsgBox "call long running code here"
    Me.cmdToExcel.Enabled = True
    Me.cmdToExcel.SetFocus
End Sub

请注意,在禁用命令按钮之前,您必须 SetFocus 到不同的控件,因为 Access 不允许您在它仍然具有焦点时禁用它。

你可能不想 SetFocus 回到最后的命令按钮 --- 我只是对那个做了一个疯狂的猜测。 :-)

似乎代码流控制在长时间运行的过程完成之前返回到单击事件过程。因此命令按钮过早地再次启用。

在这种情况下,您可以在调用长时间运行的代码后使用Sleep API 声明插入暂停。

Private Sub cmdToExcel_Click()
    Me.txtNote.SetFocus
    Me.cmdToExcel.Enabled = False
    ' replace next line
    MsgBox "call long running code here"
    Sleep 5000 ' 5 seconds
    Me.cmdToExcel.Enabled = True
    Me.cmdToExcel.SetFocus
End Sub

我现在意识到这就是你最初要求的。对不起,我很厚。

【讨论】:

我已经尝试过了,只是再次尝试确定,每次按下按钮它仍然执行“长时间运行的代码”。 嗯。 “长时间运行的代码”是否在它(长时间运行的代码)完成之前将控制权返回给cmdToExcel_Click?在cmdToExcel_Click 中插入断点,如果需要检查,请单步执行代码。 它没有,焦点停留在单独的控件上。我什至尝试在我的变量初始化之前放置“enable = false”! 你很好,我的措辞很糟糕!您的第二个解决方案实际上是我首先使用 sleep 功能所做的。遗憾的是,它不会禁用然后等待 5 秒,而是会在每次单击按钮时调用并在每次单击之间进行睡眠。 我也在考虑尝试设置一个全局位,根据按钮的执行情况为真/假,但我真的不想使用全局变量。【参考方案2】:

假设您希望按钮被禁用不少于 5 秒

Me.cmdButton.Enabled = False
timing = Dbl(Now())
'
' query code
'
timing = Dbl(Now()) - timing
seconds = Int(CSng(timing * 24 * 3600))
If seconds < 5 Then
    Sleep (5 - seconds) * 1000
End If
Me.cmdButton.Enabled = True

【讨论】:

以上是关于VBA Access 2003 只允许在合理的时间内按下按钮一次的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 2003 不进入调试模式并忽略断点

如何在 Access 2003 和 VBA 中使用控件集合

Access 2003 - VBA - 加入两种类型(字符串 = 日期)

关于 MS Access 2003 和 VBA 编程

MS Access 2003 - 创建 MDE 文件失败:错误 VBA 已损坏?

有没有办法在 VBA(MS Access 2002 或 2003)中调用任何控件的更新前事件过程?