VBA:在运行时通过userform按钮退出宏会在重新启动宏时导致错误429

时间:2015-08-14 14:04:07

标签: excel vba excel-vba userform

我在Excel中有一个宏,它从两个其他工作簿中提取数据并导入它。在此过程中,会显示一个进度条,用户可以通过取消和标准X按钮随时退出。

当我使用这两个按钮中的任何一个退出进程时,当我尝试再次启动宏时,它会给出错误429。不知怎的,我猜我的表格仍然活跃。按下VBA编辑器中的重置按钮后,我可以再次启动宏而没有任何错误。

我的表单上还有一个OK按钮,当导入过程完全结束时,该按钮变为活动状态。

所有这三个按钮都执行相同的代码片段,即关闭所有内容。唯一的区别是它们在执行的不同点使用,这使得调试有点混乱。

我的进度条:

progress bar

用户形式中的代码:

Dim Button As String
Sub StartForm(CalledFrom As String)

    Button = CalledFrom

End Sub

Private Sub UserForm_Initialize()

    ProgressBar.PBOKButton.Enabled = False

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

    If CloseMode = 0 Then

        If ProgressBar.PBBar.Width < 200 Then

            If MsgBox("Wollen Sie den Vorgang wirklich abbrechen?", vbYesNo + vbQuestion, "Extrahiere Daten...") = vbNo Then

                'Do nothing
                Cancel = True

            Else

                ExitProcess

            End If

        Else

            ExitProcess

        End If

    End If

End Sub

Private Sub UserForm_Activate()

    If Button = "GetDataButton" Then

        GetData

    End If

End Sub

Private Sub PBOKButton_Click()

    ExitProcess

End Sub

Private Sub PBCancelButton_Click()

    If MsgBox("Wollen Sie den Vorgang wirklich abbrechen?", vbYesNo + vbQuestion, "Extrahiere Daten...") = vbYes Then

        ExitProcess

    End If

End Sub

代码片段以结束它(存储在我的宏中)

Sub ExitProcess()

    KostenstellenWB.Close SaveChanges:=False

    MAStundenWB.Close SaveChanges:=False

    ExcelApp.Quit

    Set ExcelApp = Nothing

    End

End Sub

错误

error

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我曾经在Word VBA中遇到类似的问题,虽然我不记得也找不到所有细节,但解决方案如下:

' In module myUserForm
'
Dim Button As String
Dim myCancel as Boolean
Sub StartForm(CalledFrom As String)
    Button = CalledFrom
    myCancel= False
    Me.Show
    ' Control returns after the form has been unloaded
    If (myCancel = True) Then
        ExitProcess
    End If
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = 0 Then
        If ProgressBar.PBBar.Width < 200 Then
            If MsgBox("Wollen Sie den Vorgang wirklich abbrechen?", vbYesNo + vbQuestion, "Extrahiere Daten...") = vbNo Then
                'Do nothing
                Cancel = True
            Else
                myCancel = True
                Unload Me                  ' unload the form from memory
            End If
        Else
                myCancel = True
                Unload Me                  ' unload the form from memory
        End If
    End If
End Sub

也就是说,卸载表单后运行ExitProcess。请注意,这仍然发生在用户表单模块中。如果这不起作用,那么你必须将ExitProcess函数移动到StartForm的调用者,我假设它在userform模块之外,所以你肯定不再使用该模块了。

答案 1 :(得分:0)

我通过将子例程ExitProcess移动到userform代码并解除每个Unload Me来解决它。现在当用户通过取消按钮或右上角x按钮退出时,只执行例程ExitProcess。 之后我能够重启过程而没有任何错误。 Sub ExitProcess()     KostenstellenWB.Close SaveChanges:= False     MAStundenWB.Close SaveChanges:= False     ERWB.Close SaveChanges:= False     ExcelApp.Quit     设置ExcelApp = Nothing     结束 结束子 Private Sub UserForm_Initialize()     ProgressBarForm.PBOKButton.Enabled = False 结束子 Private Sub UserForm_QueryClose(取消为整数,CloseMode为整数)     如果CloseMode = 0那么         如果ProgressBarForm.PBBar.Width&lt; 200然后             如果MsgBox(“Wollen Sie den Vorgang wirklich abbrechen?”,vbYesNo + vbQuestion,“Extrahiere Daten ......”)= vbNo Then                 '没做什么                 取消=真             其他                 ExitProcess的             万一         其他             ExitProcess的         万一     万一 结束子 Private Sub UserForm_Activate()     的GetData 结束子 私有子PBOKButton_Click()     ExitProcess的 结束子 Private Sub PBCancelButton_Click()     如果MsgBox(“Wollen Sie den Vorgang wirklich abbrechen?”,vbYesNo + vbQuestion,“Extrahiere Daten ......”)= vbYes Then         ExitProcess的     万一 结束子