RefreshAll BeforeSave



我使用功率查询将几个表组合在一起,并将一些信息输出到另一个表,所有这些都在同一个工作簿中。我想确保在保存文件时输出表始终是最新的,并且不想依赖于使用"刷新全部"按钮的ppl。理想情况下,当保存文件时,我会更新查询。对于每个查询,我都在查询属性中禁用了"启用后台刷新"选项。然后,我将以下vba代码添加到ThisWorkbook:

Option Explicit
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
ThisWorkbook.RefreshAll
End Sub

这会导致在保存文件之前更新查询。但是,如果用户单击保存按钮(导致查询更新&文件已保存),然后关闭文件,他们被提示再次保存文件,好像已经编辑了什么…我尝试在刷新后向BeforeSave方法添加等待命令,但发生相同的行为。我们当然可以再次保存它或者不保存就关闭它(因为它是在我们第一次点击保存按钮时保存的),但是这两种方法都不理想(文件在网络驱动器上,所以即使它只有几个MB,它也需要几秒钟才能保存,并且不喜欢不保存就关闭)。

有什么技巧可以阻止Excel要求我们保存刚刚保存的工作簿吗?


编辑

从评论和建议的答案来看,BeforeSave似乎是不一致的。我确实希望允许用户能够在不保存的情况下关闭工作簿,因此希望避免使用BeforeClose(例如,用户对工作簿进行了大量更改,并希望撤消一切)。通过手动设置工作簿保存状态为true在Aftersave似乎已经解决了这个问题;至少在我目前的测试中(尽管它应该已经是真的,因为它刚刚保存?)

Option Explicit
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
If Success Then
ThisWorkbook.Saved = True
End If
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
ThisWorkbook.RefreshAll
End Sub

Workbook.RefreshAll

  • 似乎BeforeSave并不总是像预期的那样工作,所以你的反馈是最受欢迎的。
Option Explicit
Private DoNotBeforeSave As Boolean
Private Sub Workbook_BeforeClose(Cancel As Boolean)
With Me
If Not .Saved Then
.RefreshAll
DoNotBeforeSave = True
.Save
Debug.Print "Just refreshed and saved via 'BeforeClose'. Closing!"
Else
Debug.Print "No action taken via 'BeforeClose'. Closing!"
End If
End With
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Not DoNotBeforeSave Then
With Me
If Not .Saved Then
.RefreshAll
Debug.Print "Just refreshed and saved via 'BeforeSave'!"
Else
Cancel = True
Debug.Print "No action taken via 'BeforeSave'!"
End If
End With
End If
End Sub

最新更新