【问题标题】:Check for "save changes to 'filename' prompt w/ VBA?检查“使用 VBA 将更改保存到‘文件名’提示?
【发布时间】:2016-04-19 14:03:55
【问题描述】:

首先,这与 saveasfilename 对话框无关。

有没有办法设置一个标志来检查“想要保存对'filename.xsls'的更改?”对话框是否出现在VBA sub 期间?

基本上我有一个宏将一些数据复制到另一个文件中,显示一个 MsgBox 然后关闭文件,Excel 应该提示用户确认文件已保存。但是,我有一个遗留程序有时会锁定该文件,导致提示不出现,看起来文件已保存但实际上没有。要“修复”它,我必须关闭 Excel 和程序的所有实例并重新开始。它不会经常发生,但如果您不注意或在此过程中经验较少的人不知道检查以确保他们被提示保存,您可能会错过它。

我想知道的是,是否有某种方法可以设置某种检查/标志值、1/0、真/假等,以确保对话框出现。如果没有,则警告用户他们需要重新启动 Excel 和其他程序。基本上我试图捕捉一个永远不会发生的错误,所以这可能是无法解决的。

这是我指的对话框:

有时它不会出现,因为文件被锁定并且 VBA 子程序继续运行。

【问题讨论】:

  • 如果 sub 有 Application.DisplayAlerts = False 那么它将禁止任何此类消息框。
  • 我没有任何那种类型的代码。该对话框应该总是出现,除了遗留程序锁定文件的罕见情况外,它确实会出现。代码只是“ExportDestFile.Close”
  • 您是否有原因只是关闭文件而不使用Workbook.SaveWorkbook.SaveAs?或者至少将 true 传递给Workbook.Close?例如,Workbook.Close True 将保存更改然后关闭工作簿。恕我直言,最好尽可能明确。
  • 原因是代码只是将一些数据从主文件复制到导出文件并关闭它,但是执行该过程的人需要直观地查看它是否真的复制了任何东西。我在关闭之前有一些代码计算每行中的行数并在消息框中显示计数,但这一切都无关紧要,因为问题不在于 sub 或 Excel,而是第三方遗留应用程序锁定文件.我认为人们认为这是一个 Excel/代码问题,但我需要做的就是检查是否有办法查看该对话框是否出现。
  • Soulfire 我明白你在说什么,这听起来确实是一种更好的方法,但这并不重要,因为文件已被锁定,无论使用何种方法都无法保存VBA“保存”

标签: vba excel


【解决方案1】:

解决其他问题可能会更好,但由于您没有发布,我们不知道。 无论如何,您想要的一切都在这里描述:https://support.microsoft.com/en-us/kb/213428

你可以这样做:

Sub Auto_Close()
If ThisWorkbook.Saved = False Then
    'ThisWorkbook.Save   this would autosave
     Application.GetSaveAsFilename   'this displays the save as dialog
End If
End Sub

【讨论】:

  • 帖子第一句说的不是GetSaveAsFilename框。
  • 我知道这可能会有所帮助,但这可能并不重要,因为文件不会保存 - 我不确定它将如何处理锁定的文件,但我可以稍后进行试验。我知道你在想什么。
  • @Soulfire 这里的重要部分是If ThisWorkbook.Saved,这正是(我认为)OP 所需要的。
  • 我还会添加Application.DisplayAlerts = True,它可能设置为 false 从而抑制保存警告。
  • D_Bester,它没有设置为 false,99% 的时间都会出现保存警告,但在某些怪异的情况下,旧版应用程序会锁定文件,而 VBA 子程序会继续认为它已保存。也许更好的方法是检查 VBA 子运行前后的保存日期和字节数。
【解决方案2】:

我最终这样做是为了解决这个问题,尽管我怀疑必须通过窗口类检查或其他方式来解决我的问题,但这并不是真正的解决方案。感谢所有花时间参与并提供脑力的人:)

我在 sub 运行前后声明了两个文件大小变量。如果文件大小相等,则会出现一个 msgbox 并指出文件可能未正确写入,或者您正在覆盖现有文件。

Dim ExportFileByte As Long 
Dim ExportBytePostFile As Long

ExportFileByte = FileLen(ExportSourcePath)

'(子程序在此处运行并将一些数据的副本导出到 .XLS 文件)

ExportBytePostFile = FileLen(ExportSourcePath)
If ExportFileByte = ExportBytePostFile Then MsgBox ("Error: File may have not have saved, or file is being overwritten without changes (OK)")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多