我在表单上有一个按钮,它从表单上的列表框中获取RowSource,创建Excel,工作表和查询表对象,将信息查询到Excel中,然后将其全部格式化。问题是,如果用户快速按下鼠标按钮,他或她将多次激活此按钮。
我试图让代码在中间休眠,但这只会导致按下每个按钮的时间与睡眠一样长,然后查询需要多长时间。我用过的东西:
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
我也尝试将焦点设置为另一个控件并禁用该按钮,但我不确定如何在设定的时间后重新启用它,因为即使将它放在sub的末尾,Access仍然按下每个按钮按钮。
有什么建议吗?
答案 0 :(得分:5)
首次单击时,禁用命令按钮,而不是等待一段固定的时间。然后执行长时间运行的操作,然后再次启用命令按钮。
假设命令按钮的名称是 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
回到最后的命令按钮---我只是猜测那个。 : - )
似乎代码流控制在长时间运行的进程完成之前返回到click事件过程。因此,命令按钮会再次启用。
在这种情况下,您可以在调用长时间运行的代码后使用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
我现在意识到这就是你首先要求的。对不起,我很厚。
答案 1 :(得分:0)
假设您希望按钮被禁用不少于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