2011-09-30 378 views

回答

8

您可以循環檢查worksheet.visible和range.hidden屬性的工作表,列和行。下面是一些快速和骯髒的代碼,將輸出任何隱藏的元素到即時窗口。

Sub FindHidden() 
    Dim wks As Worksheet 
    Dim rng As Range 

    For Each wks In ThisWorkbook.Worksheets 
     If wks.Visible = xlSheetHidden Then 
      Debug.Print "Worksheet: " & wks.Name & " is hidden." 
     ElseIf wks.Visible = xlSheetVeryHidden Then 
      Debug.Print "Worksheet: " & wks.Name & " is very hidden." 
     End If 

     For Each rng In wks.UsedRange.Rows 
      If rng.Hidden = True Then 
       Debug.Print "Worksheet: " & wks.Name & " Hidden Row: " & rng.Row 
      End If 
     Next rng 

     For Each rng In wks.UsedRange.Columns 
      If rng.Hidden = True Then 
       Debug.Print "Worksheet: " & wks.Name & " Hidden Column: " & Left(Replace(rng.Address, "$", ""), 1) 
      End If 
     Next rng 
    Next wks 
End Sub 
+0

+1應該滿足您的需求 – brettdj

+0

感謝 - 這就是我一直在尋找。 – smfoote

1

另一種選擇是我的(免費)Mappit!插件available here其中突出上測試的每個片

  1. 隱藏區域(見下文粉色陰影區域),
  2. 並且還產生互連的片概要列出工作表是如何與分立式連接(無論它們是否是可見,隱藏或非常隱藏)

您的問題促使我查看更新工作表鏈接輸出以顏色突出顯示哪些工作表已隱藏或非常隱藏。

[更新:MappitV1.11更新如下,提供表單可見性信息。現在進一步更新MappitV1.11a爲被隱藏的空表沒有被標記在彙總表]

enter image description here enter image description here enter image description here

0

這裏有一個方法,非常類似於Banjoe的,這將返回計算有多少隱藏的圖紙,列和行(假設您不需要關於哪些行的信息以及只需要報告)。

  • 注意,使用的行/列中的「UsedRange」意味着計數將不包括行不包含任何數據(但宏會更快結果)/列。

下面是代碼:

Sub HiddenReport() 

Application.ScreenUpdating = False 
Dim wks As Worksheet 
Dim rng As Range 
Dim sCount As Long, rCount As Long, cCount As Long 

For Each wks In ThisWorkbook.Worksheets 
    If wks.Visible = xlSheetHidden Then sCount = sCount + 1 
    If wks.Visible = xlSheetVeryHidden Then sCount = sCount + 1 

    For Each rng In wks.Rows ' or wks.UsedRange.Rows 
     If rng.Hidden = True Then rCount = rCount + 1 
    Next 

    For Each rng In wks.Columns ' or wks.UsedRange.Columns 
     If rng.Hidden = True Then cCount = cCount + 1 
    Next 
Next 

Application.ScreenUpdating = True 
MsgBox sCount & " hidden sheets found." & vbLf & _ 
     rCount & " hidden rows found." & vbLf & _ 
     cCount & " hidden columns found." 

End Sub 

請注意,您還可以使用「檢查文檔」功能在Excel中看到,如果一個文檔隱藏的工作表/行/列。

2

我將下面的過程保存在我的Personal.xls文件中,並在快速訪問工具欄上有一個按鈕來運行它。它在彈出式對話框中顯示所有隱藏的工作表和非常隱藏的工作表,還可讓您取消隱藏單個工作表或全部隱藏,全部隱藏或全部隱藏。

這不顯示隱藏的單元格/行/列,但對於查找和取消隱藏工作表非常有用。我使用上面提到的Dave的Mappit Addin進行更詳細的分析。

代碼如下:

Sub UnHideStuff() 

'---------------------------------------------------------------------------- 
' UnHideStuff Macro 
' Written by ProdOps 
' 13-Feb-2010 
' 
' Provides an input dialog box that displays the names of all Hidden and all 
' VeryHidden worksheets in the workbook and allows the user to enter the 
' name of the worksheet they want to unhide. 
' * will unhide all Veryhidden sheets 
' ** will unhide all Hidden sheets. 
' *** will unhide all worksheets in the workbook 
' 
'---------------------------------------------------------------------------- 

Dim Message As String 
Dim Title As String 
Dim Default As String 
Dim myValue As String 
Dim myList As String 
Dim Sheetnum As Long 

'Build a list of VeryHidden Sheets 
myList = "'INVISIBLE WORKSHEET NAMES(*)':" 
For Sheetnum = 1 To Sheets.Count 
    If Sheets(Sheetnum).Visible = 2 Then 
    myList = myList & vbCrLf & " " & Sheets(Sheetnum).Name 
    End If 
Next Sheetnum 
If myList = "'INVISIBLE WORKSHEET NAMES(*)':" Then 
    myList = myList & vbCrLf & " No Invisible Sheets in This Workbook" 
End If 

'Build a list of Hidden Sheets 
myList = myList & vbCrLf & vbCrLf & "'HIDDEN WORKSHEET NAMES(**)':" 
For Sheetnum = 1 To Sheets.Count 
    If Sheets(Sheetnum).Visible = 0 Then 
    myList = myList & vbCrLf & " " & Sheets(Sheetnum).Name 
    End If 
Next Sheetnum 
If Right(myList, 11) = "NAMES(**)':" Then 
    myList = myList & vbCrLf & " No Hidden Sheets in This Workbook" 
End If 

'Build the Textbox Message & Title 
Message = "Enter the 'Name' of the WorkSheet to Unhide" & vbCrLf 
Message = Message & "Or * - All Invisible, ** - All Hidden, *** - All" & vbCrLf & vbCrLf 
Message = Message & myList 
Title = "Unhide Hidden Worksheets" 
Default = "" 

'Display the Message Box and retrive the user's input 
myValue = InputBox(Message, Title, Default) 

'Test the value entered by the user 
If myValue = "" Then Exit Sub 'User pressed CANCEL 

If myValue = "*" Then 'User wants all the VeryHidden sheets displayed 
    For Sheetnum = 1 To Sheets.Count 
    If Sheets(Sheetnum).Visible = 2 Then Sheets(Sheetnum).Visible = True 
    Next Sheetnum 
    GoTo NormalExit 
End If 

If myValue = "**" Then 'User wants all the Normal Hidden sheets displayed 
    For Sheetnum = 1 To Sheets.Count 
    If Sheets(Sheetnum).Visible = 0 Then Sheets(Sheetnum).Visible = True 
    Next Sheetnum 
    GoTo NormalExit 
End If 

If myValue = "***" Then 'User wants all worksheets displayed 
    For Sheetnum = 1 To Sheets.Count 
    Sheets(Sheetnum).Visible = True 
    Next Sheetnum 
    GoTo NormalExit 
End If 

On Error GoTo ErrorTrap 
Sheets(myValue).Visible = xlSheetVisible 
Sheets(myValue).Select 
Range("A1").Select 

NormalExit: 
Exit Sub 

ErrorTrap: 
If Err = 9 Then 
    MsgBox "Either the Worksheet Does Not Exist or " & vbCrLf & "the Worksheet Name was Misspelled", vbCritical, "Worksheet Not Found" 
    Err.Clear 
    Call UnHideStuff 
End If 

End Sub 
+0

嘿傑瑞! - 歡迎:) – brettdj