当用户进行更改然后关闭工作簿时停止“另存为”提示

Posted

技术标签:

【中文标题】当用户进行更改然后关闭工作簿时停止“另存为”提示【英文标题】:Stop the Save As prompt when users make changes then close workbook 【发布时间】:2017-11-09 10:29:54 【问题描述】:

我已经设法抑制“另存为”方法转到文件 > 另存为,如下所示:

Private Sub Workbook_BeforeSave _
               (ByVal SaveAsUI As Boolean, Cancel As Boolean)

    If SaveAsUI = True Then Cancel = True

End Sub

我已将文件设为只读,因此“保存”选项会阻止它们以这种方式保存。

但是,如果他们对工作簿的工作表进行更改,则会提示他们保存更改。点击“是”会弹出“另存为”提示。

我的最终目标是阻止他们保存在此工作表上或能够在任何地方保存工作表的副本。我希望他们能够打开工作表,使用它的功能/特性,就是这样。

VBA 受密码保护。

他们将通过快捷方式访问它,文件不在他们的机器上(我知道已创建本地副本,这是我的下一个挑战)文件本身将在由 Active Directory 控制的服务器上。

【问题讨论】:

您的整个工作都是基于它们在打开文件时激活 VBA / 宏这一事实。如果他们不执行/允许您的代码运行,那么您的程序将不会执行或“保护”您的文件。此外,您无法阻止他们使用其他应用程序(如 LibreOffice)打开文件,这将绕过您可能已实施的宏和其他一些安全机制(如 VBA 密码保护)。而这些只是一些缺点。简而言之:如果你问我,我会说你使用 Excel 时没有真正的安全性。 我最初将在用户计算机上设置 Excel 和此连接,因此我将自己启用它。我知道 Excel 不是万无一失的,但越难或越难,我就可以让它变得更好。如果有人真的想得到它,那么他们会得到它,但这张表的用户通常不会精通 IT。 【参考方案1】:

由于我们似乎同意 Excel 不提供任何真正的保护,这可能就是您要寻找的:

(1) 确保用户在文件关闭时不会收到有关保存更改的问题。

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)

ThisWorkbook.Close SaveChanges:=False

End Sub

(2) 确保用户无法打印 Excel 文件:

Private Sub Workbook_BeforePrint(Cancel As Boolean)

Cancel = True

End Sub

(3) 您甚至可以在文件停用时自动关闭该文件,以尝试确保他们不会创建引用您的“受保护”文件的新 Excel 文件:

Private Sub Workbook_Deactivate()

ThisWorkbook.Close SaveChanges:=False

End Sub

请注意,你不能/不应该同时使用所有的 sub,因为它们是部分相互依赖的。因此,如果您使用选项 (1) 和事件 BeforeClose 关闭文件,那么子 Deactivate 将失败,因为没有打开的 Excel 文件可以关闭(反之亦然)。

【讨论】:

对于 (1),它可以很好地关闭工作簿,但后面的 Excel 窗口仍然打开。如何同时关闭它? 在这种情况下你想使用Application.DisplayAlerts = False : ThisWorkbook.Parent.Quit。因为 Excel 文件的parent 被认为是显示给定 Excel 文件的 Excel 应用程序(在打开多个 Excel 实例时特别有用)。 DisplayAltert 必须首先被禁用,以确保用户确实不会收到是否应该先保存文件的问题。

以上是关于当用户进行更改然后关闭工作簿时停止“另存为”提示的主要内容,如果未能解决你的问题,请参考以下文章

提示文件打开,进行更改并另存为另一个副本,然后关闭+取消保存原始文件

按钮显示另存为对话框,然后保存到设置的位置

如何在 PHP 中使用 JavaScript 另存为函数?

excel 保存时弹出窗口为另存为,怎么办?

我想在用户右键单击时更改另存为对话框文件名

VBA 另存为 CSV 文件被第一张表覆盖