根据单元格值隐藏Excel中的列

时间:2016-10-17 17:09:50

标签: excel vba excel-vba

我想根据在单元格AC5中选择的选项列表中的值隐藏Excel表格中的某些列(称为“模板帐户”)。

逻辑如下:

1)如果单元格AC5中的选项列表值是“能源和资源”,那么我希望隐藏BJ:BO列。

2)如果单元格AC5中的选项列表值是“防御”,那么我希望隐藏列BP:CA等等。

3)否则,如果AC5在AC5中不包含任何选项列表值,则不隐藏任何内容

我尝试的代码看起来像这样,但它不起作用。有人可以请我提供一些意见吗?

 Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Dim cellvalue As String
 Dim ws As Worksheet
 Set ws = Sheet("Template account")

If cellvalue Like "*Energy and Resources*" Then
Columns("BJ:BO").EntireColumn.Hidden = True
Else
If cellvalue Like "*Defence*" Then
Columns("BP:CA").EntireColumn.Hidden = True
Else
Exit Sub
End If
End Sub

2 个答案:

答案 0 :(得分:2)

要检测单元格值的变化,必须使用Worksheet_Change()事件处理程序

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address(False, False) = "AC5" Then '<-- check for changed cell to be in AC5
        Select Case Target.Value '<-- act correspondingly to changed cell value
            Case "Energy and Resources"
                Columns("BJ:BO").EntireColumn.Hidden = True
            Case "Defence"
                Columns("BP:CA").EntireColumn.Hidden = True
            Case "...."
                ' go on with other cases
        End Select
    End If
End Sub

你是否要取消隐藏列BJ:BO和BP:CA当“能源和资源”和“防御”都不是更改的拾取单元格的值时,代码在{{1的最后一部分 - 稍微改变阻止

Select Case

答案 1 :(得分:1)

将代码放在Workbook_SheetChange下。目前,您所处的事件仅在您选择不同的单元格时触发,而不是在单元格中发生实际更改时。同样@BruceWayne声明你永远不会将单元格AC5的值传递给cellvalue变量。代码有一些变化:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Sh.Name = "Template account" And Target.Address = "$AC:$5" Then
        Application.EnableEvents = False
        Dim cellvalue As String
        cellvalue = Target.Value2

        If cellvalue Like "*Energy and Resources*" Then
            Sh.Columns("BJ:BO").EntireColumn.Hidden = True
        ElseIf cellvalue Like "*Defence*" Then
            Sh.Columns("BP:CA").EntireColumn.Hidden = True
        Else
            Sh.Columns("BJ:BO").EntireColumn.Hidden = False
            Sh.Columns("BP:CA").EntireColumn.Hidden = False
        End If
        Application.EnableEvents = False
    End If
End Sub

添加了一项检查以确认更改是否在正确的工作表和单元格上。代码运行时禁用事件,因此隐藏列不会再次触发事件。最后启用。添加了在Else上再次显示列。尚未测试过。