防止 Word VBA 中的 Excel 提示

Posted

技术标签:

【中文标题】防止 Word VBA 中的 Excel 提示【英文标题】:Preventing Excel prompt from Word VBA 【发布时间】:2015-12-17 23:56:47 【问题描述】:

我在 Word 和 Excel 上使用 VBA。我让 Word 运行一个用户表单,它会自动打开一个 Excel 文件。用户应在 Excel 文件中填写一些数据,然后返回 Word 用户表单。当用户填写完 Word 用户表单中的所有字段后,它将在 Word 上运行一些 VBA 代码,将数据从 Excel 复制到 Word。完成后,Excel 文件将自动关闭。因此,我需要防止用户手动关闭 Excel 应用程序。

为了做到这一点,我在Sub Workbook_BeforeClose 的 Excel VBA 中使用这些代码。如果用户关闭 Excel 应用程序窗口,它将显示一个消息框,询问用户是否仍在使用 Word 用户窗体。代码如下:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

answer = MsgBox("Are you still working with Word userform?", vbYesNo)
If answer = vbYes Then
    Cancel = True
    MsgBox "This workbook should not be closed. It will be automatically closed when you finish working with Ms. Word Template Userform."
Else
    Application.ThisWorkbook.Saved = True
End If
End Sub

在 Word VBA 中,我有关闭 Excel 文件的代码:

Sub closeExcelApp()

If Not excelApp Is Nothing Then
    excelApp.DisplayAlerts = False
    excelWb.Close savechanges:=False
    Set excelWb = Nothing
    excelApp.Quit
End If
Set excelApp = Nothing

End Sub

当 Word VBA 代码完成将数据从 Excel 复制到 Word 时,将调用此 Sub。但是,调用此 Sub 将导致调用 Workbook_BeforeClose。同时,当我从 Word VBA 调用 closeExcelApp 子时,我不希望调用 Workbook_BeforeClose

有什么建议吗?

【问题讨论】:

最好的方法是创建一个Public Boolean,在输入此closeExcelApp 时设置为True,并在Workbook_BeforeClose 的开头添加If Boolean Then Exit Sub 之类的内容。这应该够了吧! ;) 【参考方案1】:

如 cmets 中所述,在模块顶部添加这一行:Public ClosingFromWord As Boolean,并在开始执行代码时将此布尔值设置为 False

当您在应用程序之间工作时,最简单的方法是将布尔值从 Word 写入 Excel 中的单元格,然后在 Workbook_BeforeClose 中读取/加载该值,以避免遍历该例程的整个代码.

并修改你的代码看起来像这样:

Sub closeExcelApp()
ClosingFromWord = True
excelApp.Workbooks(1).Sheets(1).Cells(1,1) = ClosingFromWord

If Not excelApp Is Nothing Then
    excelApp.DisplayAlerts = False
    excelWb.Close savechanges:=False
    Set excelWb = Nothing
    excelApp.Quit
End If
Set excelApp = Nothing

ClosingFromWord = False
excelApp.Workbooks(1).Sheets(1).Cells(1,1) = ClosingFromWord
End Sub

因此,当您执行closeExcelApp 时,布尔值将设置为True,并且Workbook_BeforeClose 不会全部执行,因为它将以If ClosingFromWord Then Exit Sub 退出:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
ClosingFromWord = Workbooks(1).Sheets(1).Cells(1,1)
If ClosingFromWord Then Exit Sub

answer = MsgBox("Are you still working with Word userform?", vbYesNo)
If answer = vbYes Then
    Cancel = True
    MsgBox "This workbook should not be closed. It will be automatically closed when you finish working with Ms. Word Template Userform."
Else
    Application.ThisWorkbook.Saved = True
End If
End Sub

【讨论】:

我应该把Public ClosingFromWord as Boolean放在哪里? closeExcelApp 在 Word 中,而 Workbook_BeforeClose 在 Excel 中。我试图将布尔变量放在 Word VBA 模块中,但它似乎不起作用。我想我需要将变量从 Word 传递到 Excel,不是吗? 我的错,我忘记了。查看编辑,您可以指定比Workbooks(1).Sheets(1).Cells(1,1) 更实用的内容,但由于我对您的文件一无所知,这是解释它的最简单方法! 啊,我从来没有想过使用单元格在 Word 和 Excel 变量之间传递值。这对其他情况很有用。谢谢!【参考方案2】:

您可以禁用事件:

Sub closeExcelApp()

If Not excelApp Is Nothing Then
    excelApp.DisplayAlerts = False
    excelApp.EnableEvents = False
    excelWb.Close savechanges:=False
    Set excelWb = Nothing
    excelApp.Quit
End If
Set excelApp = Nothing

End Sub

【讨论】:

啊哈,看到你回答我就傻了,那一刻我完全忘记了!比我提出的解决方案更有效!

以上是关于防止 Word VBA 中的 Excel 提示的主要内容,如果未能解决你的问题,请参考以下文章

如何让VBA自动响应word或excel打开文件时自动出现的消息框

ExcelVBA如何调用API DLL(Delphi生成)

打开Word和Excel时有如下提示,如何解决

excel2013使用vba代码提示未找到提供程序,改程序可能未正确安装怎么处理

VBA Excel 备份:通过 VBA 以新名称保存当前工作簿的副本,保留 VBA 脚本,无提示

关于excel vba 常用警告提示关闭的问题