ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的测验 > 函数与公式 > [基础练习]计算指定日期当月有几个周六(已总结评分)

[基础练习]计算指定日期当月有几个周六(已总结评分)

作者:绿色风 分类: 时间:2022-08-18 浏览:133
楼主
wjc2090742
题目:如下图,在A2输入任意日期,C2显示A2日期所在月有几个周六。如示例中,A2为2010-10-4,2010年10月有5个周六。当然,答案不是4就是5。

 

1、2010-11-4开帖。
2、任意方法均可,要求能适应A2日期变化,如果答案有版本限制,请注明。
3、A2日期为1901年之后任意日期。
4、正确答案加分。题目较基础,欢迎广大会员参与抢分。
指定日期当月有几个周六.rar
指定日期当月有几个周六(汇总).rar
2楼
zm0115
=SUM((WEEKDAY(TEXT(A2,"e-m")+ROW(1:31)-1,2)=6)*((MONTH(TEXT(A2,"e-m")+ROW(1:31)-1)=MONTH(A2))))   
数组公式,  长了点,呵呵
3楼
wjh619993018
  1. =SUM((MONTH(A2-DAY(A2)+ROW(1:31))=MONTH(A2))*(MOD(A2-DAY(A2)+ROW(1:31),7)=0))
数组公式
  1. =INT((MOD(A2-DAY(A2),7)+DAY(DATE(YEAR(A2),MONTH(A2)+1,)))/7)
  1. =INT((MOD(A2-DAY(A2),7)+DAY(EOMONTH(A2,0)))/7)
4楼
wangg913

  1. =COUNT(1/(MOD(TEXT(A2,"e-m")&-ROW(1:31),7)=0))
  2. =COUNT(1/(MOD(TEXT(A2,"e-m")&-{29,30,31},7)=0))+4
5楼
mn860429
=SUMPRODUCT(1*(MOD(ROW(INDIRECT((EOMONTH(A2,-1)+1)&":"&(EDATE(A2,1)-DAY(A2)))),7)=0))
07版
6楼
rongjun
公式1:
  1. =SUMPRODUCT(N(MOD(ROW(INDIRECT(A2-DAY(A2)+1&":"&EOMONTH(A2,0))),7)=0))
公式2(适用2010版):
  1. =NETWORKDAYS.INTL(A2-DAY(A2)+1,EOMONTH(A2,0),"1111101")
7楼
piny
70字元
=4+(WEEKDAY(TEXT(A2,"y/m")&"/1")+DAY(DATE(YEAR(A2),MONTH(A2)+1,0))>35)

=============================================================

68字元
=4+(WEEKDAY(TEXT(A2,"y/m/!1"))+DAY(DATE(YEAR(A2),MONTH(A2)+1,0))>35)

=============================================================

65字元
=4+(WEEKDAY(TEXT(A2,"e-m"))+DAY(DATE(YEAR(A2),MONTH(A2)+1,0))>35)

=============================================================

62字元
=4+(WEEKDAY(A2-DAY(A2)+1)+DAY(TEXT(A2-DAY(A2)+32,"e-m")-1)>35)
8楼
水星钓鱼
  1. =SUM(--(TEXT(EOMONTH(A2,-1)+ROW(INDIRECT("1:"&DAY(EOMONTH(A2,0)))),"aaa")="六"))

07/10版通过。
9楼
su11wei18
  1. =SUM(N(WEEKDAY(DATE(YEAR(A2),MONTH(A2),ROW(INDIRECT("1:"&DAY(EOMONTH(A2,0))))))=7))
10楼
君柳
  1. =SUMPRODUCT((MOD(ROW(INDIRECT(EOMONTH(A2,-1)+1&":"&EOMONTH(A2,0))),7)=0)+0)

  1. =COUNT(1/(MOD(TEXT(A2,"e-m")&-ROW(1:31),7)=0))
