2017-10-11 45 views
1

我有一个包含5个工作表的工作簿:Sheet1,Sheet2,Sheet3,Sheet4,Sheet5。第一张:“Sheet”有一个单元:“C3”,带有一个下拉菜单,有4个不同的选项:Opt1,Opt2,Opt3,Opt4。 根据在此下拉菜单中选择的内容,我希望实时将不同的列隐藏在各种工作表中。如果没有输入,我不想隐藏任何列。Excel VBA根据另一个工作表中的不同单元格值实时隐藏不同的列

我已经输入了部分工作的下面的代码,但我认为存在一个问题,因为我选择了重叠的列来隐藏 - 不完全确定。

此外,我想隐藏特定的行以及下面的列,具体取决于您在下拉菜单中选择的不同选项。

此外,我将复制在所有Sheets1-5中隐藏相同的列。

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Range("C3").Value = "Opt1" Then 
     Sheets("Sheet1").Columns("G:L").EntireColumn.Hidden = True 
     Sheets("Sheet1").Columns("N:T").EntireColumn.Hidden = True 
    Else 
     Sheets("Sheet1").Columns("G:L").EntireColumn.Hidden = False 
     Sheets("Sheet1").Columns("N:T").EntireColumn.Hidden = False 
    End If 

    If Range("C3").Value = "Opt2" Then 
     Sheets("Sheet1").Columns("B:F").EntireColumn.Hidden = True 
     Sheets("Sheet1").Columns("N:T").EntireColumn.Hidden = True 
    Else 
     Sheets("Sheet1").Columns("B:F").EntireColumn.Hidden = False 
     Sheets("Sheet1").Columns("N:T").EntireColumn.Hidden = False 
    End If 

    If Range("C3").Value = "Opt3" Then 
     Sheets("Sheet1").Columns("B:M").EntireColumn.Hidden = True 
    Else 
     Sheets("Sheet1").Columns("B:M").EntireColumn.Hidden = False 
    End If 

    If Range("C3").Value = "Opt4" Then 
     Sheets("Sheet1").Columns("B:AB").EntireColumn.Hidden = True 
    Else 
     Sheets("Sheet1").Columns("B:AB").EntireColumn.Hidden = False 
    End If 

End Sub 
+0

你就可以开始将在范围内的所有列在子(表( “工作表Sheet1”)开始被取消隐藏列( “B:AB”)EntireColumn.Hidden。 = False),然后在你的代码中只添加if(而不是其他)部分?这意味着只有针对测试条件的指定列将被隐藏。 – QHarr

回答

0

我已经重写了您的代码,以便于阅读和编辑。我的目标是尽可能缩短代码。我将你的if语句改为Select Case。它更优雅,我认为它更快,但不要听我的话。

一个必须解决的问题是,如果我选择选项1,然后从选择OPT2,列选项1仍然会被隐藏。因此,在代码隐藏任何内容之前,它会自动取消隐藏范围B:AB中的所有列。

我添加了Case Else以取消隐藏所有列,如果您输入了除Opt1,Opt2,Opt3或Opt4之外的任何内容。这可以很容易地改变成一个MsgBox,警告用户输入的值不正确。 如果您已经限制了用户的选择,则可以删除此行。

守则:

Private Sub Worksheet_Change(ByVal Target As Range) 

    ' Unhide Columns 
    Worksheets("Sheet1").Range("B:AB").EntireColumn.Hidden = False 

    Select Case Worksheets("Sheet1").Range("C3").Value 

     Case "Opt1" 
     Worksheets("Sheet1").Range("G:L,N:T").EntireColumn.Hidden = True 

     Case "Opt2" 
     Worksheets("Sheet1").Range("B:F,N:T").EntireColumn.Hidden = True 

     Case "Opt3" 
     Worksheets("Sheet1").Range("B:M").EntireColumn.Hidden = True 

     Case "Opt4" 
     Worksheets("Sheet1").Range("B:AB").EntireColumn.Hidden = True 

     ' If anything else is entered, the columns will be unhidden. 
     Case Else 
     Worksheets("Sheet1").Range("B:AB").EntireColumn.Hidden = False 

    End Select 

End Sub 
+0

感谢您的帮助EliasWick! – Bonnie

1

继续我的评论。您可以将整个范围的列定义为一个变量,例如wholeRange并将其设置为在每个工作表更改开始时不隐藏。

添加对范围的完全限定引用,即ThisWorkbook.Sheets(“Sheet1”)或ws(作为下面显示的变量)。

因为一切都在开始时不被隐藏每个If语句都不需要Else。这可能是出现混淆的地方。

当您根据不同的期望值测试单个单元格的值时,更改为Select case语句。

将您隐藏的单独行列范围合并到一行代码中,例如

Sheets("Sheet1").Columns("G:L").EntireColumn.Hidden = True 
Sheets("Sheet1").Columns("N:T").EntireColumn.Hidden = True 

变为:然后

ws.Range("G:L,N:T").EntireColumn.Hidden = True 

你的代码将如下所示:

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim wb As Workbook 
    Dim ws As Worksheet 
    Dim entireRange As Range 
    Set wb = ThisWorkbook 
    Set ws = wb.Sheets("Sheet1") 
    Set entireRange = ws.Columns("B:AB") 

    entireRange.EntireColumn.Hidden = False 

    Select Case ws.Range("C3") 'Test the value of C3 

     Case "Opt1" 
      ws.Range("G:L,N:T").EntireColumn.Hidden = True 

     Case "Opt2" 
      ws.Range("B:F,N:T").EntireColumn.Hidden = True 

     Case "Opt3" 
      ws.Range("B:M").EntireColumn.Hidden = True 

     Case "Opt4" 
      entireRange.Hidden = True 

    End Select 
End Sub 

这将是更容易在那里的东西都被隐藏或取消隐藏条款进行调试。

+0

谢谢这么多QHarr!我最终使用了你的代码的逻辑。我将每张表单设置为单独的ws1,ws2等,然后为每个表单定义范围。谢谢您的帮助!! :) – Bonnie

相关问题