【问题标题】:Showing or Hiding Rows based on Subsequent Criteria根据后续条件显示或隐藏行
【发布时间】:2020-04-02 17:23:01
【问题描述】:

对此非常陌生,因此为我的无知道歉。希望这能解释清楚。

我根据第 1 周到第 5 周的下拉列表拼凑了一些当前隐藏或显示一系列单元格的代码(即,如果选择第 1 周,第 2-5 周将被隐藏,并且只有一周的单元格1 显示)。然后在每周内,我有一个随后的下拉选择选项来显示给定周的行,从 1 到 30 行。

所以选择一个周数来显示相关的行,然后选择一个数字来选择给定周显示的行数。

The problem I'm having is that when a given week is selected, all 30 rows for that week are shown again even if previously the user selected to show only rows 1-15.

我明白这是因为选择一周时,只有检查语句,并且随后的语句不再运行,但是我不知道如何重新安排以确保维护后续选择。

我希望每周只显示用户之前定义的行数,因此您可以在几周之间切换并仅查看之前选择的行数。

即如果用户选择第 1 周的第 1-15 行,切换到第 2 周,然后返回第 1 周,我只希望第 1-15 行显示在第 1 周,而不是全部 30 行。

下面是“第 1 周”的示例,子继续使用类似代码的第​​ 2-5 周。

'

Private Sub Worksheet_Change(ByVal Target As Range)
 If Target.Address = Range("SELECT_WEEK_FEB").Address Then
        If Target.Value = "Week 1" Then
            Range("WEEK_1_FEB").EntireRow.Hidden = False
            Range("WEEK_2_FEB, WEEK_3_FEB, WEEK_4_FEB, WEEK_5_FEB").EntireRow.Hidden = True
        ElseIf Target.Value = "Week 2" Then
            Range("WEEK_2_FEB").EntireRow.Hidden = False
            Range("WEEK_1_FEB, WEEK_3_FEB, WEEK_4_FEB, WEEK_5_FEB").EntireRow.Hidden = True
        ElseIf Target.Value = "Week 3" Then
            Range("WEEK_3_FEB").EntireRow.Hidden = False
            Range("WEEK_1_FEB, WEEK_2_FEB, WEEK_4_FEB, WEEK_5_FEB").EntireRow.Hidden = True
        ElseIf Target.Value = "Week 4" Then
            Range("WEEK_4_FEB").EntireRow.Hidden = False
            Range("WEEK_1_FEB, WEEK_2_FEB, WEEK_3_FEB, WEEK_5_FEB").EntireRow.Hidden = True
        ElseIf Target.Value = "Week 5" Then
            Range("WEEK_5_FEB").EntireRow.Hidden = False
            Range("WEEK_1_FEB, WEEK_2_FEB, WEEK_3_FEB, WEEK_4_FEB").EntireRow.Hidden = True

        End If
    End If

     '------------------------------------------------------------------------------------------------------
     ' WEEK 1
 If Target.Address = Range("Week_1_Items_Feb").Address Then
        If Target.Value = "1-15" Then
            Range("Feb_Week_1_1_to_15").EntireRow.Hidden = False
            Range("Feb_Week_1_16_to_20, Feb_Week_1_21_to_25,Feb_Week_1_26_to_30").EntireRow.Hidden = True
        ElseIf Target.Value = "16-20" Then
            Range("Feb_Week_1_1_to_15, Feb_Week_1_16_to_20").EntireRow.Hidden = False
            Range("Feb_Week_1_21_to_25, Feb_Week_1_26_to_30").EntireRow.Hidden = True
        ElseIf Target.Value = "21-25" Then
            Range("Feb_Week_1_1_to_15, Feb_Week_1_16_to_20, Feb_Week_1_21_to_25").EntireRow.Hidden = False
            Range("Feb_Week_1_26_to_30").EntireRow.Hidden = True
         ElseIf Target.Value = "26-30" Then
            Range("Feb_Week_1_1_to_15, Feb_Week_1_16_to_20, Feb_Week_1_21_to_25, Feb_Week_1_26_to_30").EntireRow.Hidden = False
        End If
    End If'

