动态日期范围基于一系列单元格

时间:2016-05-04 12:25:36

标签: excel-formula

我有一系列细胞存放美国联邦假期。然后,下面的公式计算出21个工作日的日期。是否可以为联邦假期设定动态日期。所以我不必每年都改变它们。 O290-O310是存储日期的地方。

=WORKDAY(A305,21,$O$290:$O$310)

1 个答案:

答案 0 :(得分:0)

如果您只处理在给定年份中检查日期,以下情况将起作用,如果您正在考虑使用WORKDAY公式计算跨越多年的日期,您将需要重复列表,在年份中添加+1这个函数,或者你需要开发一个不同的函数来计算工作日,这可能需要一些VBA。

您需要做的是弄清楚如何计算日期的逻辑并将这些计算值存储在工作表中。现在假设您在工作表中的某个位置有一个日期,或者您在工作表中指的是您将要处理的年份,您可以尝试以下操作。我将在1月的第3个星期一开发逻辑。然后你可以使用这个过程开发自己的方法来提出类似的假期。看看excel中内置的各种内置日期操作公式,如DATE,YEAR,MONTH,DAY,WEEKDAY,TODAY,NOW,EOMONTH等,它们可能对您有很大的帮助。

处理日期为X天或周的日期

我在这样的表中使用7个步骤计算出日期:

(A)                         |     (B)
Year                        |     2014
Weekday of 1st day of month |        4
Weekday number for Monday   |        2
Difference                  |       -2
3rd Monday                  |       21
Days from start of month    |       20
Target date                 | 14/01/20

步骤1)确定年份。

在单元格B1中,我使用2014年提供的硬编码,但这也可能是

=YEAR(Q10)

如果Q10是您工作单上的某个单元格,其日期在您正在使用的范围内,如果您在单元格中只有2017年的年份数字,那么您可以指向该单元格而没有年份。

步骤2)确定该月的第一天是哪一天。

为了做到这一点,我们结合了WEEKDAY函数中嵌入的DATE函数。因为我们知道正在处理1月和第一天我们可以硬编码。在B2中使用:

=WEEKDAY(DATE(B1,1,1))

步骤3)说明周一的星期几。

这一点非常重要,因为您的工作日函数不会定义一周的开始,星期一的星期几可能会有所不同。因为我没有在B2公式中更改日期,所以我们可以将星期一的默认值提供为2.所以在B3中:

=2

步骤4)找出月份的第一个工作日和星期一之间的差异

需要知道当月第一个工作日与星期一之间的差异,以便调整自第三个星期一下降之日起的天数。在B4中使用:

=B3-B2

步骤5)确定整周到第三个星期几。

如果差异是步骤4为负或0,则还有21天可以使用,如果是积极的,则需要工作14天。在B5中使用:

=if(B4<=0,21,14)

步骤6)第3个星期一的某一天

所以基本上我们需要使用B4广告B5,这将告诉我们从第一个星期一开始的月份开始的天数。在B6中使用:

=B5+B4+1

步骤7)确定第3个星期一的日期

我们知道这一年,我们知道这个月,现在我们知道这一天。我们采用这三个知识并再次使用DATE函数。在B7中使用:

=date(B1,1,B6)

现在,如果您想将所有内容替换为单个单元格中的一个公式,它将类似于:

=DATE(2014,1,IF(2-WEEKDAY(DATE(2014,1,1))<=0,21,14)+2-WEEKDAY(DATE(2014,1,1))+1)

请记住,2014年将来自您的电子表格,要么使用带有年份的单元格,要么使用带有日期的单元格,并使用该单元格上的YEAR()公式。

处理周六或周日的假期

我们需要再次参考电子表格中的一些单元格,以便我再次使用Q10作为示例,我们将假设日期为2014/10/24。

=IF(WEEKDAY(DATE(YEAR(Q10),12,25))=7,DATE(YEAR(Q10),12,24),IF(WEEKDAY(DATE(YEAR(Q10),12,25))=1,DATE(YEAR(Q10),12,26),DATE(YEAR(Q10),12,25)))

公式首先检查工作日是星期六。 W使用将返回星期几的函数执行此操作,请参阅上面的步骤2)。这部分来自上面的等式:

WEEKDAY(DATE(YEAR(Q10),12,25))

在这种情况下,它将返回与日期函数产生的星期几相对应的单个整数1到7。如果它是1我们知道它的星期日,如果它的7我们知道星期六。所以星期六的支票是:

WEEKDAY(DATE(YEAR(Q10),12,25))=7

如果WEEKDAY()= 7为真,那么我们提供前一天的日期,实际上只是从我们看到的日期减去1。我们使用公式的这一部分来计算:

DATE(YEAR(Q10),12,24)

注意我如何将当天从25改为24.另一种方法是回收我们的日期,让计算机使用以下公式再做一次计算:

DATE(YEAR(Q10),12,25)-1
or
DATE(YEAR(Q10),12,25-1)

这一切都位于if语句的TRUE部分。因此,如果日期不在星期六,那么我们将在IF声明的FLASE部分结束。在这里,我们用第二个IF检查星期日的日期。我们使用与周六检查相同的理论和流程。

IF(WEEKDAY(DATE(YEAR(Q10),12,25))=1,DATE(YEAR(Q10),12,26),DATE(YEAR(Q10),12,25))

在IF语句中放置IF语句通常称为&#34;嵌套&#34;。整个IF语句发生在前一个IF的FALSE部分,检查它是否是星期六。这次我们检查了星期天:

WEEKDAY(DATE(YEAR(Q10),12,25))=1

如果这是真的,那么我们需要将日期增加1天,而不是像星期六那样减少日期:

DATE(YEAR(Q10),12,26)
or
DATE(YEAR(Q10),12,25)+1
or
DATE(YEAR(Q10),12,25+1)

这是周日检查的真实部分。从逻辑上讲,获取此嵌套IF语句的FALSE部分的唯一方法是使星期六检查失败,然后不通过星期日检查。这意味着你不需要经历并检查WEEKDAY是否为2,3,4,5或6!它是通过消除星期日和星期日(1和7)的过程之一。如果日期是星期一到星期五,我们不需要更改日期,可以保持原样:

DATE(YEAR(Q10),12,25)

HOLIDAY TABLE

这是一种可以布置假日表的潜在方式。

Holiday Table

这里的解释很少。第3行和第4行是相同的信息。区别在于第4行被格式化为仅显示年份。它实际上是第3行的完整日期。这与2014年或2016年的数字输入年份大不相同。这些只是数字。你可以去任何你想要的路线,但是你需要让你的公式与你提供的东西一起工作。

在这个例子中,我只使用了两个假期。 1月的第三个星期一例子我们之前和圣诞节案例一起制定了。这些假期在年底垂直排列,所有公式都参考Q $ 4。年份标题被复制到右侧,每列增加1。假日公式被复制到右侧。当你这样做时,他们会自动将Q改为R然后是S然后改为T等等,所以他们总是会引用他们上面的年份。

然后当你使用你的工作日公式时,不是引用$ Q $ 5:$ Q $ 6这个例子你会引用$ Q $ 5:$ V $ 6.

在R3或R4中推进日期的公式为:

=DATE(YEAR(Q4)+1,1,1)