VBA:在运行时通过用户窗体按钮退出宏会导致在重新启动宏时出现错误 429

VBA: Exiting a macro during runtime via userform button results in error 429 when restarting the macro

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

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

我的表单上还有一个确定按钮,当导入过程完全完成时,该按钮会激活。

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

我的进度条:

用户表单中的代码:

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

错误

感谢您的帮助。

我曾经在 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 模块之外,因此您可以确定该模块不再被使用。

我通过将子例程 ExitProcess 移动到用户窗体代码中并删除每个 Unload Me 来解决它。现在,当用户通过取消按钮或右上角的 x 按钮退出时 例程 ExitProcess 被执行。

在那之后我能够重新启动该过程而没有任何错误。

Sub ExitProcess()

    KostenstellenWB.Close SaveChanges:=False

    MAStundenWB.Close SaveChanges:=False

    ERWB.Close SaveChanges:=False

    ExcelApp.Quit

    Set ExcelApp = Nothing

    End

End Sub

Private Sub UserForm_Initialize()

    ProgressBarForm.PBOKButton.Enabled = False

End Sub

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

    If CloseMode = 0 Then

        If ProgressBarForm.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()

    GetData

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