ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的测验 > 综合应用 > 如何计算“钱币之月"

如何计算“钱币之月"

作者:绿色风 分类: 时间:2022-08-18 浏览:108
楼主
zm0115
2010年的10月份有5个星期五,5个星期六,5个星期日,这种月份被认为是"钱币之月"。
要求:请在B1选择月份,从B2单元格开始从小到大列出钱币之月的年份。最小年份1900年,最大年份3000年。
限制:无任何限制,可以采取认为合理各种方法完成。
C列为10月份"钱币之月"的年份参考答案

 



题目很简单,欢迎大家参与,10月20日公开,谢谢!

是在抱歉,上周一直在出差,直到今日才想起来要结帖,对不起大家了。
先上我的答案,=TEXT(SMALL(IF((WEEKDAY(DATE(1899+ROW($1:$1101),$B$1,1),2)=5)*(DAY(DATE(1900,$B$1+1,0))=31),1899+ROW($1:$1101),3001),ROW(1:1)),"[<3001]0;;")  数组公式

钱币之月.rar


说明:所谓“钱币之月”其实很简单,符合2个条件即可,1)该月为31天。2)该月的第一天为星期五。就能得到该月有“有5个星期五,5个星期六,5个星期日”。
2楼
wjc2090742
  1. =TEXT(SMALL(IF(MMULT(--TEXT(MOD(TEXT(ROW($1900:$3000)&-$B$1&-COLUMN(A:AE),"0;;;!3"),7),"[<2]1;[=6]1;!0"),ROW($1:$31)^0)=15,ROW($1900:$3000),4^8),ROW(A1)),"[<3001]0年;")


先来个长的,直接的思路。话说这个公式效率实在是低,运算卡死了。先保证有答案了再说。
钱币之月new.rar
3楼
wjc2090742
  1. =TEXT(SMALL(IF(MMULT(N(WEEKDAY(TEXT(ROW($1900:$3000)&-$B$1&-COLUMN(A:AE),"0;;;!3"),2)>4),ROW($1:$31)^0)=15,ROW($1900:$3000),4^8),ROW(A1)),"[<3001]0年;")


第一次修改。以及第一次修改的07版公式:

  1. =IFERROR(SMALL(IF(MMULT(N(WEEKDAY(TEXT(ROW($1900:$3000)&-$B$1&-COLUMN(A:AE),"0;;;!3"),2)>4),L1:L31+1)=15,ROW($1900:$3000)),ROW(A1)),"")
4楼
piny
B2=IF(OR(B$1={2,4,6,9,11}),"",SUBSTITUTE(SMALL(IF(WEEKDAY(DATE(1899+ROW($1:$1101),B$1,1))=6,1899+ROW($1:$1101),9999),ROW(A1))&"年",9999&"年",))

數組 下拉

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

再少二字元

B2=IF(OR(B$1={2,4,6,9,11}),"",SUBSTITUTE(SMALL(IF(WEEKDAY(DATE(1899+ROW($1:$1101),B$1,1))=6,1899+ROW($1:$1101),5^5),ROW(A1))&"年",5^5&"年",))
5楼
biaotiger1
楞凑了一个出来,重在掺和一下吧。也为今天多发一个贴。
定义了名称:日期=
  1. =ROW(INDIRECT("1:"&DAY((钱币之月!$B$1+1&"-1")-1)))
公式如下:
  1. =SMALL(IF(MMULT(N(WEEKDAY(ROW($1900:$3000)&"-"&B$1&"-"&TRANSPOSE(日期),2)>4),日期^0)=15,ROW($1900:$3000),""),ROW(A48))
未防错。

详见附件。


标记1:
  1. =SMALL(IF(WEEKDAY(DATE(ROW($1900:$3000),$B$1+{0,1},))={5,1},ROW($1900:$3000),""),ROW(A1)*2)

标记2:
  1. =SMALL(IF(MMULT(N(WEEKDAY(DATE(ROW($1900:$3000),$B$1+{0,1},))={5,1}),{1;1})=2,ROW($1900:$3000),""),ROW(A1))

钱币之月new.rar
6楼
wjc2090742
第二次修改:

  1. =TEXT(SMALL(IF(MOD(TEXT(ROW($1900:$3000)&-$B$1&-31,"0;;;!3"),7)=1,ROW($1900:$3000),4^8),ROW(A1)),"[<3001]0年;")


07及10的。

  1. =IFERROR(SMALL(IF(MOD(TEXT(ROW($1900:$3000)&-$B$1&-31,"0;;;!3"),7)=1,ROW($1900:$3000)),ROW(A1)),"")

  1. =IFERROR(SMALL(IFERROR(IF(MOD(ROW($1900:$3000)&-$B$1&-31,7)=1,ROW($1900:$3000)),""),ROW(A1)),"")

钱币之月new.rar
7楼
liuguansky
  1. =IF(OR(B$1={1,3,5,7,8,10,12}),TEXT(SMALL(IF(WEEKDAY(ROW($1900:$3000)&-B$1,2)=5,ROW($1900:$3000),5^5),ROW(1:1)),"[<=3e3]0年;"),"")

