我有一个简单的表。这个数据是2023年1月的。
我想数一下星期一"A"的数目。我试过了=COUNTIFS(C3:AG3,"A",$C$2:$AG$2,WEEKDAY($C$2:$AG$2)=2)但是我没有得到正确的结果
=COUNTIFS(C3:AG3,"A",$C$2:$AG$2,WEEKDAY($C$2:$AG$2)=2)
我哪里做错了?
vngu2lb81#
您应该像@Harun24HR那样使用带有DOUBLE -ve的SUMPRODUCT。双负数将强制TRUE和FALSE的值变为1的和0的。由于您的日期实际上只是数字(* 我同意@Rory的观点,即使用日期而不是数字是一个更好的主意。*),您必须将它们转换为日期,您使用DATE()和WEEKDAYS()的想法是绝对正确的!请记住,WEEKDAYS()的语法是WEEKDAY(serial_number,[return_type])基于return_type,WEEKDAYS()将返回不同的日期。你需要的公式是
SUMPRODUCT
TRUE
FALSE
DATE()
WEEKDAYS()
WEEKDAY(serial_number,[return_type])
return_type
=SUMPRODUCT(--(WEEKDAY(DATE(2023,1,$C$5:$AG$5))=2)*(C6:AG6="A"))
尽管您没有要求这样做,但我还是想分享一下为什么使用SUMPRODUCT()是更好的选择。假设您要计算A,它不仅福尔斯在星期一,而且出现在星期五。(* 我想到这个问题是因为在我工作的公司,如果员工在星期五或星期一未经批准休假,那么周末也会计算在内。*)在这种情况下,不使用=SUMPRODUCT(--(WEEKDAY(DATE(2023,1,$C$5:$AG$5))=6)*(C6:AG6="A")) + SUMPRODUCT(--(WEEKDAY(DATE(2023,1,$C$5:$AG$5))=2)*(C6:AG6="A")),则可以使用+ for OR条件来处理这两种情况。=SUMPRODUCT(--((WEEKDAY(DATE(2023,1,$C$5:$AG$5))=2)+(WEEKDAY(DATE(2023,1,$C$5:$AG$5))=6))*(C6:AG6="A"))
SUMPRODUCT()
=SUMPRODUCT(--(WEEKDAY(DATE(2023,1,$C$5:$AG$5))=6)*(C6:AG6="A")) + SUMPRODUCT(--(WEEKDAY(DATE(2023,1,$C$5:$AG$5))=2)*(C6:AG6="A"))
+
OR
=SUMPRODUCT(--((WEEKDAY(DATE(2023,1,$C$5:$AG$5))=2)+(WEEKDAY(DATE(2023,1,$C$5:$AG$5))=6))*(C6:AG6="A"))
ttvkxqim2#
实际上并不需要使用WEEKDAY,因为你计算的是星期一,而每个星期一都发生在值为W/O的星期日之后。
W/O
要获取输出的公式是数组公式(必须按Ctrl + Shift + Enter输入,否则无效):
=SUMPRODUCT(--(TRANSPOND(C3:AF3)&TRANSPOND(D3:AG3)="W/OA"))+IF(AND(H3&I3="W/OW/O",C3="A"),1,0)
IF部分只是检查月份是否从星期一开始,值为A。我们通过检查第六天和第七天是否是周末(值为W/O)来检查月份的第一天是否是星期一。它是这样工作的:
(TRANSPOND(C3:AF3)&TRANSPOND(D3:AG3)
1.前面的公式被 Package 在Double Unary Operator中,Double Unary Operator将检查前面的数组是否有任何连接字符串等于W/OA。如果为真,将返回1,否则返回0。由于它是SUMPRODUCT,它将对所有值求和,在本例中将得到int输出5。
W/OA
A
If the month starts on Monday, it works
x0fgdtte3#
使用SUMPRODUCT()。
=SUMPRODUCT(--(WEEKDAY($C$2:$AG$2)=2)*(C3:AG3="A"))
wmtdaxz34#
所以这是你要考虑的,并显示如何确定星期一:
你可以考虑如何处理你的数据。
4条答案
按热度按时间vngu2lb81#
您应该像@Harun24HR那样使用带有DOUBLE -ve的
SUMPRODUCT
。双负数将强制TRUE
和FALSE
的值变为1的和0的。由于您的日期实际上只是数字(* 我同意@Rory的观点,即使用日期而不是数字是一个更好的主意。*),您必须将它们转换为日期,您使用
DATE()
和WEEKDAYS()
的想法是绝对正确的!请记住,
WEEKDAYS()
的语法是WEEKDAY(serial_number,[return_type])
基于return_type
,WEEKDAYS()将返回不同的日期。你需要的公式是
尽管您没有要求这样做,但我还是想分享一下为什么使用
SUMPRODUCT()
是更好的选择。假设您要计算A,它不仅福尔斯在星期一,而且出现在星期五。(* 我想到这个问题是因为在我工作的公司,如果员工在星期五或星期一未经批准休假,那么周末也会计算在内。*)
在这种情况下,不使用
=SUMPRODUCT(--(WEEKDAY(DATE(2023,1,$C$5:$AG$5))=6)*(C6:AG6="A")) + SUMPRODUCT(--(WEEKDAY(DATE(2023,1,$C$5:$AG$5))=2)*(C6:AG6="A"))
,则可以使用+
forOR
条件来处理这两种情况。=SUMPRODUCT(--((WEEKDAY(DATE(2023,1,$C$5:$AG$5))=2)+(WEEKDAY(DATE(2023,1,$C$5:$AG$5))=6))*(C6:AG6="A"))
ttvkxqim2#
实际上并不需要使用WEEKDAY,因为你计算的是星期一,而每个星期一都发生在值为
W/O
的星期日之后。要获取输出的公式是数组公式(必须按Ctrl + Shift + Enter输入,否则无效):
IF部分只是检查月份是否从星期一开始,值为A。我们通过检查第六天和第七天是否是周末(值为
W/O
)来检查月份的第一天是否是星期一。它是这样工作的:
(TRANSPOND(C3:AF3)&TRANSPOND(D3:AG3)
会将行转换为列并进行连接。请注意,第一个TRANSPOND排除了第31天,第二个TRANSPOND排除了第1天。这是因为星期一总是在星期天之后,所以我们检查了除第1天之外的所有日期。这将创建一个如下所示的数组(Employee5的可视化示例):1.前面的公式被 Package 在Double Unary Operator中,Double Unary Operator将检查前面的数组是否有任何连接字符串等于
W/OA
。如果为真,将返回1,否则返回0。由于它是SUMPRODUCT,它将对所有值求和,在本例中将得到int输出5。A
值检查每月的第一天是否是星期一(记住我们在第1步中排除了第一天检查),因此必须这样做。将根据情况在以前的输出中添加1或0。检查第一张图片上的示例If the month starts on Monday, it works
以更好地理解。x0fgdtte3#
使用
SUMPRODUCT()
。wmtdaxz34#
所以这是你要考虑的,并显示如何确定星期一:
你可以考虑如何处理你的数据。