vba - 根据每行(而不是单个单元格)上的下拉多项选择隐藏一行(在列表中)
问题描述
我在 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
对于我想做的事情来说,这可能是一个糟糕的代码......
关于如何改善这一点的任何想法?
提前非常感谢!:)
萨拉
解决方案
- 该
rng
对象从未被使用过。 - 如果要检查选择是否在
Range("C2:C21")
,请使用Intersect
函数。 - 只有当它是单行的时,该
If
语句才能在没有 a 的情况下完成。End If
否则你必须End If
在最后加上一个。 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
推荐阅读
- python - 如何使用 Python 在游戏中移动目标
- python - 如何将多个 DataFrame 写入 MySQL 数据库?
- c - 如何计算具有不同数据类型的结构的校验和?
- python - virtualenv vs virtualenvwrapper
- android - Ionic build 在 29 以下的 android SDK 平台上显示白屏
- c# - 堆栈破坏是如何发生的?
- python - KivyMD 滚动视图示例
- spring - factory.NoSuchBeanDefinitionException:没有名为“org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry”的bean可用
- excel - 什么更好的保存在内存中——一个字符串还是一个对象?
- javascript - React DOM 不更新状态变化