2017-08-02 35 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