数组,任意位置下拉至出现空值

  1. Sub justtest()
  2.   Dim dic, i&, j&
  3.   Set dic = CreateObject("scripting.dictionary")
  4.   j = Cells(1, 2).Value
  5.   Range("e:e").ClearContents
  6.   Select Case j
  7.     Case 1, 3, 5, 7, 8, 10, 12
  8.       For i = 1900 To 3000
  9.         If Format(i & "-" & j, "aaa") = "星期五" Then dic(i & "年") = ""
  10.       Next i
  11.   End Select
  12.   If dic.Count > 0 Then Cells(2, 5).Resize(dic.Count, 1) = Application.Transpose(dic.keys)
  13.   Set dic = Nothing
  14. End Sub

钱币之月new.rar
8楼
amulee
先来个VBA的
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     If Target.Address = "$B$1" Then
  3.         Dim iMon, iYear
  4.         Dim dateTemp
  5.         Dim sumTemp
  6.         iMon = Target.Value
  7.         Range("B2:B65536").Clear
  8.         For iYear = 1900 To 3000
  9.             sumTemp = 0
  10.             For dateTemp = DateSerial(iYear, iMon, 1) To DateSerial(iYear, iMon + 1, 1) - 1
  11.                 If Weekday(dateTemp, vbMonday) > 4 Then
  12.                     sumTemp = sumTemp + 1
  13.                 End If
  14.             Next dateTemp
  15.             If sumTemp = 15 Then Range("B65536").End(xlUp).Offset(1, 0) = iYear
  16.         Next iYear
  17.         Range("B2:B65536").NumberFormat = "#年"
  18.     End If
  19. End Sub
9楼
wjh619993018
数组公式,下拉
  1. =TEXT(SMALL(IF((MOD(DATE(ROW($1:$1101)-1,B$1,1),7)=6)*(DAY(DATE(0,B$1+1,0))=31),ROW($1900:$3000),9^9),ROW(A1)),"[<3001]0年;")
10楼
gouweicao78
Excel 2003版通用:
  1. =IF(OR(B$1={1,3,5,7,8,10,12}),SMALL(IF(MOD(1899+ROW($1:$1101)&-B$1,7)=6,ROW($1:$1101)),ROW(1:1))+1899,"")
加容错:
  1. =IF(OR(B$1={1,3,5,7,8,10,12}),TEXT(SMALL(IF(MOD(1899+ROW($1:$1101)&-B$1,7)=6,ROW($1:$1101),9^9),ROW(154:154))+1899,"[<3e3]0年;"),"")
月份判断也可以用OR(B$1={2,4,6,9,11}),更短些。

把IF判断放到SMALL+IF中,月份为小的时候运算量会大一点,115字:
  1. =TEXT(SMALL(IF(MOD(1899+ROW($1:$1101)&-B$1,7)-OR(B$1={2,4,6,9,11})=6,ROW($1:$1101),9^9),ROW(1:1))+1899,"[<3e3]0年;")






Excel2010版还可以用:
  1. =IFERROR(SMALL(IF(NETWORKDAYS.INTL(1899+ROW($1:$1101)&-$B$1,DATE(1899+ROW($1:$1101),B$1+1,0),"1111000")=15,ROW($1:$1101)),ROW(1:1))+1899&"年","")
利用NETWORKDAYS.INTL函数指定工作日为五、六、日,计算该月15天工作日。
11楼
amulee
再来个公式的

原理分析,只有31天的月份才会出现“钱币之月”,并且那个月的第一天必须为星期五
  1. =IF(DAY(DATE(1,B$1+1,1)-1)<31,"",SMALL(IF(WEEKDAY(DATE(ROW(1900:$3000),B$1,1))=6,ROW(1900:$3000)),ROW(A1)))
  1. =IF(MONTH(DATE(1,B$1,31))=B$1,SMALL(IF(WEEKDAY(DATE(ROW(1900:$3000),B$1,1))=6,ROW(1900:$3000)),ROW(A1)),"")
12楼
rongjun
  1. =TEXT(SMALL(IF(ISERR(1/(MOD(ROW($1900:$3000)&-B$1&-31,7)=1)),3001,ROW($1900:$3000)),ROW(A1)),"[<3001]0年;")


钱币之月new.rar
13楼
wqfzqgk
=SMALL(IF(OR($B$1={1,3,5,7,8,10,12})*(WEEKDAY(ROW(INDIRECT("1900:3000"))&"/"&$B$1&"/1",2)=5),ROW(INDIRECT("1900:3000"))),ROW(1:1500))&"年"
14楼
wise
答案有错误,看到网上说:
2010年1月就是五个星期五,五个星期六,五个星期日、即将来临的2011年7月也是五个星期五,五个星期六,五个星期日。
15楼
JLxiangwei
已经过期了

免责声明

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

评论列表
sitemap