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
我在 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