Excel Weekday 函数,查找星期几

Excel Weekday function, finding day in week

我有一个 sheet 和一些日期,要查找星期一、星期二和星期四,我使用此代码

=HVIS.FEJL(SAMMENLIGN(DATO(ÅR(Året!$B);1;-2)-UGEDAG(DATO(ÅR(Året!$B);1;3))+AG5*7;Året!$B:$B;0);"")

它会找到星期一,并且工作正常 - 当我查看星期二和星期四时,我更改了 "UGEDAG"..;1 中的第一个数字;星期四为 0 或星期二为 -2,我正在逐步尝试一些数字,最后得到这些数字,有人能告诉我原因吗: 1 = 星期一(我想我知道为什么)但是,-2 = 星期二和 0 = 星期四

有人可以向我解释为什么会有这些数字吗? Hvis.Fejl 是 If.Error,Sammenlign 是火柴,Ugedag 是工作日,År 是年。

我认为原始公式中发生的事情是这样的:

  1. 无论 B2 中的日期是什么,我们都采用之前的 12/29
  2. 然后,我们将使用此信息来确定前一个星期一

WEEKDAY 函数为一周中的每一天提供一个从星期日开始的数字。从本质上讲,这可以被认为是星期六之后的天数。因此,从 always 中减去星期六的偏移量将始终使我们回到一周的第一个星期六。

此公式:WEEKDAY(DATE(YEAR(Sheet1!$B$2),1,3)) 或更准确地说,您的 UGEDAG(DATO(ÅR(Året!$B$2);1;3)),在 sheet 的单元格 B2 中询问 1 月 3 日是一年中的哪一天,然后它被用来确定前一年 29 日之前的星期一。换句话说,它询问一年中第 3 天距星期六的偏移量,并使用此起点来确定较早的星期一。要在星期二或星期四使用它,可能更有意义的是改变日期(即 3)而不是月份(即 1)。要获得星期一,请使用 3。要获得星期二,您将使用 2(从星期一向前一天,您将减去一天)。由于一周中的第几天是 Mod 7,要获得星期四,您将再返回两天并使用 0(或者更可能是 7,因为任何一个月的第 0 天似乎并不总是合乎逻辑)。

你看到的是,如果你按照你描述的那样改变月份,它的工作原理是相似的,特别是因为你将它限制在前一年的 12 月(第 0 个月)和当年的 1 月(第 1 个月) , 和上一年的十月 (-2 月)。原因是这些月份的第 3 天与我一周中的日子的相关方式相同,你永远不会越过二月,二月的天数并不总是相同。

换句话说,我使用 3 的偏移量来计算我的星期一,我使用 2 的偏移量来计算我的星期二,我使用 7(或 0)来计算我的星期四。这些将给出任何给定年份的 1 月 3 日、1 月 2 日和 1 月 7 日星期六的偏移量。

您巧合使用的数字是相同的偏移量(因为它们从未穿过二月)。换句话说,很简单,你的 1 月 3 日和我的 1 月 3 日是同一天。同样,我的 1 月 2 日与您的 10 月 3 日在同一天,而我的 1 月 7 日将始终与您的 12 月 3 日在一周中的同一天。

我希望这可以帮助您确定您想要了解的内容。

以下是我在上面输入的公式可能会使用的内容:

星期一:

=HVIS.FEJL(SAMMENLIGN(DATO(ÅR(Året!$B);1;-2)-UGEDAG(DATO(ÅR(Året!$B);1;3))+AG5*7;Året!$B:$B;0);"")

星期二:

=HVIS.FEJL(SAMMENLIGN(DATO(ÅR(Året!$B);1;-2)-UGEDAG(DATO(ÅR(Året!$B);1;2))+AG5*7;Året!$B:$B;0);"")

星期四:

=HVIS.FEJL(SAMMENLIGN(DATO(ÅR(Året!$B);1;-2)-UGEDAG(DATO(ÅR(Året!$B);1;7))+AG5*7;Året!$B:$B;0);"")

我希望这可以远程响应您的问题。

我很欣赏额外的细节,但我可能永远无法完全理解 sheet 在做什么。我认为正在发生的事情是,由于 2017 年 12 月 29 日是星期五,您正在进行的计算选择了 12/22(星期五)和 12/28(星期四)之间的日期。换句话说,公式 DATO(ÅR(Året!$B$2);1;-2) 会人为地将星期五设为一周的第一天。如果这些是 2017 年的几天,我们会看到这个问题从星期四开始(星期日到星期三是一周,星期四到星期六是另一周)。这可能是因为你如何定义 WEEKNUM (UGE.NR) 因为有一个参数告诉它使用星期几,但我怀疑问题来自于选择前一年的 12 月 29 日。我想你想在年底的一周中的特定一天进行结算,然后从那里开始计算。

在了解更多的情况下,我认为我们应该更改此计算:

=HVIS.FEJL(SAMMENLIGN(DATO(ÅR(Året!$B);1;-2)-UGEDAG(DATO(ÅR(Året!$B);1;3))+AG5*7;Året!$B:$B;0);"")

我认为它没有满足您的需求。我认为这将在星期一给出相同的结果:

=HVIS.FEJL(SAMMENLIGN(HELTAL(DATO(ÅR(Året!$B);1;-2)/7)*7+2+AG5*7;Året!$B:$B;0);"")

其中 HELTAL(DATO(ÅR(Året!$B$2);1;-2)/7)*7 给出前一年最后一个完整周的星期六(我认为 HELTAL 是 INT)和我们加 2 到星期一。这似乎更容易理解,因为将“+2”更改为“+3”会给你星期二:

=HVIS.FEJL(SAMMENLIGN(HELTAL(DATO(ÅR(Året!$B);1;-2)/7)*7+3+AG5*7;Året!$B:$B;0);"")

将其更改为“+5”会给你星期四

=HVIS.FEJL(SAMMENLIGN(HELTAL(DATO(ÅR(Året!$B);1;-2)/7)*7+5+AG5*7;Året!$B:$B;0);"")

由于我们是从周日开始的,我认为您不会看到使用周五 (+6) 或周六 (+7) 的现有公式所遇到的问题。

您可能需要稍微调整一下公式,但我认为这会让您更接近您的需要。

我必须承认,无论您对问题的描述如何,都没有明确定义。我从这里的所有讨论中收集到的是你想在 12 月 29 日之前弄清楚 'Monday'?是吗 ?如果这是绊脚石,那么这是一个巧妙的解决方案(假设 C3 的日期是 29/Dec):

=WORKDAY.INTL(C3,-1,"0111111")

将为您提供 12 月 29 日之前的日期,即星期一... 要在 12 月 29 日之前获得星期二,请使用此 -

=WORKDAY.INTL(C3,-1,"1011111")

请参阅公式的 'weekend' 部分,我们说这一天(我们想要的任何一天)是 FALSE(不是周末)其余都是周末(TRUE (1))...

希望您能够从这里构建剩余的公式....