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
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
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
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