【问题标题】:How to stop Excel Macro Which Still Runs After Application.Quit Method如何停止在 Application.Quit 方法之后仍然运行的 Excel 宏
【发布时间】:2018-05-28 21:53:04
【问题描述】:

我发现了类似的问题,但是对于其他问题,似乎是从另一个应用程序调用 Excel 并在 Excel 应用程序关闭后留下进程。

就我而言,我的 Excel 文件中有一个宏,当出现错误时我会尝试关闭应用程序。

我的错误处理是这样设置的:

'Code code code

        CleanExit:
        Logger.LogData LOG_DEBUG, MODULE_NAME, "Initialize", "Some module initialized!"
        Exit Function

    ErrorExit:
        Logger.LogData LOG_ERROR, MODULE_NAME, "Initialize", "Error found! Description: " & err.description
        Main.HandleError err, MODULE_NAME, "Initialize"
        GoTo CleanExit

End function

我希望我的宏在某个模块中发生错误时停止运行,并且如果它在另一个模块中则不要停止(因此 GoTo CleanExit)。

错误处理程序是这样设置的:

Public Function HandleError(ByRef err As ErrObject, ByVal moduleOrgin As String, ByVal methodOrgin As String)

    Dim wbk As Workbook

    'Do something if module origin meets my parameters and exit function right here if my conditions are met

    MsgBox "Some message to the user about the problem"

    If GetSetting(SETTING_HIDE_APPLICATION, False) = True Then
        For Each wbk In addinWorkbook.Application.Workbooks
            wbk.Saved = True
        Next wbk

        addinWorkbook.Application.Quit
    End If

End Function

在此代码运行后,我假设所有进一步的代码运行都停止,因为我的 Excel 工作簿(我的宏代码所在的)已随应用程序关闭。

实际上,我收到一连串错误,错误消息显示 3 次,直到它永久关闭。 如何避免在 Application.Quit 方法之后运行任何代码?

发生错误时的代码工作流程以及 Application.Quit 之后运行的内容:

  1. 初始化表单的主要方法
  2. 调用引发错误的加载器方法(应用程序应在此处退出)
  3. 加载器方法完成后主方法继续
  4. 从 main 方法调用的后续方法也会引发错误(因为第一个加载程序失败)
  5. 最后我的main方法报错了

我总共收到 3 个带有错误描述的 msgbox。

我必须注意,我在所有方法中使用相同的错误处理过程,但我希望代码停止执行,因此进一步的代码不会触发任何错误。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    如何避免在Application.Quit 方法之后运行任何代码?

    如果您想停止一切,请在Application.Quit 之后写End。它会停止每一段 VBA 并终止您分配的所有变量。 这不是一个好的做法(根本!),但它会完全按照您的意愿工作。

    【讨论】:

    • 在想要优雅地退出时确实是(非常!!!)不好的做法,但它会起作用。 OP 可能应该考虑另一种方法。为答案+1。
    • @RikSportel - 很高兴看到有人仍然关心 VBA 中的质量代码。上周之后,当 3 个人试图说服我 SQL-Injection 是完全可以接受的时候,我考虑过稍微转换一下技术……(又开始研究 Python)。 :)
    • @Vityata VBA 归根结底是一个非常完整的开发环境。如果不能选择使用 Visual Studio(C# 或 vb.net),那么它是一个非常强大的替代方案。从这个意义上说,在 VBA 中使用一般的良好实践并不是一种奢侈。将其标记为“宏脚本语言”仅仅意味着不知道 VBA 是什么以及可以做什么。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多