VBA Access 2003仅在合理的时间内允许按下按钮

时间:2013-07-25 18:33:27

标签: vba ms-access user-controls

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

我试图让代码在中间休眠,但这只会导致按下每个按钮的时间与睡眠一样长,然后查询需要多长时间。我用过的东西:

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

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

有什么建议吗?

2 个答案:

答案 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