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

Eli*_*ias 3 ms-access user-controls vba

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

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

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Run Code Online (Sandbox Code Playgroud)

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

有什么建议?

Han*_*sUp 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
Run Code Online (Sandbox Code Playgroud)

请注意,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
Run Code Online (Sandbox Code Playgroud)

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