Vba 基于单元格值在Excel中隐藏列
我想根据单元格AC5中选择的选择列表中的值隐藏Excel工作表(称为“模板帐户”)中的某些列 逻辑如下: 1) 如果单元格AC5中的picklist值为“Energy and Resources”,那么我希望隐藏列BJ:BO 2) 如果单元格AC5中的picklist值为“Defence”,则我希望隐藏列BP:CA,依此类推 3) 否则,如果AC5不包含AC5中的任何选取列表值,则不要隐藏任何内容 我尝试的代码看起来像这样,但是它不起作用。有人能给我一些建议吗Vba 基于单元格值在Excel中隐藏列,vba,excel,Vba,Excel,我想根据单元格AC5中选择的选择列表中的值隐藏Excel工作表(称为“模板帐户”)中的某些列 逻辑如下: 1) 如果单元格AC5中的picklist值为“Energy and Resources”,那么我希望隐藏列BJ:BO 2) 如果单元格AC5中的picklist值为“Defence”,则我希望隐藏列BP:CA,依此类推 3) 否则,如果AC5不包含AC5中的任何选取列表值,则不要隐藏任何内容 我尝试的代码看起来像这样,但是它不起作用。有人能给我一些建议吗 Private Sub Work
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
将代码放在
工作簿\u sheet change
下。当前,您所处的事件仅在您选择不同单元格时触发,而不是在单元格中发生实际更改时触发。正如@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
上再次显示列的内容。尚未测试。将代码放在工作簿\u sheet change
下。当前,您所处的事件仅在您选择不同单元格时触发,而不是在单元格中发生实际更改时触发。正如@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
上再次显示列的内容。尚未测试。若要检测单元格值中的更改,必须使用工作表\u 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
要检测单元格值中的更改,必须使用
工作表\u 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
您从不使用
Target
。我认为您只需要将cellvalue
替换为Target.Value
,它应该可以工作。你可能想用ws.Columns(…
来限定列
。我甚至怀疑你的代码是否能编译。我希望VBA在这里抱怨缺少End If
(你是不是想用ElseIf
而不是Else{newline}If
?)另外,最后一个Else
块是多余的,并且cellValue
在分配任何内容之前使用,因此它总是一个空字符串,因此任何条件都无法工作。工作表应该是工作表,而列
隐式引用活动工作表,您可能需要se或至少与Target.Parent
进行比较,以确保您正在使用正确的工作表。您从不使用Target
。我认为您只需要将cellvalue
替换为Target.Value
,它应该会起作用。您可能需要使用ws.Columns来限定列(…
也是。我甚至怀疑你的代码是否能编译。我希望VBA在这里抱怨缺少End If
(你的意思是使用ElseIf
而不是Else{newline}If
?)另外,最后一个Else
块是多余的,并且cellValue
在分配任何内容之前使用,因此它总是一个空字符串,因此任何条件都无法工作。工作表应该是工作表,而列
隐式引用活动工作表,您可能需要se或至少与Target.Parent
进行比较,以确保您正在处理正确的工作表。1)隐藏列不会触发工作表更改事件。此外,由于选择列表单元格和要隐藏/显示的列都在“模板帐户”中工作表然后不必使用工作簿范围内的事件处理程序,只需在相关工作表代码窗格中编写一个工作表即可。2)Target.Address=“$AC:$5
必须是Target.Address=“$AC$5
3)cellvalue Like“*Energy and Resources*”
(及诸如此类)与OP的叙述不符如果单元格AC5中的选取列表值为“能源和资源”,1)隐藏列不会触发工作表更改事件。此外,由于选取列表单元格和要隐藏/显示的列都位于“模板帐户”中“工作表-则无需使用工作簿范围的事件处理程序,只需在相关工作表代码窗格中编写一个工作表即可。2) Target.Address=“$AC:$5
必须是Target.Address=“$AC$5
3)cellvalue,比如“*能源和资源*”
(以及诸如此类的内容)与OP的叙述不符“如果单元格AC5中的选取列表值是“能源和资源”,那么您的第二个示例最好写成,然后写成列(“BJ:BO”).entireclumn.Hidden=Target.Value=“Energy and Resources”
列(“BP:CA”).entireclumn.Hidden=Target.Value=“Defense”
如果…
结束-这将确保在选择“Energy and Resources”时“Defense”列可见,反之亦然。目前,这两组列最终都可能被隐藏。(但也许这就是OP想要的?隐藏多个数据块中的一个似乎很奇怪-更常见的是在隐藏所有其他数据块的同时使一个数据块可见。)您好,谢谢您的建议!在删除单元格AC5中的值时,是否有办法使列“取消隐藏”?当前,如果我在AC5中输入一个值,则某些列将被隐藏。如果我在AC5中输入不同的值,以前隐藏的列将与新隐藏的列一起保持隐藏。欢迎您。在没有完全了解你的要求的情况下,我可以回答:“是的,这是可能的”,但你最好给出体验的完整细节