我想根据在单元格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
答案 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
上再次显示列。尚未测试过。