在VBA中find隐藏的表单(和隐藏的单元格)

有没有办法确定Excel工作簿是否使用VBA隐藏工作表和/或隐藏的单元格? 谢谢!

您可以循环检查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 

我将下面的过程保存在我的Personal.xls文件中,并在快速访问工具栏上有一个button来运行它。 它在popup对话框中显示所有隐藏的表单和非常隐藏的表单,还可以让您取消隐藏单个表单或全部隐藏,全部非常隐藏或两者兼而有之。

这不显示隐藏的单元格/行/列,但已经非常有用的查找和取消隐藏工作表。 我使用上面提到的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 

另一种select是我的(免费)Mappit! 插件可在这里突出显示

  1. testing每张纸上的隐藏区域(见粉色阴影区域)
  2. 并且还会生成一个相互关联的工作表摘要,其中列出了工作表与离散公式之间的关系(不pipe它们是否可见,隐藏或非常隐蔽)

您的问题促使我查看更新工作表链接输出以颜色突出显示哪些工作表已隐藏或非常隐藏。

[更新:MappitV1.11更新如下,提供表单可见性信息。 现在进一步更新到MappitV1.11a,因为隐藏的空白表格没有被标记在汇总表上]

在这里输入图像说明在这里输入图像说明在这里输入图像说明

下面是一个和Banjoe非常相似的方法,它将返回有多less隐藏的图纸,列和行的计数(假设您不需要关于哪些行的信息以及只需要报告)。

  • 请注意,对行/列使用“UsedRange”意味着计数将不包含不包含任何数据的行/列(但macros将因此更快)。

这里是代码:

 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中的“检查文档”function来查看文档是否有隐藏的工作表/行/列。