如何改进Excel上的工作流beforeClose()事件将所有工作表隐藏为xlVeryHidden?

时间:2014-02-07 18:49:05

标签: excel vba excel-vba

我有一个基于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”作为按钮并禁用内置的保存/关闭事件。)

我不是任何一条路的粉丝。有什么更好的方法呢?

2 个答案:

答案 0 :(得分:1)

Joe的回答here

中无情地窃取概念甚至一些代码

这样的内容适合您的工作簿代码:

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