使用多重标准添加条件以取消隐藏工作表中的列

时间:2017-03-17 08:13:36

标签: excel excel-vba vba

再请一点帮助。 下面的代码用于隐藏与B5不匹配的列。 现在我的问题是,我想取消隐藏匹配值的列 同时来自B6和B7。 命令表B列5,6,7中的参考值。 让B5是MARCH 让B6是1月sample picture 让B7是2月份 工作表名称(GRA_NewGen CI)请注意,每行/每列的所有数据都在此处。 从工作表名称到匹配B5,B6,B7的范围是C列第4行,直到带有值的行的列结束。

以下是'代码

'Sub GRA_NewGen_CI()
Dim cell As Range
Application.ScreenUpdating = False
With Sheets("GRA_New Gen CI")
  For Each cell In .Range("C4", .Range("XFD4").End(xlToLeft))
     cell.EntireColumn.Hidden = cell.Value <> Sheets("Command").Range("B5") And Not IsEmpty(cell)
  Next cell
End With
Application.ScreenUpdating = True    
'End Sub

2 个答案:

答案 0 :(得分:0)

如果您想要的是隐藏所有标记为&#34; JANUARY&#34;,&#34; FEBRUARY&#34;等等,通过使用Excel的过滤功能,您将获得更大的灵活性和更快的动作。了解有关过滤器的here

答案 1 :(得分:0)

这给了我很多的机会。所有这些隐藏的列都很棘手。但现在轮到你了。请按照说明进行操作。

在你的命令&#39;单击表,找到一个空白列并输入&#34;显示全部&#34;在下面的单元格中的一个单元格和此函数中:

="Show "& B5

我希望你能在B5:B16中度过所有12个月,但如果你只有1月到3月,或者喜欢动态改变内容,那也没关系。只要在B列中有相关数据(月份名称或列标题),就可以复制公式。给我刚刚描述的范围命名。我给它起了名字&#34; DropdownList&#34;。确保命名范围具有&#39;范围&#39; &#34;工作簿&#34; (意思是,它可以从工作簿的所有部分中看到)。

在位置A4的GRA_New工作表上放置一个命令按钮。也许你已经在其他地方有一个按钮。在那种情况下,我会要求你一起玩,然后再制作另一个。稍后您可以将此按钮移动到任何其他位置,包括另一个工作表,但不能移动到可能隐藏的列中。此命令按钮将是“验证”下拉列表。输入

"Allow" = List and 
"Source" =DropdownList (including the = mark. 

您现在应该有一个验证下拉菜单,显示&#34;全部显示&#34;在第一个位置,&#34;显示1月&#34;在第二,更多&#34;显示......&#34;取决于命名范围DropdownList的大小。确保在&#34;显示1月和#34;之间有一个空格。和&#34;显示全部&#34;,不是更多而不是更少,每行由2个单词组成,第二个单词是相关的。

现在将以下过程添加到&#34; GR_New ...&#34;的代码表中。片材。

Private Sub Worksheet_Change(ByVal Target As Range)
    '17 Mar 2017
    If Target.Address = Range("A4").Address Then
        SetDisplay_GRA_NewGen Split(Target.Value)(1)
    End If
End Sub

在此程序中,请将参考更改为&#34; A4&#34;到您有验证下拉列表的单元格。

下一个程序进入正常的代码模块。默认情况下,它的名称是&#34; Module1&#34;,但你可以给它任何你喜欢的名字。

Sub SetDisplay_GRA_NewGen(ByVal Cmd As String)
    ' 17 Mar 2017

    Dim Spike As String
    Dim CountHidden As Integer
    Dim FirstColumn As Long, LastColumn As Long
    Dim CapRow As Long, Cap As String
    Dim C As Long

    CapRow = 4
    FirstColumn = 3                     ' = column C

    With Worksheets("GRA_New_Gen_CI")
        LastColumn = .UsedRange.Columns.Count
        If StrComp(Cmd, "all", vbTextCompare) Then
            With Range("DropdownList")
                For C = 2 To .Rows.Count
                    Cap = Split(.Cells(C).Value)(1)
                    Spike = Spike & "|" & Cap
                Next C
            End With

            For C = FirstColumn To LastColumn           ' count hidden columns
                Cap = .Cells(CapRow, C).Value
                If .Columns(C).Hidden Then
                    If .Columns(C).Hidden Or InStr(1, Spike, Cap, vbTextCompare) = 0 Then
                        ' if Cap can't be selected it is counted as not hidden
                        CountHidden = CountHidden + 1
                    End If
                End If
            Next C

            Application.ScreenUpdating = False
            If CountHidden = 0 Then
                ' hide all except the specified column
                .Range(.Columns(FirstColumn), .Columns(LastColumn)).Hidden = True
            End If

            For C = FirstColumn To LastColumn
                With .Columns(C)
                    If .Hidden Then
                        Cap = .Cells(CapRow).Value
                        If StrComp(Cap, Cmd, vbTextCompare) = 0 Then .Hidden = False
                    End If
                End With
            Next C
        Else
            .Range(.Columns(FirstColumn), .Columns(LastColumn)).Hidden = False
        End If
    End With
    Application.ScreenUpdating = True
End Sub

在此过程中查找两个声明:

CapRow = 4
FirstColumn = 3

第4行是数据表中的行,程序将在其中查找月份名称。第3列(=&#34; C&#34;)将是程序期望找到月份名称的第一列。列A:B永远不会被触及。

现在您的系统已准备就绪。您需要知道如何操作它。 1.当您选择&#34;全部显示&#34;从下拉列表中将显示从FirstColumn开始的所有列。将此称为重置。 2.当您选择CapRow中具有该名称的下拉列中的任何项目时,将显示。 3.当您选择另一个月时,它将被添加到已显示的月份。 4.当所有列都已显示时,将仅显示所选列。

您可以随时修改DropdownList范围,使其更长或更短。重要的是下拉列表中的名称可以在CapRow中找到。该程序将它们作为文本进行比较,意思是&#34;显示全部&#34;与&#34; SHOW ALL&#34;。

相同