2017-08-02 36 views
0

我目前有一个循环,可以很好地隐藏基于多个下拉单元格的列。我也想添加代码来隐藏基于相同的下拉列表的表单,但我不知道如何添加到我的For Each Cell In Range以适应这种情况。我粘贴了我必须隐藏下面的列。任何帮助将不胜感激。使用循环隐藏列和多个工作表

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim cell As Range 

For Each cell In Range("$A$30:$A$38") 

    If cell = "Descriptor 1" Or cell = "Descriptor 2" Then 
    Columns("B:F").EntireColumn.Hidden = False 
    Exit For 
    Else 
    Columns("B:F").EntireColumn.Hidden = True 
End If 
Next Cell 

回答

1

您可以使用类似Worksheets("sheet_to_hide").Visible = xlSheetHidden隐藏薄片,Worksheets("sheet_to_unhide").Visible = xlSheetVisible再次取消隐藏它。

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim cell As Range 
    Dim HideIt As Boolean 

    HideIt = True 
    For Each cell In Range("$A$30:$A$38")  
     If cell.Value = "Descriptor 1" Or _ 
      cell.Value = "Descriptor 2" Then 
      HideIt = False 
      Exit For 
     End If 
    Next Cell 

    If HideIt Then 
     Columns("B:F").Hidden = True 
     Worksheets("Sheet1").Visible = xlSheetHidden 
     Worksheets("Sheet2").Visible = xlSheetHidden 
    Else 
     Columns("B:F").Hidden = False 
     Worksheets("Sheet1").Visible = xlSheetVisible 
     Worksheets("Sheet2").Visible = xlSheetVisible 
    End If 
End Sub 

如果工作表被隐藏/可见取决于他们的工作表名称是否出现在你的范围内,那么我会建议作以下修改:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim cell As Range 
    Dim HideIt As Boolean 

    'Don't do anything if there was no change to A30:A38 
    If Intersect(Target, Range("$A$30:$A$38")) Is Nothing Then Exit Sub 

    HideIt = True 
    For Each cell In Range("$A$30:$A$38") 
     If cell.Value = "Descriptor 1" Or _ 
      cell.Value = "Descriptor 2" Then 
      HideIt = False 
      Exit For 
     End If 
    Next cell 
    Columns("B:F").Hidden = HideIt 

    Dim ws As Worksheet 
    For Each ws In Worksheets 
     If ws.Name <> ActiveSheet.Name Then 
      'See if sheet name exists in A30:A38 
      'Hide the sheet if doesn't, make it visible if it does 
      ws.Visible = Not IsError(Application.Match(ws.Name, Range("$A$30:$A$38"), 0)) 
     End If 
    Next 
End Sub 
+0

感谢您的快速回复!我会给它一个镜头,让你知道它是如何运作的! –

+0

好的。所以我放弃了。它没有像我所希望的那样工作。问题在于我的解释。我有22张纸,每张在9个单独的下拉框中的数据验证列表中都有对应的名称。我不仅需要根据描述符1和描述符2来隐藏列,还要根据9个下拉列表中的独立选项隐藏/取消隐藏22个描述符的表单,以隐藏列。如果独立图纸名称不在下拉列表中,则需要隐藏独立图纸。 –

+0

@il_Paco如果A30:A38中的任何一个是“描述符1”或“描述符2”,不是100%确定我理解,所以请耐心等待 - 您希望在活动工作表中显示这些列?您还希望隐藏活动工作表上的任何A30:A38单元格中未显示其名称的任何工作表(除活动工作表之外?),或者如果工作表名称确实出现在这些单元格中,则可以使工作表可见? – YowE3K

0

@ YowE3K您的代码是很棒的。但是,我对标签名称的简写形式和描述符完整形式存在问题。所以,我把你的原始代码,为每个标签添加了一个“HideTab”,并将第一行HideTab = False切换为true,并在第四行HideTab中将其颠倒(见下文)。我确信有一种更快的方式,但这种方式就像一种魅力。非常感谢您的帮助!你指出我正确的方向。

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim cell As Range 
Dim HideIt As Boolean 

HideIt = True 
    For Each cell In Range("$A$30:$A$38")  
     If cell.Value = "Descriptor 1" Or 
     cell.Value = "Descriptor 2" Then 
     HideIt = False 
     Exit For 
    End If 
Next Cell 
Columns("B:F").EntireColumn.Hidden = True 


Dim HideTab1 As Boolean 
    HideTab1 = False 
    For Each cell In Range("$A$30:$A$38") 
     If cell = "Descriptor1" Then 
      HideTab1 = True 
      Exit For 
     End If 
    Next cell 
    Sheets("Desc1").Visible = HideTab1 

Dim HideTab2 As Boolean 
    HideTab2 = False 
    For Each cell In Range("$A$30:$A$38") 
     If cell = "Descriptor2" Then 
      HideTab2 = True 
      Exit For 
     End If 
    Next cell 
    Sheets("Desc2").Visible = HideTab2 

Dim HideTab3 As Boolean 
    HideTab3 = False 
    For Each cell In Range("$A$30:$A$38") 
     If cell = "Descriptor3" Then 
      HideTab3 = True 
      Exit For 
     End If 
    Next cell 
    Sheets("Desc3").Visible = HideTab3 
End Sub