UserForm中的Application.Quit尝试在退出之前运行其余的宏

时间:2014-06-20 18:49:02

标签: vba excel-vba userform quit excel

我的问题是:在Excel 2013中使用VBA当用户决定不填写用户窗体并单击退出或取消时,如何优雅地关闭整个Excel实例?

目前,如果用户点击退出或取消,我会检查我的实例是否是唯一打开的实例。如果不是,我可以使用ThisWorkbook.Close,我想我会没事的。但是,如果是,我不希望应用程序仍然存在,所以我使用了Application.Quit。但是,这会尝试完成运行宏,抛出错误(最初“类型不匹配”,因为我卸载表单),并且只有在我单击“Debug”或“End”之后才会关闭(对于我实际上它不能实际执行速度很快调试)。我现在忽略了第一种情况,只是试图退出整个应用程序。这是一个非常长的宏,有很多子程序和函数,所以对于调试和发布,我已经缩短了它。不再出现类型不匹配错误,但我认为这是实际错误的结果:调用关闭应用程序的命令后运行的代码。

首先,这是启动所有内容的代码:

Private Sub CommandButton1_Click()

    Call form_variables
    frm_REQUEST.Show
    Call a_REQUEST_main

End Sub

子程序

form_variables

是一个创建公共变量的子例程,因此我可以存储来自UserForm的数据。

frm_REQUEST.Show

初始化(包括调用找到另一个工作簿的函数,提取列表,进行一些格式化,关闭工作簿并将列表输入userforms下拉框)并显示表单,最后

a_REQUEST_main

使用公共变量(存储UserForm数据)并执行其操作(但如果关闭UserForm则不应执行任何操作)。

调用.Show时执行的代码是:

Private Sub UserForm_Initialize()

    ' Get job numbers from other workbook
    Dim job_selection_list As Variant
    job_selection_list = get_job_list()

    With frm_REQUEST.Job_Number_ComboBox
        .List = job_selection_list
    End With

    ' set focus on Job Numbers
    JN_combobox.SetFocus

End Sub

Private Sub cancel_button_Click()

    Set job_selection_list = Nothing

    Unload Me

    Application.Quit

End Sub


Private Sub submit_button_Click()

    ' Values from userform saved as global (?) variables so other subroutines can access.

End Sub

我逐步完成了程序并看到,一旦在UserForm中调用Application.Quit,主子程序中的宏步骤

Call a_REQUEST_main

但它应该真正关闭所有东西。我尝试做“保存”命令,改变事物的顺序,并阅读需要设置为空的对象(因此初始化下拉列表时创建的job_selection_list的设置),但我似乎无法得到这个工作,或在网上找到任何东西。任何人都可以提供一些指导或让我知道关闭excel实例的更好方法吗?帮帮我Stack-Overflow Kenobi,你是我唯一的希望!

感谢。

2 个答案:

答案 0 :(得分:0)

Application.Quit放入按钮的Terminate事件处理程序中的Click事件处理程序而不是

原因是,即使表单已卸载,该过程仍将继续运行。因此,请利用这些事件。

将它放入Click事件将卸载表单,但程序将继续运行,这当然可能会引发错误或其他不良影响。

注意:系统可能会提示您保存/放弃对工作簿的更改(如果有)。

答案 1 :(得分:0)

只需在用户关闭表单时添加一个变量来解释

形式

'hold flag if users cancels form
Public btnCancel As Boolean
Private Sub CommandButton1_Click()
Unload Me
btnCancel = True
End Sub

'set the flag each time the form active
Private Sub UserForm_Activate()
btnCancel = False
End Sub

然后在你的代码中

Call form_variables
frm_REQUEST.Show

If frm_REQUEST.btnCancel Then
    Application.Quit
Else
    Call a_REQUEST_main
End If
相关问题