Excel formula 基于单元格范围的动态日期范围

Excel formula 基于单元格范围的动态日期范围,excel-formula,Excel Formula,我有一系列储存美国联邦假日的牢房。下面的公式计算21个工作日以外的日期。是否有可能为联邦假日设定一个动态日期。所以我不必每年都换。O290-O310是存储日期的地方 =WORKDAY(A305,21,$O$290:$O$310) 如果您只处理给定年份中的日期检查,如果您正在使用WORKDAY公式计算跨越多个年份的日期,则需要在函数中重复将+1添加到年份的列表,或者您需要开发一个不同的计算工作日的函数,这可能需要一些VBA 您需要做的是计算出日期计算的逻辑,并将这些计算值存储在工作表中。现在假设

我有一系列储存美国联邦假日的牢房。下面的公式计算21个工作日以外的日期。是否有可能为联邦假日设定一个动态日期。所以我不必每年都换。O290-O310是存储日期的地方

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

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

您需要做的是计算出日期计算的逻辑,并将这些计算值存储在工作表中。现在假设你在工作表的某个地方有一个日期,或者你提到了工作表中某个人将要处理的年份,你可以尝试以下方法。我将为一月的第三个星期一制定逻辑。然后,您可以使用这个过程来开发您自己的方法来安排类似的假期。查看excel中内置的各种日期操作公式,例如日期、年、月、日、工作日、今天、现在、EOMOUNT等。它们可能对您有很大帮助

处理某个月某日或某周的日期 我用如下表格中的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(B1,1,1))
步骤3)说明星期一是一周中的哪一天

这一点很重要,因为无论您的工作日函数如何定义一周的开始,周一所在的一周中的哪一天都可能有所不同。由于我没有注明B2公式的更改日期,我们可以将星期一的默认值设置为2。因此在B3中:

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

需要知道一个月的第一个工作日和星期一之间的差异,以便调整从本月初到第三个星期一的天数。在B4使用中:

=B3-B2
步骤5)确定到第三个星期一的完整周数

如果差异为第4步为负值或0,则您还有21天的工作时间,如果差异为正值,则您需要14天的工作时间。在B5使用中:

=if(B4<=0,21,14)
步骤7)确定第三个星期一的日期

我们知道年份,我们知道月份,现在我们知道日子。我们把这三个已知值取出来,然后再次使用日期函数。在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)
该公式首先检查工作日是否为周六。W使用返回星期几的函数执行此操作,请参见上面的步骤2)。这是上面等式的一部分:

WEEKDAY(DATE(YEAR(Q10),12,25))
在本例中,它将返回一个整数1到7,该整数对应于date函数产生的星期几。如果它是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语句的真实部分。因此,如果日期不在周六,那么我们将进入if语句的FLASE部分。在这里,我们用第二个IF检查日期是否在周日。我们使用与周六检查相同的理论和过程

IF(WEEKDAY(DATE(YEAR(Q10),12,25))=1,DATE(YEAR(Q10),12,26),DATE(YEAR(Q10),12,25))
将IF语句放在IF语句中通常称为“嵌套”。整个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部分的唯一方法是星期六检查失败,然后星期天检查失败。这意味着你不需要检查工作日是2、3、4、5还是6!它是通过消除星期日和星期六(1和7)的过程中的一个。如果日期是星期一到星期五,我们不需要更改日期,可以保持原样:

DATE(YEAR(Q10),12,25)
假日餐桌 这是一种可能的方式,你可以布局一个假日表

这里没有什么解释。第3行和第4行是相同的信息。不同之处在于,第4行的格式仅显示年份。它实际上是一个完整的日期,就像第三排一样。这与以数字(比如2014年或2016年)的形式进入今年也有很大不同。这些只是数字。你可以走任何你想走的路,但是你需要让你的公式和你提供给他们的东西一起工作

在这个例子中,我只使用了两个假期。一月份的第三个星期一,我们在圣诞节之前解决了这个问题。假期垂直地布置在一年之下,所有公式均参考Q$4。年份标题被复制到右侧,每列的年份增加1。假日公式被复制到右侧。当你这样做的时候,他们会自动将Q改为R,然后是S,然后是T等等,所以他们会
DATE(YEAR(Q10),12,26)
or
DATE(YEAR(Q10),12,25)+1
or
DATE(YEAR(Q10),12,25+1)
DATE(YEAR(Q10),12,25)
=DATE(YEAR(Q4)+1,1,1)