这就是我所拥有的。我正在使用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
,但这不起作用。
答案 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”,那么您最终只会隐藏所有必需的列,但您会想要岛屿列未隐藏(可能在这些字段中输入数据),我现在已经更正了。