Excel 用户窗体取消按钮?间歇性?无响应?

Excel 用户窗体取消按钮?间歇性?无响应?,excel,vba,userform,Excel,Vba,Userform,附加的VBA过程用于进度条用户窗体。除“取消”按钮间歇性无响应外,一切正常 我断断续续地说,因为95%的时间我必须在程序停止之前多次单击“取消”按钮。我可以看到按钮单击事件被设置为动画,但过程没有被中断。在按钮关闭事件发生之前,似乎有什么东西正在从“取消”按钮窃取焦点 “escape”和“window close”按钮按预期响应,只需单击一次 我需要做什么才能使“取消”按钮正确响应?谢谢 更新:我注意到当我点击并按住“取消”按钮时,按钮并没有保持“向下”状态,而是被重新启动。因此,显然有什么东西

附加的VBA过程用于进度条用户窗体。除“取消”按钮间歇性无响应外,一切正常

我断断续续地说,因为95%的时间我必须在程序停止之前多次单击“取消”按钮。我可以看到按钮单击事件被设置为动画,但过程没有被中断。在按钮关闭事件发生之前,似乎有什么东西正在从“取消”按钮窃取焦点

“escape”和“window close”按钮按预期响应,只需单击一次

我需要做什么才能使“取消”按钮正确响应?谢谢

更新:我注意到当我点击并按住“取消”按钮时,按钮并没有保持“向下”状态,而是被重新启动。因此,显然有什么东西正在将按钮状态重置为向上,速度足够快,以至于过程没有捕捉到向下状态来触发单击事件

以下是userform模块(名为UserForm1)中的代码:

以下是调用UserForm1的模块(名为Module1)的代码:

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

每次单击第一次对我有效。尝试卸载容器应用程序中可能运行的任何加载项或任何其他代码,看看是否有帮助。

答案是使用进度条的模式用户表单,这样按钮单击事件就可以触发,而不会因调用过程中的处理而变得模糊。

如果人们仍然需要答案,我研究并破解了它

对于点击取消按钮,代码应为

Private Sub CommandButton1_Click()

Unload Me

'this bit ends all macros

End

End Sub

我创建了一个新项目,将代码放入其中并进行了尝试。果然,它工作得很好。现在,我只需要试着找出是什么原因导致了我的旧项目出现问题。我还发现,
UserForm\u Activate
的触发并不一致。资源相关操作是否可能导致跳过事件?谢谢你,德库斯莱卡!尝试在Application.EnableEvents=False中包装代码,然后在最后将其设置回true。我不记得了,那可能只是Excel里的。另外,我想不出会触发什么事件,但无论如何,还是值得一试。我更新了调用UserForm1的模块中的代码,以测试调用方的错误处理。进度条应该是可重用的(xlModeless),因此调用过程是操作发生的地方,很可能是取消发生的时间。我认为发生的情况是,在调用方处理代码的过程中发生了click事件,而UserForm1没有拾取click事件。我仍然不知道如何解决这个问题。