使用循环隐藏列和多个工作表
问题描述:
我目前有一个循环,可以很好地隐藏基于多个下拉单元格的列。我也想添加代码来隐藏基于相同的下拉列表的表单,但我不知道如何添加到我的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
答
您可以使用类似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
答
@ 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
感谢您的快速回复!我会给它一个镜头,让你知道它是如何运作的! –
好的。所以我放弃了。它没有像我所希望的那样工作。问题在于我的解释。我有22张纸,每张在9个单独的下拉框中的数据验证列表中都有对应的名称。我不仅需要根据描述符1和描述符2来隐藏列,还要根据9个下拉列表中的独立选项隐藏/取消隐藏22个描述符的表单,以隐藏列。如果独立图纸名称不在下拉列表中,则需要隐藏独立图纸。 –
@il_Paco如果A30:A38中的任何一个是“描述符1”或“描述符2”,不是100%确定我理解,所以请耐心等待 - 您希望在活动工作表中显示这些列?您还希望隐藏活动工作表上的任何A30:A38单元格中未显示其名称的任何工作表(除活动工作表之外?),或者如果工作表名称确实出现在这些单元格中,则可以使工作表可见? – YowE3K