【问题标题】:Beforesave and Aftersave ignored when saving as attachment保存为附件时忽略之前保存和之后保存
【发布时间】:2019-10-18 05:31:14
【问题描述】:

我在 Workbook_AfterSave 和 Workbook_BeforeSave 中有一些代码。它工作得很好,完全符合我的要求;但是,在测试过程中,我发现了一个奇怪的情况,即 Excel 在保存文档时没有调用这两个函数。

如果我打开一个文档并选择文件->共享->电子邮件->作为附件发送,则 Excel 会保存我的文档并将其放入电子邮件中,而无需调用 Workbook_AfterSave 和 Workbook_BeforeSave(我已通过添加Workbook_AfterSave 和 Workbook_BeforeSave 中的 msgbox 弹出窗口,在 Excel 中使用作为附件发送时肯定不会弹出。

所以,我正在与 Google 一起挖掘,试图找出我可能需要哪些其他选项来修复我的漏洞。

背景:我在 Workbook_AfterSave 和 Workbook_BeforeSave 中的代码隐藏了选项卡,非常隐藏,用户根本看不到它们。用户可以通过将此电子邮件用作附件“功能”来破解工作簿并查看隐藏的选项卡。

问题的简化:创建一个没有 VBA 代码的新工作簿并保存为 .xlsm 文件。添加以下代码:

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

   MsgBox "Before Save"

End Sub

选择文件->共享->电子邮件->作为附件发送。请注意,您没有收到消息框;但是,如果您进行任何更改,它们肯定会被保存 =)。

【问题讨论】:

  • 当您使用“作为附件发送”时,您确定它真的被保存了吗?
  • 公平地说,用户可以打开 VBE 并以这种方式取消隐藏选项卡,尽管这是一个有趣的问题。
  • 我刚试过这个,在分享之前或分享期间没有提示保存。如果您进行更改、共享然后关闭,您将丢失所有更改。似乎事件没有触发,因为没有保存发生。我想解决方案是创建一个按钮或他们可以点击的东西来保存然后分享。
  • 虽然共享的工作表会有变化。所以这很有趣。
  • Yes, when the share via email is selected, any changes in the workbook are automatically saved at that point. Excel 当然不会提示用户询问他们是否要保存更改。

标签: excel vba


【解决方案1】:

我对正在发生的事情有一个理论,但没有真正的证据。

当您打开工作簿时,Excel 会在 Temp 目录中创建一个副本。您所做的所有更改都是对临时副本进行的。当您保存时,它会用临时副本替换您打开的文件,从而将您的更改“写入”磁盘。如果您关闭而不保存,它只会删除临时副本。

当您作为附件发送时,未保存的更改会包含在附件中。但此时工作簿并未“保存”,因为如果您尝试关闭它,Excel 会提示您保存更改。

如果当您保存并发送 - 作为附件发送时,Excel 只是附加临时副本并将附件命名为与打开的工作簿相同的名称。事实上,由于您可以附加以前从未保存过的工作簿,因此它必须使用临时副本。

这就是我关于它为什么会这样发生的理论。该怎么办?我不确定。我想我会弄清楚如何劫持功能区后台中的“作为附件发送”功能以强制保存或根本不允许在不保存的情况下发送此工作簿。

如果您决定走这条路,请搜索 Excel Ribbon File Backstage,您应该会找到一些有关如何修改该特定功能的说明。

【讨论】:

  • 我最终采用的解决方案是使用功能区文件后台编辑器来更改作为附件发送功能的行为。我学到了新东西!非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多