2013-07-25 30 views
3

我有一個窗體上的按鈕,它從我的窗體上的列表框獲取行來源,創建Excel,工作表和查詢表對象,查詢信息到excel和然後將其全部格式化。問題是,如果用戶快速按下鼠標按鈕,他或她將同樣多次激活此按鈕。VBA Access 2003只允許在合理的時間內按下一次按鈕

我試圖讓代碼在中間睡覺,但這只是導致每個按鈕按下持續只要睡眠,然後無論長查詢需要。我用:

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

我也試過焦點設置到另一個控件和禁用按鈕,但我不能肯定在設定的時間量之後如何重新啓用它,因爲即使把它在子結束時,Access仍然執行每按鈕按鈕的按鈕。

有什麼建議嗎?

回答

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 

我現在意識到,這就是你首先要求的。對不起,我很厚。

+0

我試過這個,只是試了一次只是要確定被禁用,仍執行每「長時間運行代碼」按鈕按下。 – Elias

+0

嗯。在「長時間運行的代碼」完成之前,「長時間運行的代碼」是否將控制權返回給「cmdToExcel_Click」?如果您需要檢查,請在'cmdToExcel_Click'中插入一箇中斷點並逐句通過代碼。 – HansUp

+0

它沒有,焦點停留在一個單獨的控制。我甚至試圖在我的變量初始化之前放置'enable = false'! – Elias

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