2010-01-30 23 views
0

附加的VBA過程用於進度條用戶窗體。一切正常,除了取消按鈕是間歇性地沒有反應。用戶表單取消按鈕_Intermittently_沒有響應?

我說間歇性地說,因爲95%的時間我必須在程序停止前多次單擊取消按鈕。我可以看到按鈕點擊事件是動畫的,但程序沒有被中斷。它看起來好像在按鈕向下事件發生之前某些東西正在從取消按鈕中竊取焦點。

逃逸和窗口關閉按鈕按照預期一鍵響應。

我需要做些什麼才能使取消按鈕正確響應?謝謝!

更新:我注意到,當我點擊並按住取消按鈕,而不是按鈕保持「向下」時,它會被踢回來。所以顯然有些東西會將按鈕狀態重置爲快,以至於該過程不會捕獲關閉狀態以觸發單擊事件。

下面是用戶窗體模塊(UserForm名)中的代碼:調用UserForm1

Private mbooUserCancel As Boolean 

Public Property Get UserCancel() As Boolean 
    UserCancel = mbooUserCancel 
End Property 

Private Property Let UserCancel(ByVal booUserCancel As Boolean) 
    mbooUserCancel = booUserCancel 
End Property 

Public Sub UpdateProgress(CountTotal As Long, CountProgress As Long) 
    On Error GoTo Error_Handler 
    ProgressBar1.Value = CountProgress/CountTotal * 100 
    DoEvents 
Error_Handler: 
    If Err.Number = 18 Then CommandButton1_Click 
End Sub 

Private Sub CommandButton1_Click() 
    Hide 
    UserCancel = True 
End Sub 

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 
    Cancel = True 
    CommandButton1_Click 
End Sub 

Private Sub UserForm_Activate() 
    With Application 
     .Interactive = False 
     .EnableCancelKey = xlErrorHandler 
    End With 
End Sub 

Private Sub UserForm_Terminate() 
    Application.Interactive = True 
End Sub 

下面是模塊(命名爲模塊)的代碼:

Sub TestProgress() 

    On Error GoTo Error_Handler 

    Dim objUserForm As New UserForm1 
    Dim lngCounter As Long 
    Dim lngSubCounter As Long 

    With objUserForm 
     .Show vbModeless 
     DoEvents 
     For lngCounter = 1 To 5 
      If .UserCancel Then GoTo Exit_Sub 
      For lngSubCounter = 1 To 100000000 
      Next lngSubCounter 
      .UpdateProgress 5, lngCounter 
     Next lngCounter 
     Application.Wait Now + TimeValue("0:00:02") 
     .Hide 
    End With 

Exit_Sub: 

    If objUserForm.UserCancel Then 
     MsgBox "User Cancelled from UserForm1" 
    End If 
    Exit Sub 

Error_Handler: 

    If Err.Number = 18 Then 
     Unload objUserForm 
     MsgBox "User Cancelled from Module1" 
    End If 

End Sub 
+0

我更新了模塊中調用UserForm1來測試調用者中的錯誤處理的代碼。進度條應該是可重用的(xlModeless),所以調用過程就是動作發生的地方,並且可能在取消時發生。我認爲發生的事情是在處理調用者中的代碼期間發生了click事件,並且UserForm1沒有拾取click事件。我仍然不知道如何解決這個問題。 – Kuyenda 2010-01-30 22:51:37

回答

0

答案是爲進度條使用模態用戶表單,這樣按鈕點擊事件就可以觸發而不會被調用過程中的處理所遮蔽。

1

對我的作品每次點擊一次。嘗試卸載可能在容器應用程序內運行的任何加載項或任何其他代碼,並查看是否有幫助。

+0

我創建了一個新項目,並將代碼放在那裏,並嘗試過。果然,它完美運作。現在我只需要弄清楚我的舊項目是什麼導致了問題。我也發現'UserForm_Activate'並不一致。資源廣泛的操作是否可能導致事件被跳過?謝謝dkusleika! – Kuyenda 2010-01-30 22:23:33

+1

嘗試在Application.EnableEvents = False中包裝您的代碼,然後在最後將其設置爲true。這可能只在Excel中,我不記得了。另外,我無法想象會發生什麼事件,但無論如何它值得一試。 – 2010-01-31 15:39:05

1

如果人們仍然需要答案,那麼我研究了&破解它!

對於點擊取消按鈕,代碼應該是;

Private Sub CommandButton1_Click() 

Unload Me 

'this bit ends all macros 

End 

End Sub