2

这就是我所拥有的。我正在使用包含 3 个值的下拉列表来隐藏列。Each value has specific columns that are unique to it and when a value is selected, I need the other columns that are not associated with it to be hidden.

我使用了以下代码:

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

4 回答 4

2

用 Target.Address 包装代码。

例如,下拉菜单在单元格“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
于 2013-04-26T13:08:45.310 回答
1

在代码的开头添加这个(你需要调整它),以检查被点击的范围,并最终在用户点击你的特殊范围之外时中止 sub。

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
于 2013-04-26T12:52:29.047 回答
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”,和繁荣!

根据我过去在您的代码中的经验,我做了一些更正。假设海洋条目必须在“S”列和“U”列中进行,而岛屿条目将在“T:X”和“Z”列中进行。

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

于 2013-04-27T16:23:51.570 回答
1

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

由于下拉菜单中有 3 个选项,因此您只需要Case明确第三条语句而不是一概而论。

于 2013-04-26T12:49:03.190 回答