2017-03-17 42 views
0

请再次提供帮助。 下面的代码用于隐藏不匹配B5的列。 现在我的问题是,我想同时取消隐藏与B6和B7中的值 匹配的列。 命令表中的参考值列B行5,6,7。 让B5是MARCH 让B6是一月份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 

回答

0

如果你想要的是隐藏所有的行标有‘一月’,‘二月’等你将不得不使用Excel的筛选功能,更大的灵活性和更迅速的行动。了解有关过滤器的here

+0

@ Variatus您好,感谢您的分享..但我们想要取消隐藏匹配“一月”和二月“的所有列”。“一月和二月是列的标题......可以在单行中找到( Col C Row 4)。 =) – SANDY

0

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

在您的“命令”表中,找到一个空白栏,进入“显示所有”的细胞之一,此功能在下面的单元格:

="Show "& B5 

我更喜欢你拥有所有的12在B5:B16的月份,但是如果你只有一月到三月,或者喜欢随时更改动态内容。只要您在B列中有相关数据(月份名称或列标题),就可以将公式向下复制。给我刚刚描述的名称范围。我给它起了名字“DropdownList”。确保指定的范围具有“工作簿”的“范围”(即,从工作簿的所有部分都可以看到)。

在位置A4的GRA_New表上放置一个命令按钮。也许你在别处已经有了一个按钮。在这种情况下,我会请你一起玩,然后再做一个。稍后,您可以将此按钮移动到任何其他位置,包括其他工作表,但不能放在可能隐藏的列中。该命令按钮将成为验证下拉列表。输入

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

您现在应该有一个显示“全部显示”,在第一位置的验证下拉列表中,“展1月。”排在第二,而更多的“展......”这取决于命名范围下拉列表的大小。确保在“显示一月”和“显示全部”之间有一个空格,不多也不少,每行包含2个单词,其中第二个单词是相关的。

现在将以下过程添加到“GR_New ...”工作表的代码表中。

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 

在此过程中,请将引用更改为“A4”到您有验证下拉列表的单元格。

下一个过程进入正常的代码模块。默认情况下它的名字是“Module1”,但你可以给它任何你喜欢的名字。

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列(=“C”)将成为程序期望找到一个月份名称的第一列。列A:B永远不会被触摸。

现在您的系统已准备就绪。你需要知道如何操作它。 1.当您从下拉列表中选择“全部显示”时,将显示从FirstColumn开始的所有列。称此为重置。 2.当您从CapRow中的该名称的下拉列表中选择任何项目时,将显示。 3.当您选择其他月份时,它将被添加到已经显示的月份中。 4.当所有列已显示时,只显示所选列。

您可以随时修改范围DropdownList,使其更长或更短。重要的是,CapRow中提供了下拉列表中的名称。该程序将它们作为文本进行比较,意思是“全部显示”与“全部显示”相同。