【问题讨论】:

  • 您的下拉菜单在哪里?假设它们与数据在同一张纸上,它们是否在自己的列中?同一列中的两种类型?这些列中的任何其他数据?你如何确定周数?您的数据中有日期列吗?一张纸上是否只有一个月的数据?
  • 请看看这个网站。 edu.gcfglobal.org/en/excel2013/groups-and-subtotals/1 我您的数据将有一列表示周数,您可以在没有代码的情况下进行大部分的捉迷藏。想象一下工作表顶部的下拉菜单,您在其中选择“15”,这是每个选择显示的行数。如果您能张贴一张工作表左上角的照片,那就太好了。
  • 嗨@NorthNorse,除了Variatus的建议外,我还会建议两件事。在这种情况下,如果您有多个 If/ElseIf 语句,请使用 Select Case 语句(请参阅MS documentation 关于此),这将简化代码的阅读和可维护性。此外,从第 1 周到第 5 周,您似乎正在执行相同的操作(隐藏或取消隐藏行)。考虑编写一个标准的 Sub 并将周数作为参数传递。
  • @Variatus - Naresh 低于 99% 的回复涵盖了我正在寻找的内容。但是要回答其他问题:下拉菜单与被隐藏的行在同一张纸上,并且在它们自己的列中是分开的。月份被分开到它们自己的工作表上,然后在给定月份工作表的范围内按顺序列出周。也感谢您的反馈,非常感谢!
  • @Vincent - 感谢您的指点,我一定会继续使用这些!

标签: excel vba


【解决方案1】:

如果您将所有周的范围一起定义为“All_Week”,那么代码将会很短。然后,您可以通过在每个 if 条件中添加一行来链接这两个条件。 如果您将“All”添加到“Week_1_Items_Feb”,那么您可以看到给定“SELECT_WEEK_FEB”的所有行。

另外,我注意到,您需要“Week_1_Items_Feb”才能累积。因此,对于 16-20,您需要 1-20 输出。然后,我建议 - 而不是将其提及为 16-20,您可以在下拉列表中提及 1-20。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = Range("SELECT_WEEK_FEB").Address Then
        Range("All_Week").EntireRow.Hidden = True
        If Range("Week_1_Items_Feb").Value = "All" Then
        Range(Target.Value).EntireRow.Hidden = False
        Else
        Range(Target.Value).Rows(Replace(Range("Week_1_Items_Feb").Value, "-", ":")).EntireRow.Hidden = False
        End If
    End If

     '------------------------------------------------------------------------------------------------------
     ' WEEK 1

    If Target.Address = Range("Week_1_Items_Feb").Address Then
        Range("All_Week").EntireRow.Hidden = True
        If Target.Value = "All" Then
        Range(Range("SELECT_WEEK_FEB").Value).EntireRow.Hidden = False
        Else
        Range(Range("SELECT_WEEK_FEB").Value).Rows(Replace(Target.Value, "-", ":")).EntireRow.Hidden = False
        End If
    End If
End Sub

【讨论】:

  • 感谢 Naresh,这正是我正在寻找的,一切都说得通。只是一些澄清:当使用(Target.Value,“-”,“:”)定义每周可见的行时,有没有办法总是在给定周项目上方包含 2 行,然后选择项目数?例如在上面的示例中,我希望始终在每个色块上方显示两行作为给定一周的一部分。因此,如果您选择 1-2,您会看到两行标题,然后是项目 1-2?
  • 第二项,请原谅缺乏适应性...在上面提供的示例中,我如何为仅控制第 1 周的“Week_1_items_Feb”添加一个下拉列表,然后为第 2 周添加后续下拉列表, 3, 4 等(例如 Week_2_items_Feb)?您提供的示例当然更简洁,只有一个用于项目数量的切换,但只是想知道如何调整它。再次感谢
  • 看着你的问题和答案,我建议接受这个答案并关闭问题。任何人都很难完全想象数据和下拉列表,因为您似乎想要探索多种场景。因此,这将是一个很长的讨论路径。根据此答案和您的要求,您可以提出一个新问题,其中包含一些示例数据/Excel 工作表和代码的屏幕截图。请用简短的问题细分您的要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多