通过 VBA 关闭 Excel

Closing Excel via VBA

很久以前,我有一个宏可以打开一些工作簿,进行一些操作,然后关闭 - 全部是全自动的,从命令行调用,所以我可以批处理它并将其粘贴在 windows 计划中以 运行需要的时候。

我已经打电话要求再做一次,当然不能再访问这些文件(就像四家公司以前那样)所以 bash 重新创建它们,但坚持关闭 excel.

ActiveWorkbook.Close SaveChanges:=True

这可以关闭我正在更新的工作簿,但是,如果我在包含工作簿的宏上使用它,它会关闭 Excel 内的工作簿,但会保留 excel 运行ning(没有工作簿)。

Application.Quit

这是我认为应该是正确的命令,但是这也会引发错误:

Run-time error '1004':

Application-defined or object-defined error

然而,这很奇怪。如果我只是 运行 excel 中的那个命令本身,没有错误,只有当工作簿调用包含它的宏时才会出错。

因为它是一个自动启动的宏,所以我在 ThisWorkbook 中有一个初始宏,它有 Private Sub Workbook_Open() 可以启动一切。

我读到 Application.Quit 当工作簿有一个自动启动的宏并且它是从模块而不是 ThisWorkbook 调用时会导致此错误消息,所以我移动了 Sub QuitExcel()我创建了,仅包含 Application.Quit 但仍然出现此错误。

SO 在发帖时的建议帖子提供了一些尝试,例如 DisplayAlerts=False 和保存工作簿,所以我将退出子更新为:

Sub QuitExcel()
    Application.DisplayAlerts = False
    Application.EnableEvents = False
    ThisWorkbook.Save
    Application.Quit
    ThisWorkbook.Saved = True
End Sub

(以及它的各种排列)

然而我仍然坚持得到同样的错误。

有趣的是,如果我点击“调试”(而不是结束,继续是灰色的)Excel 仍然退出,实际上并没有去调试。

任何人都对我想要实现的目标有经验,我只想在完成 运行ning 后从自动启动宏中杀死 Excel?

您应该知道 VBA 代码仅 运行 在工作簿上下文 ThisWorkBook 中,这意味着当您使用 WorkBook.Close 关闭它时,将没有代码可以执行。 所以,你只保存然后使用 Application.Quit 不要关闭工作簿 For Each w In Application.Workbooks w.Save Next w Application.Quit

答案比较简单,我需要在退出前关闭我的工作簿excel并且关闭宏不能在ThisWorkbook中,它必须在模块中(否则当工作簿已关闭,无法访问其余代码。

所以我的命令最终是:

Sub QuitExcel()
    ActiveWorkbook.Close SaveChanges:=False
    Application.Quit
End Sub

只是需要更多的谷歌搜索和 trial/error。