Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 基于单元格值在Excel中隐藏列_Vba_Excel - Fatal编程技术网

Vba 基于单元格值在Excel中隐藏列

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

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

逻辑如下:

1) 如果单元格AC5中的picklist值为“Energy and Resources”,那么我希望隐藏列BJ:BO

2) 如果单元格AC5中的picklist值为“Defence”,则我希望隐藏列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

将代码放在
工作簿\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中输入不同的值,以前隐藏的列将与新隐藏的列一起保持隐藏。欢迎您。在没有完全了解你的要求的情况下,我可以回答:“是的,这是可能的”,但你最好给出体验的完整细节