我可以只使用worksheet_change作为特定的列吗?

这是我的。 我正在使用3个值的下拉列表来隐藏列。 每个值都有特定的列,这些列对于它是唯一的,当select一个值时,我需要隐藏与其不相关的其他列。

我已经使用了下面的代码:

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 

这个工程,当我从下拉列表中select的值,但一旦我点击工作表中的另一个单元格,然后隐藏的列重新出现。 我希望能够在下拉列表中select一个值,并使单元格保持隐藏状态,直到我在下拉列表中select另一个值。 谁能帮我这个? 我试图使用WorkSheet_SelectionChange但这是行不通的。

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

 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 

用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 

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

由于在下拉菜单中有3个选项,因此只需要明确显示第三个Case语句而不是全部。

看看这个代码。

 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行select了大小写,给出在表格中启用了下拉或validation的列号的列号,在给定的情况下,它是2,代表列“B”和繁荣!

我根据以前在代码中的经验做了一些修改。 假设海洋参赛作品必须在“S”列和“U”列中进行,而岛屿参赛作品则在“T:X”和“Z”列中进行。

在你原来的代码中,如果你先在特定的行项目中select了“Marine”,然后将其修改为“Island”,那么只会隐藏所有需要的列,但是你会希望Island列未隐藏(可能input数据在这些领域),我现在已经纠正。