【发布时间】: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 - 感谢您的指点,我一定会继续使用这些!