Excel 用户窗体取消按钮?间歇性?无响应?
附加的VBA过程用于进度条用户窗体。除“取消”按钮间歇性无响应外,一切正常 我断断续续地说,因为95%的时间我必须在程序停止之前多次单击“取消”按钮。我可以看到按钮单击事件被设置为动画,但过程没有被中断。在按钮关闭事件发生之前,似乎有什么东西正在从“取消”按钮窃取焦点 “escape”和“window close”按钮按预期响应,只需单击一次 我需要做什么才能使“取消”按钮正确响应?谢谢 更新:我注意到当我点击并按住“取消”按钮时,按钮并没有保持“向下”状态,而是被重新启动。因此,显然有什么东西正在将按钮状态重置为向上,速度足够快,以至于过程没有捕捉到向下状态来触发单击事件 以下是userform模块(名为UserForm1)中的代码: 以下是调用UserForm1的模块(名为Module1)的代码:Excel 用户窗体取消按钮?间歇性?无响应?,excel,vba,userform,Excel,Vba,Userform,附加的VBA过程用于进度条用户窗体。除“取消”按钮间歇性无响应外,一切正常 我断断续续地说,因为95%的时间我必须在程序停止之前多次单击“取消”按钮。我可以看到按钮单击事件被设置为动画,但过程没有被中断。在按钮关闭事件发生之前,似乎有什么东西正在从“取消”按钮窃取焦点 “escape”和“window close”按钮按预期响应,只需单击一次 我需要做什么才能使“取消”按钮正确响应?谢谢 更新:我注意到当我点击并按住“取消”按钮时,按钮并没有保持“向下”状态,而是被重新启动。因此,显然有什么东西
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事件。我仍然不知道如何解决这个问题。