2017-10-25 3 views
2

ワークシートには179のワークシートがあります。私は、すべてのワークシートを非表示にするか(Excelのルールに従って表示されないままにする)、またはすべてのワークシートの表示を非表示にしたいと思います。ループなしですべてのExcelシートを表示または非表示にする

現在、私は、(適切な修正は、私たちが隠れているかどうか/非表示解除シートに依存して)次のようになり、コードがあります:179枚のワー​​クシートで

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

を、これを実行するために4-5秒かかり、私はそれがはるかに速く走った方がいいです

私はワークブックに入ると、手動ですべてのシート(1つを除く)を選択し、右クリックして"Hide"を選択すると、すべてのシートが即時に非表示になることがわかります。私はVBAコードでこれを再現することができませんでした。

上記のように、ワークブック内のすべての(ただし1つの)ワークシートを何とかすばやく非表示にし、ワークブックのすべてのワークシートをルーピングなしで非表示にする必要があります。。どんな助けでも大歓迎です!

+1

配列に178のワークシート名をすべて手動で入力しない限り、 'ThisWorkbook.Worksheets(Array(" Sheet1 "、" Sheet2 "など))。Visible = xlSheetHidden'。画面更新を無効にしたり、計算を一時停止したり、イベントを非表示にする前に無効にすることができます。 – PatricK

+0

特にExcelosaurusとpaul bicaにお答えいただき、ありがとうございました! 2つの天才の啓示は、それらを配列に追加して多数のシートを即座に隠すことができ、カスタムビューを使用してワークシートの可視性を設定できることでした。あなたの努力と助けをありがとう、ありがとう!あなたたち最高! – mattbierwirth

+0

私はまた、ブック内のすべてのワークシートを隠したり隠したりすることを含まない、昨夜の問題解決のための別の解決策を思いついたと言いたいと思います。私は、179枚のうち1枚だけが表示されたブックを使用してプロセスを開始できる場合は、表示したいワークシートの名前を表示して、元のシートが名前で表示されないようにすることができますユーザーの目的に現在適用可能です。このようにしてループはありません。私はまだすべての答えを非常に感謝しています! – mattbierwirth

答えて

2

から:

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

が、複数のシートを非表示解除すると、ループに

が必要ですただし、では、カスタムビュー([表示]タブ)を使用すると、はるかに高速な方法があります。

使用し、それを呼び出すには

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 


コード怒鳴るは2つのビュー1 "ShowAllWs"、および2. "HideAllWs" 賢明

パフォーマンスを生成し、これは:

Public Sub UpdateWsVisibility() 

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

End Sub 
+1

素晴らしいアイデア!引数がFalseの場合に表示され続ける単独のワークシートを指定できるのはすばらしいことです。 – Excelosaurus

+0

良い提案!私は答えを更新@Excelosaurus –

0

多分これを試してみてください。

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

としては、画面の更新をオフにすることができ示唆しました。あなたがしたいシートを省略するために、次のIF文を追加します。ここではサブだ、

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

があなたのワークブックが保護されていないと仮定すると(それは私の中で「主」と呼ばれています、あなたが望むものに変更)体系的にループさせることなく可能なことを行います。チャートタイプのシートがサポートされています。

私は、配列を通ってシートを参照することがすべて見える場合にのみ動作することを知ったので、シートを表示する際にはループが必要です。表示するには

HideAllSheetsBut Nothing 

:すべてのワークシート1しかし、このように非表示にする

HideAllSheetsBut Sheet1 

または

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

:あなたはこのようにサブを呼び出すことができます

'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 

すべてのシート。

EDIT ポール・ビカの答えで述べたように、カスタムビューはすぐに複数のワークシートの可視性を反転するための素晴らしい方法です。私の答えでは、ループバックせずにすべてのワークシートを表示するために使用されます。

0

try this ...この文のようなループなし述べたように、あなたができるだけ隠す複数のシートとして、記録したマクロ

Option Explicit 

Sub HideSheets() 

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

End Sub 
関連する問題