11楼
ggsmart
试一个,好长好长
=SUM(--(WEEKDAY(DATE(YEAR(A2),MONTH(A2),ROW(INDIRECT("1:"&DAY(DATE(YEAR(A2),MONTH(A2)+1,))))))=7))
12楼
liuguansky
=SUM(N(MOD(TEXT(TEXT(EOMONTH(A2,0),"e-m-")&ROW(1:31),"0;;;!1"),7)=0))
13楼
rongjun
  1. =INT((EOMONTH(A2,0)-FLOOR(A2-DAY(A2),7))/7)
14楼
gouweicao78
45字
  1. =31-COUNT(1/MOD(TEXT(A2,"e-m")&-ROW(1:31),7))
15楼
amulee
  1. =INT((DAY(EOMONTH(A2,0))+WEEKDAY(EOMONTH(A2,-1)+1)-1)/7)
16楼
zhanghi
来个超长数组  =SUM(--(WEEKDAY(EOMONTH(A2,-1)+1+ROW(INDIRECT("1:"&EOMONTH(A2,0)-(EOMONTH(A2,-1)+1))),2)=6))
17楼
biaotiger1
中规中矩的公式
  1. =SUM(N(WEEKDAY(ROW(INDIRECT((A2-DAY(A2)+1)&":"&DATE(YEAR(A2),MONTH(A2)+1,))))=7))
想简化却越简越长的公式
  1. =SUM(N(WEEKDAY(DATE(YEAR(A2),MONTH(A2),ROW(INDIRECT("1:"&DAY(DATE(YEAR(A2),MONTH(A2)+1,)-1)))))=7))
换一个思路
  1. =COUNT(-TEXT(-(WEEKDAY(--(TEXT(A2,"e-m-")&ROW(1:39)))=7),";1"))
换一个函数
  1. =COUNT(-TEXT(-(MOD(-(TEXT(A2,"e-m-")&ROW(1:31)),7)=0),";1"))
再减少一个判断
  1. =COUNT(-TEXT(MOD(-(TEXT(A2,"e-m-")&ROW(1:31)),7),";;1"))
结果
  1. =COUNT(IF(MOD(-(TEXT(A2,"e-m-")&ROW(1:31)),7),"",1))
18楼
mxqchina
  1. =SUMPRODUCT(N(WEEKDAY(ROW(INDIRECT(A2-DAY(A2)+1&":"&DATE(YEAR(A2),MONTH(A2)+1,))))=7))
  1. =SUMPRODUCT(N(MOD(ROW(INDIRECT(A2-DAY(A2)+1&":"&DATE(YEAR(A2),MONTH(A2)+1,)))-2,7)+1=6))
03直接使用。

  1. =SUMPRODUCT(N(WEEKDAY(ROW(INDIRECT(A2-DAY(A2)+1&":"&EOMONTH(A2,0))))=7))

07直接使用,03里如果该函数不可用,并返回错误值 #NAME?,请安装并加载“分析工具库”加载宏。
19楼
JLxiangwei
=IF(MONTH(TEXT(A2,"e-m")-WEEKDAY(TEXT(A2,"e-m"))+35)=MONTH(A2),5,4)
20楼
wise
数组公式,网上查阅了不少资料,总算查到了:
  1. =SUM((WEEKDAY(DATE(YEAR(A2),MONTH(A2),ROW(INDIRECT("1:"&DAY(DATE(YEAR(A2),MONTH(A2)+1,0))))))=7)*1)


21楼
wjc2090742
本次的题目大家采用方法均为函数与公式法。总结之前先推荐一个willin2000版主的大帖,其中有很多日期、时间相关的基本算法。本人的水平有限,这里的分类是个人的看法,总结有欠妥的地方,还请海涵,如果有错或有不足,也请多多指点。
与今天有关的常用计算 http://www.exceltip.net/thread-345-1-1.html


思路1:
基本算法:构建从当月第1天起长31(可以更长,31为下限)的日期数组,并通过2个判断(日期是星期几;日期的月份与给定日期相同)来判断是否给定日期当月的周六,并加和计算。如2楼和3楼的第一个公式。代表公式:
  1. =SUM((MONTH(A2-DAY(A2)+ROW(1:31))=MONTH(A2))*(MOD(A2-DAY(A2)+ROW(1:31),7)=0))
