关于excel:动态更改下拉列表中一个月的天数

Dynamically change the number of days in a month for dropdown

必须在没有VBA的情况下完成。

我有一个月的清单要填写在一个单元格中,比如a1。可以使用数据验证列表(=months)填充选项,该列表会导致下拉列表出现在A1中。在单元格b1中,我输入年份号(例如2000)。现在,我希望c1包含一个下拉列表,其中的条目根据a1和b1中的数据变化。在我的示例中,A1提供了1月、2月、3月、4月、5月、6月、7月、8月、9月、10月、11月和12月选项。

如果我选择1月、3月、5月、7月、8月、10月或12月(有31天的月份),我应该在C1中选择1到31之间的数字。

如果我选择4月、6月、9月或11月(30天的月份),我应该在c1中得到1到30之间的数字作为选项。

如果我选择二月,我必须首先使用以下公式检查年份是否为闰年:

1
=((MOD(B1;4)=0)*((MOD(B1;100)<>0)+(MOD(B1;400)=0))=1)

根据这个公式的结果(对或错),我应该得到1到28之间的数字(如果是闰年,则为29),作为C1中的一个选项。

我已经创建了名为days30、days31、days28和days29的列表。如何使用数据验证在c1的下拉列表之间切换??我正在尝试将此逻辑转换为数据验证公式,但没有运气:

1
2
3
4
5
6
7
8
9
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$1&""&ROW(1:1)&","&B$1))
  • 在z2中,放入这个公式,

    =IFERROR(IF(MONTH(DATEVALUE(A$1&""&ROW(1:1)&","&B$1))=MONTH(DATEVALUE(A$1&""&ROW(2:2)&","&B$1)), DAY(DATEVALUE(A$1&""&ROW(2:2)&","&B$1)),""),"")

    填到Z31。

  • 转到公式?定义的名称?姓名经理。当名称管理器对话框打开时,单击NEW
  • 为其命名(例如lstdom),将其保留为工作簿范围,并为引用提供以下内容:
    =Sheet1!$Z$1:INDEX(Sheet1!$Z:$Z, MATCH(1e99, Sheet1!$Z:$Z))

    dynamic named range

  • 单击ok创建动态命名范围,然后单击close
  • 选择C1后,转到数据?数据工具?数据验证。选择允许:列出并提供源的=lstDOM
  • 您的结果应该类似于以下内容。

    &dynamic range days of month