【问题标题】:Excel VBA Hide different columns depending on different cell values in another sheet, in real timeExcel VBA根据另一个工作表中的不同单元格值实时隐藏不同的列
【发布时间】:2017-10-11 07:01:33
【问题描述】:

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

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

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

另外,我将在所有 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

【问题讨论】:

  • 您能否开始将范围内的所有列在子( Sheets("Sheet1").Columns("B:AB").EntireColumn.Hidden = False) 开始时不隐藏,然后仅添加之后你的代码的if(不是else)部分?这意味着只有针对测试条件的指定列将被隐藏。

标签: vba excel


【解决方案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

这将更容易根据隐藏或取消隐藏的位置进行调试。

【讨论】:

  • 非常感谢 QHarr!我最终使用了您的代码逻辑。我将每个工作表设置为单独的 ws1、ws2 等,然后为每个工作表定义范围。谢谢您的帮助!! :)
【解决方案2】:

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

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

如果您输入的不是 Opt1、Opt2、Opt3 或 Opt4,我添加了 Case Else 以取消隐藏所有列。这可以很容易地更改为一个 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

【讨论】:

  • 感谢 EliasWick 的帮助!
猜你喜欢
  • 2016-11-23
  • 2020-08-23
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-17
  • 1970-01-01
相关资源
最近更新 更多