VBA:创建一个隐藏/显示工作表的过滤器

时间:2017-04-27 09:24:27

标签: excel vba excel-vba filter

我不是那么“聪明的代码”,所以当我凝视着下面的混乱时,我非常抱歉伤害了你经验丰富的眼睛:)

目标:在主工作表中创建一个简单的过滤器,仅显示符合单元格中特定值的工作表。

主表单称为“MEGAFILTER”,其他表单称为“1”,“2”,“3”等。(无引号)

到目前为止我是如何工作的(再次,对不起!):

Sub MEGAFILTER()
'
' MEGAFILTER Macro
'

'
Sheets("MEGAFILTER").Select
Range("A1").Select
Dim Filter As String
Filter = ActiveCell.Value

'This makes sure all sheets are visible (for subsequent filtering)
For Each ws In ActiveWorkbook.Worksheets
ws.Visible = xlSheetVisible
Next ws

'This is where the real mess kicks in
Sheets("1").Select
If [M2] = Filter Then
Sheets("1").Visible = True
Else
Sheets("1").Visible = False
End If
Sheets("2").Select
If [M2] = Filter Then
Sheets("2").Visible = True
Else
Sheets("2").Visible = False
End If
Sheets("MEGAFILTER").Select
Sheets("3").Select
If [M2] = Filter Then
Sheets("3").Visible = True
Else
Sheets("3").Visible = False
End If
Sheets("MEGAFILTER").Select
'ETC...
End Sub

这样覆盖100张。如果存在70张纸,当然在尝试选择71时会崩溃。“MEGAFILTER”选择确保它在崩溃之前总是落在主纸张上。我意识到这很糟糕,但我没有成功地做出正确的方式:(

以下是我认为它应该是:

Sub MEGAFILTER()
'
' MEGAFILTER Macro
'

'
Sheets("MEGAFILTER").Select
Range("A1").Select
Dim Filter As String
Dim ws As Worksheet
Filter = ActiveCell.Value

For Each ws In ActiveWorkbook.Worksheets
ws.Visible = xlSheetVisible
Next ws

For Each ws In ActiveWorkbook.Worksheets
If ws.Name <> "MEGAFILTER" Then
        If [M2] = Filter Then
        ws.Visible = True
        Else
        ws.Visible = False
        End If
        Next ws
End If

End Sub

但是我得到了一个“Next without For”错误。目的是它跳过主表(它不应该隐藏那个)并将单元M2中的值与主表上单元格A1中的值进行比较。如果值相同,则应显示工作表,否则应显示工作表。然后它应该移动到下一张纸,直到检查完所有。

信不信由你,在我发布这个问题之前,我花了几个小时研究了各种各样的组合。我觉得自己像个白痴......

我希望有人可以纠正我的“创造力”。谢谢你的阅读!

提米

2 个答案:

答案 0 :(得分:0)

这应该有效:

Public Sub MegaFilter()

    Dim ws As Worksheet

    For Each ws In ThisWorkbook.Worksheets
        If ws.Name <> "Mega Filter" Then
            ws.Visible = ws.Cells(2, 13) = ThisWorkbook.Worksheets("Mega Filter").Cells(1, 1)
        End If
    Next ws

End Sub   

它检查每个工作表上的单元格M2Cells(2,13))是否等于Mega Filter上的单元格A1。

在Excel VBA TRUE = -1FALSE = 0中。 xlSheetHidden的数值为0xlSheetVisible-1

因此,如果M2 = A1,则返回TRUE(-1)并使工作表可见,否则返回FALSE(0)并隐藏工作表。

答案 1 :(得分:0)

Sub HideSheet()

Dim sheet As Worksheet

Set sheet = ActiveSheet

    ' this hides the sheet but users will be able 
    ' to unhide it using the Excel UI
      sheet.Visible = xlSheetHidden

    ' this hides the sheet so that it can only be made visible using VBA
   sheet.Visible = xlSheetVeryHidden

 End Sub