楼主 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 |
- =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 |
- =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版公式:
- =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 |
楞凑了一个出来,重在掺和一下吧。也为今天多发一个贴。 定义了名称:日期=- =ROW(INDIRECT("1:"&DAY((钱币之月!$B$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:- =SMALL(IF(WEEKDAY(DATE(ROW($1900:$3000),$B$1+{0,1},))={5,1},ROW($1900:$3000),""),ROW(A1)*2)
标记2:
- =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 |
第二次修改:
- =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的。
- =IFERROR(SMALL(IF(MOD(TEXT(ROW($1900:$3000)&-$B$1&-31,"0;;;!3"),7)=1,ROW($1900:$3000)),ROW(A1)),"")
- =IFERROR(SMALL(IFERROR(IF(MOD(ROW($1900:$3000)&-$B$1&-31,7)=1,ROW($1900:$3000)),""),ROW(A1)),"")
钱币之月new.rar |
7楼 liuguansky |
- =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年;"),"")
数组,任意位置下拉至出现空值
- Sub justtest()
- Dim dic, i&, j&
- Set dic = CreateObject("scripting.dictionary")
- j = Cells(1, 2).Value
- Range("e:e").ClearContents
- Select Case j
- Case 1, 3, 5, 7, 8, 10, 12
- For i = 1900 To 3000
- If Format(i & "-" & j, "aaa") = "星期五" Then dic(i & "年") = ""
- Next i
- End Select
- If dic.Count > 0 Then Cells(2, 5).Resize(dic.Count, 1) = Application.Transpose(dic.keys)
- Set dic = Nothing
- End Sub
钱币之月new.rar |
8楼 amulee |
先来个VBA的- Private Sub Worksheet_Change(ByVal Target As Range)
- If Target.Address = "$B$1" Then
- Dim iMon, iYear
- Dim dateTemp
- Dim sumTemp
- iMon = Target.Value
- Range("B2:B65536").Clear
- For iYear = 1900 To 3000
- sumTemp = 0
- For dateTemp = DateSerial(iYear, iMon, 1) To DateSerial(iYear, iMon + 1, 1) - 1
- If Weekday(dateTemp, vbMonday) > 4 Then
- sumTemp = sumTemp + 1
- End If
- Next dateTemp
- If sumTemp = 15 Then Range("B65536").End(xlUp).Offset(1, 0) = iYear
- Next iYear
- Range("B2:B65536").NumberFormat = "#年"
- End If
- End Sub
|
9楼 wjh619993018 |
数组公式,下拉- =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版通用:- =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,"")
加容错:- =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字:
- =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版还可以用:- =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天的月份才会出现“钱币之月”,并且那个月的第一天必须为星期五- =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)))
- =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 |
- =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 |
已经过期了 |