【问题标题】:Formula to hide rows based on the value of a cell根据单元格的值隐藏行的公式
【发布时间】:2017-12-22 05:44:20
【问题描述】:

我有一个工作表,其中包含所有经理及其员工的姓名,理想情况下,此工作表的工作方式是左上角有一个下拉菜单,当经理选择他们的姓名时,所有没有的行t 有他们的名字反对,是隐藏的,所以只有他们的团队被显示。

我知道自动过滤并让他们选择他们的名字是最简单的方法,也是一个不错的选择,但我希望有一种方法可以使用 VBA 或公式来做到这一点,以便在何时隐藏行当他们在下拉列表中选择他们的名字时,这不是他们的团队。因为我正在尝试创建一些非常漂亮且看起来不错的东西

我确实尝试过让一个帮助单元格在名称匹配时显示真假,但在这一点上有点卡住了。尝试使用下面的代码,但它似乎实际上并没有做任何事情。带有 TRUE/FALSE 的列在 Col A 中

Sub TEST()
Dim cell As Range

Application.ScreenUpdating = False
Application.EnableEvents = False
For Each cell In Range("A4:A34")
If cell.Value = "FALSE" Then
cell.EntireRow.Hidden = True
Else
cell.EntireRow.Hidden = False
End If
Next
Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub

任何关于如何在不使用自动过滤器的情况下做到这一点的想法都会很棒

【问题讨论】:

  • Autofilter 是显而易见的解决方案...如果您真的想使用 VBA,那么尝试编写一些代码并在遇到“特定”问题时回复。
  • 请阅读常见问题解答以了解本网站的运作方式以及如何提问。您没有表现出任何解决方案的尝试。这不是脚本订购服务。
  • 所以是问答而不是 Excel 琐事网站。阅读How to Ask 并花点时间阅读tour
  • FWIW 没有公式可以隐藏一行。公式是接受输入并产生输出的函数,仅此而已。
  • 公式背后的想法是如果名称匹配则返回 True/False 以显示,然后在 VBA 中执行类似 Sub TEST() Dim cell As Range Application.ScreenUpdating = False Application.EnableEvents = False For Each cell In Range("A4:A34") If cell.Value = "FALSE" Then cell.EntireRow.Hidden = True Else cell.EntireRow.Hidden = False End If Next Application.ScreenUpdating = True Application.EnableEvents = True 抱歉没有正确提出问题方式

标签: excel vba excel-formula


【解决方案1】:

鉴于以下假设:

  • 经理名称在单元格 A1 中的下拉菜单
  • 每行的列列表管理器名称在 A 列中
  • 数据集从第 5 行开始
  • A 列是连续的,没有空格

将以下代码放入数据表的Worksheet 模块并更改假设以适合您的数据集。

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Address = "$A$1" and Target.Cells.Count = 1 Then

        Application.ScreenUpdating = False

        Range("A5:A1000").EntireRow.Hidden = False

        Dim mgrList as Range
        Set mgrList = Range(Range("A5"),Range("A5").End(xlDown))

        Dim mgrCheck as Range
        For each mgrCheck in mgrList
            mgrCheck.EntireRow.Hidden = mgrCheck <> Target
        Next

    End If

End Sub

【讨论】:

  • 嗨 Scott - 感谢您的回复,我已将其放入工作表模块并移动我的数据以符合您的代码测试要求,我似乎收到“编译错误: 更改下拉框时,过程声明与同名事件或过程的描述不匹配,无法弄清楚原因
  • @AshleyThomson - 对不起。请参阅我的编辑。我在过程名称的参数中忘记了ByVal
  • 很抱歉,当您重新选择已隐藏的选项时,是否有任何简单的方法可以取消隐藏。因此,如果我选择管理器 1,它将隐藏 2 和 3,但是如果我想选择管理器 2,是否仍然取消隐藏它并隐藏 1 和 3。无论如何要修改此代码以包含此代码? @ScottHoltzman
  • @AshleyThomson - 每次都应该这样做。它应该只显示您选择的经理,而不显示其他内容。
  • 它确实做到了这一点,但是当我去选择一个以前隐藏的时候,它就不会显示它,它仍然是隐藏的,并且工作表上什么也没有显示
【解决方案2】:

使用 if then else 语句调用显示/隐藏您想要显示的行。

If Range("A1").Value = "John Snow" Then
Call Show_John_Snow
Else
If Range("A1").Value = "Daenerys Targaryen" Then
Call Show_Daenerys
Else....

'子程序

Show_John_Snow
Rows("17:20").EntireRow.Hidden = True 'hide others
Rows("21:53").EntireRow.Hidden = False 'show John Snow
Rows("54:75").EntireRow.Hidden = True  'hide others

【讨论】:

【解决方案3】:

我有这个数据,其中我在 A3:D3 有标题,数据从第 4 行开始到第 99 行。
我尝试应用自动过滤器,检查这个是否适合你。

Sub test()

    Range("A3:D3").Select
    Selection.AutoFilter
    ActiveSheet.Range("A3:D99").AutoFilter Field:=2, Criteria1:="0"
    ActiveSheet.Range("A3:D99").AutoFilter Field:=2, Criteria1:="1"
End Sub

在这里,我从 Field-2 的下拉过滤器中选择了名为“0”的选项,即 Range A4,正如您所说,其他单元格会自动隐藏,而与该条件对应的单元格仅可见。 我也尝试了其他选项“1”。

【讨论】:

  • 如果数据较少,请尝试为 nRows 添加最后两行...
【解决方案4】:

这似乎是一种非常困难或复杂的方法,我必须在不让他们看到其他学生结果的情况下向学生展示他们的结果。

因此,一张表包含所有数据,在“正面”表上,我使用 index() 和 match() 调用特定学生的相关数据。每个学生都有一个 ID 号,输入该 ID 号,然后返回姓名进行确认,然后返回相关成绩。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    相关资源
    最近更新 更多