3

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

我试图让代码在两者之间进入睡眠状态,但这只会导致每次按下按钮的时间与睡眠时间一样长,然后查询需要多长时间。我用了什么:

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

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

有什么建议么?

4

2 回答 2

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回到最后的命令按钮 --- 我只是对那个做了一个疯狂的猜测。:-)

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

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

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

于 2013-07-25T18:45:46.063 回答
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
于 2013-07-25T18:53:09.133 回答