我是否可以仅将workheet_change用于特定列?

时间:2013-04-26 12:44:40

标签: excel vba

这就是我所拥有的。我正在使用3个值的下拉列表来隐藏列。每个值都有唯一的特定列,当选择一个值时,我需要隐藏与其无关的其他列。

我使用了以下代码:

Private Sub Worksheet_Change(ByVal Target As Range)
    Select Case Target.Value
    Case "Marine"
        Columns("T:X").EntireColumn.Hidden = True
        Columns("Z").EntireColumn.Hidden = True

    Case "Inland"
        Columns("S").EntireColumn.Hidden = True
        Columns("U").EntireColumn.Hidden = True

    Case Else
        Columns("T:X").EntireColumn.Hidden = False
        Columns("Z").EntireColumn.Hidden = False
        Columns("S").EntireColumn.Hidden = False
        Columns("U").EntireColumn.Hidden = False
    End Select
 End Sub

当我从下拉列表中选择值时,这是有效的,但只要我单击工作表中的另一个单元格,就会重新出现隐藏的列。我希望能够在下拉列表中选择一个值,并使单元格保持隐藏,直到我在下拉列表中选择另一个值。谁能帮我这个?我曾尝试使用WorkSheet_SelectionChange,但这不起作用。

4 个答案:

答案 0 :(得分:2)

使用Target.Address包装代码。

例如,Drop down在Cell“B2”中,然后, 代码如下:

If Target.Address(True, True) = "$B$2" Then
    Select Case Target.Value
    Case "Marine"
        Columns("T:X").EntireColumn.Hidden = True
        Columns("Z").EntireColumn.Hidden = True

    Case "Inland"
        Columns("S").EntireColumn.Hidden = True
        Columns("U").EntireColumn.Hidden = True

    Case Else
        Columns("T:X").EntireColumn.Hidden = False
        Columns("Z").EntireColumn.Hidden = False
        Columns("S").EntireColumn.Hidden = False
        Columns("U").EntireColumn.Hidden = False
    End Select
End If

此外,猜测代码的目的,我进一步调整了它。 简化版本如下:

If Target.Address(True, True) = "$B$2" Then
    Select Case Target.Value
    Case "Marine"
        Columns("S:Z").EntireColumn.Hidden = False
        Columns("T:X").EntireColumn.Hidden = True
        Columns("Z").EntireColumn.Hidden = True
    Case "Inland"
        Columns("S:Z").EntireColumn.Hidden = False
        Columns("S").EntireColumn.Hidden = True
        Columns("U").EntireColumn.Hidden = True

    Case Else
        Columns("S:Z").EntireColumn.Hidden = False
    End Select
End If

答案 1 :(得分:1)

我认为问题在于你的Case Else声明。当您转到其他单元格时,将触发工作表更改事件,并且因为该值既不是“Marine”也不是“Inland”,此Else语句将被执行,所有列都将设置为Hidden = False

由于下拉列表中有3个选项,因此您只需要显式显示第三个Case语句,而不是全部删除。

答案 2 :(得分:1)

在代码开头添加此项(您需要调整它),以检查点击的范围,并在用户点击特殊范围时最终中止该字段。

Dim isect As Range
Set isect = Intersect(Target, Me.Range("$a$8:$a$48"))
If isect Is Nothing Then Exit Sub

您还可以查看地址:

If Target.Range Like "$X$*" Then...

<强>更新
另一方面,如果必须根据您在A列中单击的位置显示/隐藏列,那么我宁愿使用SelectionChange事件。这是一个示例:

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Dim isect As Range
        Set isect = Intersect(Target, Me.Range("$a$8:$a$48"))
        If Not isect Is Nothing Then
            select case Target.Value
                .....
            end select
        End If
    End Sub

答案 3 :(得分:1)

查看此代码。

Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Target.Column

Case 2

    If Target.Value = "Marine" Then

        Columns("S").EntireColumn.Hidden = False
        Columns("U").EntireColumn.Hidden = False            
        Columns("T:X").EntireColumn.Hidden = True
        Columns("Z").EntireColumn.Hidden = True

    ElseIf Target.Value = "Inland" Then

        Columns("S").EntireColumn.Hidden = True
        Columns("U").EntireColumn.Hidden = True
        Columns("T:X").EntireColumn.Hidden = False
        Columns("Z").EntireColumn.Hidden = False
    Else

        Columns("T:X").EntireColumn.Hidden = False
        Columns("Z").EntireColumn.Hidden = False
        Columns("S").EntireColumn.Hidden = False
        Columns("U").EntireColumn.Hidden = False

    End If

End Select

End Sub

现在在选择案例的代码的第4行中,给出在工作表中启用了下拉列表或验证的列号的列号,在给定的情况下,它是2,表示列' B'和Boom!

根据我过去在您的代码中的经验,我做了一些修改。假设海洋参赛作品必须在“S”栏和“U”栏中进行,岛屿参赛作品应在“T:X”和“Z”栏目中进行。

在您的原始代码中,如果您在特定订单项中首先选择了“Marine”,然后将其更正为“Island”,那么您最终只会隐藏所有必需的列,但您会想要岛屿列未隐藏(可能在这些字段中输入数据),我现在已经更正了。