动态更改一个月中的天数以进行下拉
Dynamically change the number of days in a month for dropdown
必须在没有 VBA 的情况下完成。
我有一个月份列表要填写在一个单元格中,比如 A1。可以使用 Data Validation-List (=Months) 填充选项,这会导致下拉列表出现在 A1 中。在单元格 B1 中,我输入了一个年份数字(例如 2000)。
现在我希望 C1 包含一个下拉列表,其中的条目根据 A1 和 B1 中的数据而变化。在我的示例中,A1 提供了 1 月、2 月、3 月、4 月、5 月、6 月、7 月、8 月、9 月、10 月、11 月和 12 月的选项。
如果我 select 一月或三月或五月或七月或八月或十月或十二月(有 31 天的月份),我应该在 C1 中选择 1 到 31 之间的数字。
如果我 select 4 月或 6 月或 9 月或 11 月(有 30 天的月份),我应该在 C1 中选择 1 到 30 之间的数字。
如果我 select 二月,我必须首先使用以下公式检查年份是否为闰年:
=((MOD(B1;4)=0)*((MOD(B1;100)<>0)+(MOD(B1;400)=0))=1)
根据这个公式的结果(真或假),我应该得到 1 到 28 之间的数字(如果是闰年,则为 29)作为 C1 中的一个选项。
我创建了列表,分别命名为 Days30、Days31、Days28 和 Days29。我如何使用数据验证在 C1 中的下拉列表的这些列表之间切换?我正在尝试将此逻辑转换为数据验证公式,但没有成功:
If (A1 = "april" OR A1 = "june" OR A1 = "september" OR A1 = "november") Then
Days30
ElseIf (A1 = "february" AND leapyear = 1) Then
Days29
ElseIf (A1 = "february" AND leapyear = 0) Then
Days28
Else
Days31
End if
- 在 Z1 中输入这个公式,
=DAY(DATEVALUE(A&" "&ROW(1:1)&", "&B))
- 在 Z2 中输入此公式,
=IFERROR(IF(MONTH(DATEVALUE(A&" "&ROW(1:1)&", "&B))=MONTH(DATEVALUE(A&" "&ROW(2:2)&", "&B)), DAY(DATEVALUE(A&" "&ROW(2:2)&", "&B)), ""), "")
... 并向下填充至 Z31。
- 转到公式 } 定义的名称 } 名称管理器。当“名称管理器”对话框打开时,单击 新建。
- 为其命名(例如 lstDOM),将其保留为 Workbook 范围并为 Refers to 提供以下内容:
=Sheet1!$Z:INDEX(Sheet1!$Z:$Z, MATCH(1e99, Sheet1!$Z:$Z))
- 单击确定 创建动态命名范围,然后关闭。
- 选择 C1 后,转到数据 } 数据工具 } 数据验证。选择允许:列出并为来源提供
=lstDOM
:
您的结果应类似于以下内容。
必须在没有 VBA 的情况下完成。
我有一个月份列表要填写在一个单元格中,比如 A1。可以使用 Data Validation-List (=Months) 填充选项,这会导致下拉列表出现在 A1 中。在单元格 B1 中,我输入了一个年份数字(例如 2000)。 现在我希望 C1 包含一个下拉列表,其中的条目根据 A1 和 B1 中的数据而变化。在我的示例中,A1 提供了 1 月、2 月、3 月、4 月、5 月、6 月、7 月、8 月、9 月、10 月、11 月和 12 月的选项。
如果我 select 一月或三月或五月或七月或八月或十月或十二月(有 31 天的月份),我应该在 C1 中选择 1 到 31 之间的数字。
如果我 select 4 月或 6 月或 9 月或 11 月(有 30 天的月份),我应该在 C1 中选择 1 到 30 之间的数字。
如果我 select 二月,我必须首先使用以下公式检查年份是否为闰年:
=((MOD(B1;4)=0)*((MOD(B1;100)<>0)+(MOD(B1;400)=0))=1)
根据这个公式的结果(真或假),我应该得到 1 到 28 之间的数字(如果是闰年,则为 29)作为 C1 中的一个选项。
我创建了列表,分别命名为 Days30、Days31、Days28 和 Days29。我如何使用数据验证在 C1 中的下拉列表的这些列表之间切换?我正在尝试将此逻辑转换为数据验证公式,但没有成功:
If (A1 = "april" OR A1 = "june" OR A1 = "september" OR A1 = "november") Then
Days30
ElseIf (A1 = "february" AND leapyear = 1) Then
Days29
ElseIf (A1 = "february" AND leapyear = 0) Then
Days28
Else
Days31
End if
- 在 Z1 中输入这个公式,
=DAY(DATEVALUE(A&" "&ROW(1:1)&", "&B))
- 在 Z2 中输入此公式,
=IFERROR(IF(MONTH(DATEVALUE(A&" "&ROW(1:1)&", "&B))=MONTH(DATEVALUE(A&" "&ROW(2:2)&", "&B)), DAY(DATEVALUE(A&" "&ROW(2:2)&", "&B)), ""), "")
... 并向下填充至 Z31。 - 转到公式 } 定义的名称 } 名称管理器。当“名称管理器”对话框打开时,单击 新建。
- 为其命名(例如 lstDOM),将其保留为 Workbook 范围并为 Refers to 提供以下内容:
=Sheet1!$Z:INDEX(Sheet1!$Z:$Z, MATCH(1e99, Sheet1!$Z:$Z))
- 单击确定 创建动态命名范围,然后关闭。
- 选择 C1 后,转到数据 } 数据工具 } 数据验证。选择允许:列出并为来源提供
=lstDOM
:
您的结果应类似于以下内容。