隐藏或取消隐藏所有Excel表格,而无需循环

我有179个工作表的工作簿。 我想隐藏所有的工作表(根据Excel的规则不要隐藏一个工作表),或者取消隐藏所有的工作表。

目前我有这样的代码(根据我们是否隐藏/取消隐藏工作表进行适当的修改):

For Each Sht in Wb.Worksheets Sht.Visible = xlSheetVisible Next Sht 

有179个工作表,这需要4-5秒的时间来运行,我宁愿它运行得更快。

我知道,如果我进入工作簿,手动select所有工作表(除了一个),然后右键单击并select"Hide" ,所有工作表将立即隐藏。 我一直无法在VBA代码中重现这一点。

如上所述,我需要以某种方式快速隐藏工作簿中的所有(但一个)工作表,并取消隐藏工作簿中的所有工作表而不循环 。 任何帮助深表感谢!

如上所述,只能隐藏多个工作表,而不需要循环,就像在这个语句中一样:

 Worksheets(Array(1,2,3,4,5,6,7,8,9,10,11,...,200)).Visible = True 

但是取消隐藏多张纸需要循环

但是 ,有一个更快的方法可用于此,使用自定义视图(在视图选项卡)


下面的代码生成2个视图1.“ShowAllWs”和2.“HideAllWs”

性能明智:

 For 201 Worksheets Loop HideAll - Time: 0.039 sec (initial setup - sets array, except one Ws in one operation) Loop ShowAll - Time: 0.648 sec (initial setup - unhides all using a loop) View ShowAll - Time: 0.023 sec (consecutive runs - no loop) View HideAll - Time: 0.023 sec (consecutive runs - no loop) 

 Option Explicit Public Sub SetWsVisibility(Optional ByVal vis As Boolean = False, _ Optional ByVal visibleWs As Long = 0) Static vSet As Boolean, hSet As Boolean, wsCount As Long, lastV As Long, i As Long With ThisWorkbook wsCount = .Worksheets.Count - 1 'if visibleWs is 0 last ws is visible, or use any other valid sheet index visibleWs = IIf(visibleWs < 1 Or visibleWs > wsCount, wsCount + 1, visibleWs) If wsCount <> .Worksheets.Count - 1 Or visibleWs <> lastV Then vSet = False hSet = False Else If vSet And vis Then .CustomViews("ShowAllWs").Show: Exit Sub If hSet And Not vis Then .CustomViews("HideAllWs").Show: Exit Sub End If Application.ScreenUpdating = False If vis Then For i = 1 To wsCount + 1 With .Worksheets(i) If Not .Visible Then .Visible = vis End With Next .Worksheets(1).Activate .CustomViews.Add ViewName:="ShowAllWs" 'Save View (one-time operation) vSet = True Else If visibleWs <> lastV Then For i = 1 To wsCount + 1 With .Worksheets(i) If Not .Visible Then .Visible = 1 End With Next End If Dim arr() As Variant, j As Long ReDim arr(1 To wsCount) j = 1 For i = 1 To wsCount + 1 If i <> visibleWs Then arr(j) = i Else j = j - 1 j = j + 1 Next .Worksheets(arr).Visible = vis .CustomViews.Add ViewName:="HideAllWs" 'Save View (one-time operation) hSet = True lastV = visibleWs End If Application.ScreenUpdating = True End With End Sub 

要调用它使用这个:

 Public Sub UpdateWsVisibility() SetWsVisibility 0, 5 'or 0 to hide them (or True / False respectively) End Sub 

假设你的工作簿没有被保护,这里是一个可以做系统循环的子工作。 支持图表式表单。

我刚刚了解到,通过数组引用表单只在全部可见的情况下才起作用,因此在使表单可见时需要循环。

 'Hides all sheets in the workbook containing pExceptThisSheet, except pExceptThisSheet. 'Note: pExceptThisSheet is declared as an Object so as to support both the Worksheet and Chart types. Public Sub HideAllSheetsBut(ByVal pExceptThisSheet As Object) On Error GoTo errHandler Dim vntAllSheetsBut() As Variant Dim oSht As Object Dim lIndex As Long Dim bScreenUpdating As Boolean bScreenUpdating = Application.ScreenUpdating Application.ScreenUpdating = False 'Show all sheets. 'Note: for some reason, an array can't be used here; must loop. For Each oSht In pExceptThisSheet.Parent.Sheets If oSht.Visible <> xlSheetVisible Then oSht.Visible = xlSheetVisible End If Next If Not pExceptThisSheet Is Nothing Then If pExceptThisSheet.Parent.Sheets.Count > 1 Then 'Hide all sheets but the specified one. ReDim vntAllSheetsBut(0 To pExceptThisSheet.Parent.Sheets.Count - 2) As Variant lIndex = 0 For Each oSht In pExceptThisSheet.Parent.Sheets If Not oSht Is pExceptThisSheet Then vntAllSheetsBut(lIndex) = oSht.Name lIndex = lIndex + 1 End If Next 'Note: for some reason, this only works for hiding, and if all sheets in vntAllSheetsBut are visible. 'A possible explanation would be that, behind the scene, Excel attempts to select the sheets, and fails when it encounters hidden ones. pExceptThisSheet.Parent.Sheets(vntAllSheetsBut).Visible = xlSheetHidden End If End If Cleanup: On Error Resume Next Set oSht = Nothing Application.ScreenUpdating = bScreenUpdating Exit Sub errHandler: MsgBox Err.Description, vbExclamation + vbOKOnly, "Error" Resume Cleanup End Sub 

你可以这样调用sub:

 HideAllSheetsBut Sheet1 

要么

 HideAllSheetsBut Application.Workbooks("MyWorkbook.xlsx").Worksheets("MyWorksheet") 

隐藏除一张工作表之外的所有内容,如下所示:

 HideAllSheetsBut Nothing 

显示所有表单。

编辑如在保罗·比卡的回答中所提到的,自定义视图是快速翻转几个工作表的可见性的好方法。 在我的答案中,它将用于显示所有工作表,而不必循环它们。

也许试试这个:

 Application.ScreenUpdating = False For Each Sht in Wb.Worksheets If Sht.Visible = xlSheetHidden Then Sht.Visible = xlSheetVisible End If Next Sht Application.ScreenUpdating = True 

如build议您可以closures屏幕更新。 添加下面的IF语句来省略你想要的表格(在我的名字中叫'Main',把它改成你想要的)

 Sub HideSheets() Dim sht As Worksheet Application.ScreenUpdating = False For Each sht In ActiveWorkbook.Worksheets If sht.Name <> "Main" Then sht.Visible = False Next sht Application.ScreenUpdating = True End Sub 

Caleeco

试试这个…从一个logging的macros

 Option Explicit Sub HideSheets() Worksheets.Select Sheets("Main").Activate ActiveWindow.SelectedSheets.Visible = False End Sub