我有一个基于VBA的工作簿,我将在关闭时制作除“确保启用宏”工作表xlVeryHidden之外的所有工作表。然后,我将在Workbook_Open()
事件中添加代码以取消隐藏它们。
这是为了防止在没有触发正确事件等情况下发生任何对象的所有修改。
这是我正在使用的代码(请注意,有一个镜像“on open”类型事件可以取消隐藏它们):
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
事件上触发,它会修改工作簿,然后触发“您要保存吗?”提示。
不幸的是,如果用户按下“否”,则工作簿将关闭,而工作簿将保持未被隐藏状态。如果在禁用宏的情况下打开工作簿,则将取消隐藏工作表。请注意,仅当用户在打开工作簿后保存工作簿时,才存在此问题。
我希望有一个更好的选择,而不仅仅是在BeforeClose
方法中强制进行静默保存。我可以想象也可以截取“on save”和“on save as”事件并取消它们,要求用户使用我可以添加的按钮进行保存(我可以在工作簿中添加“Save”和“Close”作为按钮并禁用内置的保存/关闭事件。)
我不是任何一条路的粉丝。有什么更好的方法呢?
答案 0 :(得分:1)
这样的内容适合您的工作簿代码:
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
一样调用。
答案 1 :(得分:1)
我希望有一个更好的选择,而不仅仅是在BeforeClose方法中强制进行静默保存。
我认为Silent Save
没有任何问题。 BTW代替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