如何提高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