如何提高Excel的工作streambeforeClose()事件隐藏所有工作表为xlVeryHidden?

我有一个沉重的基于VBA的工作簿,我打算将所有工作表closures,而不是“确保启用macros”工作表xlVeryHidden。 然后,我将在Workbook_Open()事件中添加代码以取消隐藏它们。

这是为了防止在没有正确的事件触发的情况下发生所有对象的修改。

这里是我使用的代码(注意有一个镜像的“打开”types的事件来取消隐藏):

 Private Sub Workbook_BeforeClose(Cancel As Boolean) hideAllContentOnWorkbookClose End Sub Private Sub hideAllContentOnWorkbookClose() Application.ScreenUpdating = False Dim sh As Worksheet For Each sh In Worksheets 'note: this function ensures I only do this to the right worksheets, not relevant code here If checkIfWorksheetShouldBeHidden(sh.CodeName) Then sh.Visible = xlVeryHidden Next sh Application.ScreenUpdating = True End Sub 

然而这是一个尴尬的情况。 由于此事件在Close事件时触发,因此会修改工作簿,然后触发“您要保存吗?” 提示。

不幸的是,如果用户按下“否​​”,那么工作簿将closures,工作表保持不被隐藏。 如果工作簿随后在禁用macros的情况下打开,则工作表将被取消隐藏。 请注意此问题仅在用户打开后保存工作簿存在。

我希望有一个更好的替代方法,而不是简单地在BeforeClose方法中强制进行无声保存。 我想也可以拦截“保存”和“另存为”事件并取消它们,要求用户使用我可以添加的button进行保存(我可以在工作簿中添加“保存”和“closures”button并禁用内置的保存/closures事件)。

我并不是这两条路上的粉丝。 什么是更好的方法来做到这一点?

从这个乔的回答中无情地窃取了这个概念甚至是一些代码

像这样的东西将符合您的工作簿代码中的账单:

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim curSheet As Worksheet, targetSheet As Worksheet Set curSheet = Me.activeSheet Set targetSheet = ThisWorkbook.Sheets("nameOfSheetYouWantToDisplay") If Not curSheet Is targetSheet Then If Module1.PreviousSheet Is Nothing Then Set Module1.PreviousSheet = curSheet End If targetSheet.Activate End If hideAllContentOnWorkbookClose Application.OnTime Now, "ActivatePreviousSheet" End Sub 

然后在你的模块中:

 Public Sub ActivatePreviousSheet() If Not PreviousSheet Is Nothing Then PreviousSheet.Activate Set PreviousSheet = Nothing End If MethodCallTODisplaySheets() 'For Each ws In ThisWorkbook.Sheets ' ws.Visible = True 'Next End Sub 

就像一个FYI,您的hideAllSheets方法的替代版本可能是我喜欢的,因为它不取决于checkIfWorksheetShouldBeHidden

 Sub HideAllSheetsExcept(visibleSheet as Worksheet) For Each ws In ThisWorkbook.Sheets If Not ws Is visibleSheet Then ws.Visible = xlVeryHidden End If Next End Sub 

这可以在前面的代码示例中被调用为HideAllSheetsExcept targetSheet

我希望有一个更好的替代方法,而不是简单地在BeforeClose方法中强制进行无声保存。

我没有看到任何问题与Silent Save 。 顺便说一句,而不是Workbook_BeforeClose事件,您可以使用hideAllContentOnWorkbookClose()来代替。 并不重要。

 Private Sub Workbook_BeforeClose(Cancel As Boolean) hideAllContentOnWorkbookClose 'ThisWorkbook.Saved = True 'Additional Precaution? End Sub Private Sub hideAllContentOnWorkbookClose() ' '~~> Rest of your code ' ThisWorkbook.Save End Sub