2017-10-17 66 views
0

我正在寻找根据单元格值来隐藏列。 例如,当值为1时,I至BV列必须隐藏。当值为2时,BV列必须隐藏,但I到O列必须可见。如何根据单元格值隐藏列

我的代码仅适用于1,我不觉得我该怎么办...... 谢谢你的帮助有多个条件测试

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Range("B2")) Is Nothing Then 
     If Target = 1 Then 
      Columns("I:BV").EntireColumn.Hidden = True 
     Else: Columns("I:BV").EntireColumn.Hidden = False 
     End If 
    End If 
End Sub 

Private Sub Worksheet_Change2(ByVal Target As Range) 
    If Not Intersect(Target, Range("B2")) Is Nothing Then 
     If Target = 2 Then 
      Columns("O:BV").EntireColumn.Hidden = True 
     Else: Columns("O:BV").EntireColumn.Hidden = False 
     End If 
    End If 
End Sub 

Private Sub Worksheet_Change3(ByVal Target As Range) 
    If Not Intersect(Target, Range("B2")) Is Nothing Then 
     If Target = 4 Then 
      Columns("U:BV").EntireColumn.Hidden = True 
     Else: Columns("U:BV").EntireColumn.Hidden = False 
     End If 
    End If 
End Sub 

Private Sub Worksheet_Change4(ByVal Target As Range) 
    If Not Intersect(Target, Range("B2")) Is Nothing Then 
     If Target = 5 Then 
      Columns("AA:BV").EntireColumn.Hidden = True 
     Else: Columns("AA:BV").EntireColumn.Hidden = False 
     End If 
    End If 
End Sub 

Private Sub Worksheet_Change5(ByVal Target As Range) 
    If Not Intersect(Target, Range("B2")) Is Nothing Then 
     If Target = 6 Then 
      Columns("AG:BV").EntireColumn.Hidden = True 
     Else: Columns("AG:BV").EntireColumn.Hidden = False 
     End If 
    End If 
End Sub 

Private Sub Worksheet_Change6(ByVal Target As Range) 
    If Not Intersect(Target, Range("B2")) Is Nothing Then 
     If Target = 7 Then 
      Columns("AM:BV").EntireColumn.Hidden = True 
     Else: Columns("AM:BV").EntireColumn.Hidden = False 
     End If 
    End If 
End Sub 

Private Sub Worksheet_Change7(ByVal Target As Range) 
    If Not Intersect(Target, Range("B2")) Is Nothing Then 
     If Target = 8 Then 
      Columns("AS:BV").EntireColumn.Hidden = True 
     Else: Columns("AS:BV").EntireColumn.Hidden = False 
     End If 
    End If 
End Sub 

Private Sub Worksheet_Change8(ByVal Target As Range) 
    If Not Intersect(Target, Range("B2")) Is Nothing Then 
     If Target = 9 Then 
      Columns("AY:BV").EntireColumn.Hidden = True 
     Else: Columns("AY:BV").EntireColumn.Hidden = False 
     End If 
    End If 
End Sub 

Private Sub Worksheet_Change9(ByVal Target As Range) 
    If Not Intersect(Target, Range("B2")) Is Nothing Then 
     If Target = 10 Then 
      Columns("BE:BV").EntireColumn.Hidden = True 
     Else: Columns("BE:BV").EntireColumn.Hidden = False 
     End If 
    End If 
End Sub 

Private Sub Worksheet_Change10(ByVal Target As Range) 
    If Not Intersect(Target, Range("B2")) Is Nothing Then 
     If Target = 11 Then 
      Columns("BK:BV").EntireColumn.Hidden = True 
     Else: Columns("BK:BV").EntireColumn.Hidden = False 
     End If 
    End If 
End Sub 

Private Sub Worksheet_Change11(ByVal Target As Range) 
    If Not Intersect(Target, Range("B2")) Is Nothing Then 
     If Target = 12 Then 
      Columns("BQ:BV").EntireColumn.Hidden = True 
     Else: Columns("BQ:BV").EntireColumn.Hidden = False 
     End If 
    End If 
End Sub 
+2

列中的所有列都在一张表中吗?如果是这样,您只需要一个工作表更改事件。在事件开始时,取消隐藏您正在使用的所有列。然后用ElseIf语句设置一系列If Target = x来测试Target的值并隐藏相应的列。 – QHarr

+1

您可以将代码缩进,以便阅读。您可以使用[Rubberduck缩进网站](http://rubberduckvba.com/indentation)。并且您不能拥有'Private Sub Worksheet_Change#number(ByVal Target As Range)',您应该为工作簿中使用的每张工作表添加'Private Sub Worksheet_Change(ByVal Target As Range)'。或/并将所有代码写在所需表格的'Private Sub Worksheet_Change(ByVal Target As Range)' – danieltakeshi

+0

如果值为'3',您是否需要任何东西? – BruceWayne

回答

1

一个变化事件的IF语句中,使用elseif的。没有为你写全部,下面是它的结构和关键要素。有很多堆栈溢出的例子可以提供帮助。

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Range("B2")) Is Nothing Then 

     'Code to unhide all columns goes here. 

     'Then test the contents of B2 
     If Target = 1 Then 
      Columns("I:BV").EntireColumn.Hidden = True 
     ElseIf Target = 2 Then 
      Columns("O:BV").EntireColumn.Hidden = True 
     ElseIf Target = 3 Then ......'Continue with rest of conditions 
     End If 
    End If 

End Sub 
+0

完美的作品! – Haox

2

才算列数是否比你想看到的最后一列度:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Range("B2")) Is Nothing Then 
     Dim i As Long 
     Dim lastVisible As Long 
     'Use cell B2 in the calculation, just in case Target is 
     ' something like A1:D17 
     lastVisible = 2 + Range("B2").Value * 6 
     'That formula is calculating lastVisible such that: 
     'If B2 is 1, lastVisible will be 8 (i.e. column H) 
     'If B2 is 2, lastVisible will be 14 (i.e. column N) 
     'If B2 is 3, lastVisible will be 20 (i.e. column T) 
     'If B2 is 4, lastVisible will be 26 (i.e. column Z) 
     '... etc, up to 
     'If B2 is 11, lastVisible will be 68 (i.e. column BP) 
     'If B2 is 12, lastVisible will be 74 (i.e. column BV) 

     For i = 3 To 74 
      Columns(i).Hidden = i > lastVisible 
     Next 
    End If 
End Sub 
0

您可以在更少的行做到这一点:

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim primaryCols As Range 
If Not Intersect(Target, Range("B2")) Is Nothing Then 
     Range(Columns(3 + Range("B2").Value * 6), Columns(74)).EntireColumn.Hidden = False 
     Range(Columns(9), Columns(2 + Range("B2").Value * 6)).EntireColumn.Hidden = True 
End If 
End Sub 

基本上它使用一点算术来获得你想要的可见的开始列,以及从列I开始的结束列来隐藏这些列。

+0

@ YowE3K - 啊,很好的电话!完成。 “ – BruceWayne

+0

”当值为2时,BV列必须隐藏,但I至O列必须可见。“,所以我认为您要隐藏** all **列,然后只需执行一个隐藏行。呃 - 或者是你的代码。清晨过早​​! – YowE3K

+0

是的 - 它应该是(a)隐藏第3至74列(b)取消隐藏第3至2 + B2 * 6 - 或(a)取消隐藏3至74(b)隐藏3 + B2 * 6至74当B2是12时测试)(注意:'B2'几乎可以肯定是一个月的数字 - 我敢打赌我的最后一美元:D) – YowE3K