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 只允许在合理的时间内按下按钮一次的主要内容,如果未能解决你的问题,请参考以下文章
Access 2003 - VBA - 加入两种类型(字符串 = 日期)