首页 > 解决方案 > 根据每行(而不是单个单元格)上的下拉多项选择隐藏一行(在列表中)

问题描述

我在 B 列中有一个“活动”列表,每个活动在 C 列中都有一个状态下拉列表。对于每个活动,我可以选择“完成、进行中、待定、已取消”。我想要的是每次在下拉列表中选择状态“已取消”(位于同一行)时自动隐藏一行(不过滤)。

截屏

使用的代码如下:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim rng As Range
Set rng = Target.Parent.Range("C2:C21")
If Target.Address <> Range("C2:C21").Address Then
    Exit Sub
Cells.EntireRow.Hidden = False
Select Case Range("C2:C21")
    Case "Cancelled":
        Range("2:21").EntireRow.Hidden = True - ***I want to hide only those rows in which "Cancelled" is selected.***
    Case "Done":
        Range("2:21").EntireRow.Hidden = False - ***I want the rows to unhide if either "Done","In progress" or "TBD" is selected.***
End Select

End Sub

对于我想做的事情来说,这可能是一个糟糕的代码......

关于如何改善这一点的任何想法?

提前非常感谢!:)

萨拉

标签: vbaexcel

解决方案


  1. rng对象从未被使用过。
  2. 如果要检查选择是否在Range("C2:C21"),请使用Intersect函数。
  3. 只有当它是单行的时,该If语句才能在没有 a 的情况下完成。End If否则你必须End If在最后加上一个。
  4. Range("2:21").EntireRow.Hidden意味着每一行都2:21将被隐藏。

代码:

Private Sub Worksheet_SelectionChange(ByVal target As Range)

    Dim rng As Range, cel As Range
    Set rng = target.Parent.Range("C2:C21")

    If Not Intersect(rng, target) Is Nothing Then
        For Each cel In rng
            cel.EntireRow.Hidden = IIf(cel.Value = "Cancelled", True, False)
        Next cel
    End If
End Sub

我不确定下面的版本是否适合。在我看来,一般这个宏应该只在某些东西发生变化后运行,我们只能检查被改变的行,其他行应该保持相同的状态。

Private Sub Worksheet_Change(ByVal target As Range)    
    Dim rng As Range, cel As Range
    Set rng = target.Parent.Range("C2:C21")
    If Not Intersect(rng, target) Is Nothing Then
        target.EntireRow.Hidden = IIf(target.Value = "Cancelled", True, False)
    End If
End Sub

推荐阅读