思路2:
基本算法:从当月第1天通过&-row(1:31)构建一个混合的数组(当月日期不足31时,最后几个元素会是错误值),判断数组中日期是否是周六,并用count来忽略错误值进行统计。如4楼、10楼第2个公式、17楼的最终公式,也是本题我自己的思路。代表公式:
  1. =COUNT(1/(MOD(TEXT(A2,"e-m")&-ROW(1:31),7)=0))
算法变化:每个月的1-28日构成4周的完整周期,也就是每月至少有4个周六。所以只需要判断当月是否有29、30、31三日及这3天是否有周六即可。代表公式在4楼:
  1. =COUNT(1/(MOD(TEXT(A2,"e-m")&-{29,30,31},7)=0))+4
思路3:
基本算法:(当月天数+上月末日期是1周的第几天(以周日为1周第1天))/7,然后向下取整。该算法本人不是很理解,可以参考下帖:
计算两个日期之间有多少个星期六天数的自定义函数? http://www.exceltip.net/thread-12044-1-1.html

如3楼的后2个公式、15楼。代表公式:
  1. =INT((MOD(A2-DAY(A2),7)+DAY(EOMONTH(A2,0)))/7)
算法变化:用(当月天数+月初日期是1周的第几天(以周日为1周第1天))>35来判断是否当月是否存在第5个周六。如6楼、19楼。代表公式:
  1. =4+(WEEKDAY(A2-DAY(A2)+1)+DAY(TEXT(A2-DAY(A2)+32,"e-m")-1)>35)
思路4:
基本算法:从当月第1天起,构建长度为当月天数的日期数组,判断日期是否是周六,将判断结果转化成数值后加和。这是本题中见到最多的算法,主要有3种写法,一是用ROW(ININDIRECT(首日:末日)),如6楼第1个公式、10楼第1个公式、17楼第1个思路、18楼;一种是在DATE中第3参数使用ROW(ININDIRECT(1:当月天数)),如9楼、11楼、20楼;一种是月初日期+ROW(ININDIRECT(1:当月天数)),如8楼(8楼使用TEXT来替代WEEKDAY或MOD进行判断,也是本题一个变化)。代表公式:
  1. =SUMPRODUCT(N(MOD(ROW(INDIRECT(A2-DAY(A2)+1&":"&EOMONTH(A2,0))),7)=0))
思路5:
基本算法:利用EXCEL2010的新函数NETWORKDAYS.INTL,自定义为一周仅周六为工作日,计算当月有几个工作日,即几个周六。见4楼。
  1. =NETWORKDAYS.INTL(A2-DAY(A2)+1,EOMONTH(A2,0),"1111101")
思路6:
基本算法:(月末日期-上月最后1个周六)/7,然后取整。本人认为这个思路是思路3的一个变形,但是实在是太棒了,所以独立写为1个思路。另外,本人也曾套用这个算法来计算zm0115兄的“钱币之月”题目,完全成立。详细的思路待荣版有空分析,公式在13楼。
  1. =INT((EOMONTH(A2,0)-FLOOR(A2-DAY(A2),7))/7)
22楼
wjc2090742
本题评分定为:
1、答案正确+3技术,视答案精彩程度+1~4技术。
2、以ET鼓励多种思路原则,多种思路+3魅力,以ET积极挖掘Excel2010新性能原则,新函数公式+2魅力。
3、因为比如计算当月第一天有TEXT、DATE、EOMONTH、A2-DAY(A2)+1等诸多基础算法,本题中此类写法不同不算为不同思路。而以上楼思路及变化分类判断是否多种思路。
另,再次感觉到了总结的困难和评分的尺度难把握。可能很难让所有人都满意,如何对测试题衡量分值,也是ET需要进一步探索的。如果对总结或评分有异议或有不妥的地方,请不要客气的指出,将在版主们商议后进行调整。

 
23楼
苹果
能不能上传下附件。。
24楼
苹果
A2是什么 ,附件上传下,好吗
25楼
wjc2090742


题目和答案汇总在1楼。
26楼
w83365040371
  1. =COUNT(0/(WEEKDAY(TEXT(A2,"e-m-")&ROW(1:31),2)=6))

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap