2017-10-25 1 views
2

Ich habe eine Arbeitsmappe mit 179 Arbeitsblättern. Ich möchte entweder alle Arbeitsblätter ausblenden (eins nach den Regeln von Excel einblenden) oder alle Arbeitsblätter einblenden.Ausblenden oder Einblenden aller Excel-Tabellen ohne Schleife

Zur Zeit habe ich Code, der etwa so aussieht (mit den entsprechenden Modifikationen je nachdem, ob wir verstecken/sichtbar machen Blätter):

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

Mit 179 Arbeitsblätter, nimmt diese 4-5 Sekunden zu laufen, und Ich würde es bevorzugen, es lief viel schneller.

Ich weiß, dass, wenn ich in eine Arbeitsmappe gehe, manuell alle Blätter (mit Ausnahme von einem) auswählen, dann mit der rechten Maustaste und wählen "Hide", alle Blätter werden sofort ausgeblendet. Ich konnte dies nicht in VBA-Code reproduzieren.

Wie oben erwähnt, muss ich schnell alle (außer einer) Arbeitsblätter in einer Arbeitsmappe ausblenden und alle Arbeitsblätter in einer Arbeitsmappe ohne Schleife anzeigen. Jede Hilfe wird sehr geschätzt!

+1

Wenn Sie nicht alle 178 Worksheet-Namen manuell im Array ablegen möchten: 'ThisWorkbook.Worksheets (Array (" Sheet1 "," Sheet2 ", usw.)) Visible = xlSheetHidden'. Sie möchten möglicherweise das Bildschirmupdate deaktivieren, die Berechnung pausieren, Ereignisse deaktivieren, bevor Sie es auf "Versteckt" setzen. – PatricK

+0

Vielen Dank an alle, die geantwortet haben, besonders an Excelosaurus und Paul Bica! Die zwei genialen Enthüllungen waren, dass Sie viele Blätter sofort ausblenden können, indem Sie sie einem Array hinzufügen, und benutzerdefinierte Ansichten verwenden, um die Sichtbarkeit von Arbeitsblättern festzulegen. Vielen Dank für Ihre harte Arbeit und Hilfe! Ihr Jungs rockt! – mattbierwirth

+0

Ich wollte auch erwähnen, dass ich letzte Nacht eine alternative Lösung für mein Problem gefunden habe, die nicht das Ausblenden aller Arbeitsblätter in einer Arbeitsmappe beinhaltet. Ich erkannte, dass, wenn ich den Prozess mit einer Arbeitsmappe starten könnte, nur 1 der 179 Blätter sichtbar wäre, dann konnte ich die Arbeitsblätter, die ich zeigen wollte, mit Namen aufzeigen und dann das Originalblatt mit dem Namen verstecken, wenn es nicht war derzeit für das Ziel des Benutzers anwendbar. Auf diese Weise gibt es keine Schleife. Trotzdem schätze ich alle Antworten immer noch sehr! – mattbierwirth

Antwort

2

Wie erwähnt Makro aufgezeichnet, können Sie nur ausblenden mehrere Blätter ohne eine Schleife, wie in dieser Aussage:

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

aber sichtbar machen mehrere Blätter erfordert die Schleife

Jedoch ist eine viel schnellere Methode dafür verfügbar, die benutzerdefinierte Ansichten (in Registerkarte Ansicht)

verwendet

Der Code unten erzeugt 2 Ansichten 1 "ShowAllWs" und 2. "HideAllWs"

Performance weise:

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 

zu nennen, es zu verwenden dies:

Public Sub UpdateWsVisibility() 

    SetWsVisibility 0, 5 'or 0 to hide them (or True/False respectively) 

End Sub 
+1

Großartige Idee! Es wäre cool, das einzige Arbeitsblatt zu bestimmen, das sichtbar bleibt, wenn das Argument falsch ist. – Excelosaurus

+0

Guter Vorschlag! Ich habe die Antwort @Excelosaurus aktualisiert –

0

Vielleicht versuchen:

Application.ScreenUpdating = False 

For Each Sht in Wb.Worksheets 
    If Sht.Visible = xlSheetHidden Then 
     Sht.Visible = xlSheetVisible 
    End If 
Next Sht 

Application.ScreenUpdating = True 
0

Wie vorgeschlagen, dass Sie die Bildschirmaktualisierung ausschalten könnte. Fügen Sie die IF-Anweisung unterhalb des Blattes wegzulassen Sie wollen (es ‚Main‘ in Mine genannt wird, ändern, dies zu, was Sie wollen)

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

2

Vorausgesetzt, dass Ihre Arbeitsmappe nicht geschützt ist, ist hier eine Unter das wird tun, was möglich ist, ohne systematisch zu schleifen. Diagrammblätter werden unterstützt.

Ich habe gerade gelernt, dass die Bezugnahme auf Blätter durch ein Array funktioniert nur, wenn sie alle sichtbar sind, daher ist eine Schleife notwendig, wenn Blätter sichtbar gemacht werden.

'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 

Sie können die Unter wie folgt aufrufen:

HideAllSheetsBut Sheet1 

oder

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

alle bis auf ein Arbeitsblatt zu verbergen, und wie folgt aus:

HideAllSheetsBut Nothing 

zu zeigen alle Blätter.

EDIT Wie in paul bica Antwort erwähnt, ist eine benutzerdefinierte Ansicht eine gute Möglichkeit, schnell die Sichtbarkeit von mehreren Arbeitsblatt zu kippen. In meiner Antwort würde es verwendet werden, um alle Arbeitsblätter anzuzeigen, ohne sie durchlaufen zu müssen.

0

versuchen Sie dies ...von einem

Option Explicit 

Sub HideSheets() 

    Worksheets.Select 
    Sheets("Main").Activate 
    ActiveWindow.SelectedSheets.Visible = False 

End Sub 
Verwandte Themen