dynamic更改一个月下拉天数

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

A1,我有一个单元格的列表,填写一个单元格。 可以使用数据validation列表(=月)填充选项,这会导致在A1中出现下拉菜单。 在B1单元格中input年份号码(例如2000)。 现在我想让C1包含一个下拉列表,其中的条目根据A1和B1中的数据进行更改。 在我的例子中,A1提供了一月,二月,三月,四月,五月,六月,八月,九月,十月,十一月和十二月的select。

如果我select一月或三月或五月或七月或八月或十月或十二月(31天的月份),我应该得到1到31之间的数字作为C1中的一个选项。

如果我select四月或六月或九月或十一月(30天的月份),我应该得到1到30之间的数字作为C1中的一个选项。

如果我select二月,我必须首先检查一年是不是闰年用这个公式:

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

根据这个公式的结果(TRUE或FALSE),我应该在C1中获得1到28之间的数字(或者29,如果是闰年)。

我创build了名为Days30,Days31,Days28和Days29的列表。 我怎样才能使用数据validation来切换这些列表为我在C1下拉列表? 我试图将这个逻辑转换成数据validation公式,但没有运气:

 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 

  1. 在Z1把这个公式,

    =DAY(DATEVALUE(A$1&" "&ROW(1:1)&", "&B$1))

  2. 在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。

  3. 转到公式►定义名称►名称pipe理器。 名称pipe理器对话框打开时,单击新build
  4. 给它一个名字(例如lstDOM),把它作为工作簿的范围,并提供以下的指引:
    =Sheet1!$Z$1:INDEX(Sheet1!$Z:$Z, MATCH(1e99, Sheet1!$Z:$Z))

    动态命名的范围

  5. 单击确定以创builddynamic命名范围,然后closures
  6. selectC1后,进入数据►数据工具►数据validation。 为Source:selectAllow:List and supply =lstDOM

你的结果应该类似于以下内容。

一个月的动态范围