|
不特定な祝日を求めるエクセル関数とマクロ関数。
検索曜日Noは、下記として。
日 月 火 水 木 金 土
1 2 3 4 5 6 7
基本(日にちだけです。)
=IF(検索曜日No>=WEEKDAY(DATE(年,月,1),1),検索曜日No-WEEKDAY(DATE(年,月,1),1)+((検索週-1)*7)+1,8-WEEKDAY(DATE(年,月,1),1)+((検索週-1)*7)+検索曜日No)
注)単純に足し算しているだけなので、存在しない2003年8月の第6土曜日は、36となってしまいますが、年、月、週、曜日が固定ならこれで十分だと思います。
1月の第2月曜日(成人の日)
=DATE(2003,1,IF(2>=WEEKDAY(DATE(2003,1,1),1),2-WEEKDAY(DATE(2003,1,1),1)+((2-1)*7)+1,8-WEEKDAY(DATE(2003,1,1),1)+((2-1)*7)+2))
7月の第3月曜日(海の日)
=DATE(2003,7,IF(2>=WEEKDAY(DATE(2003,7,1),1),2-WEEKDAY(DATE(2003,7,1),1)+((3-1)*7)+1,8-WEEKDAY(DATE(2003,7,1),1)+((3-1)*7)+2))
9月の第3月曜日(敬老の日)
=DATE(2003,9,IF(2>=WEEKDAY(DATE(2003,9,1),1),2-WEEKDAY(DATE(2003,9,1),1)+((3-1)*7)+1,8-WEEKDAY(DATE(2003,9,1),1)+((3-1)*7)+2))
10月の第2月曜日(体育の日)
=DATE(2003,10,IF(2>=WEEKDAY(DATE(2003,10,1),1),2-WEEKDAY(DATE(2003,10,1),1)+((2-1)*7)+1,8-WEEKDAY(DATE(2003,10,1),1)+((2-1)*7)+2))
存在しないデータを記入し、存在しない日付を返したくない時にエラーを返したいなら。
基本
=DATEVALUE(年 & "/" & 月 & "/" & IF(検索曜日No>=WEEKDAY(DATE(年,月,1),1),検索曜日No-WEEKDAY(DATE(年,月,1),1)+((検索週-1)*7)+1,8-WEEKDAY(DATE(年,月,1),1)+((検索週-1)*7)+検索曜日No))
例 セルにデータを記入して、2003年3月の第5、日曜日の年月日を求める。
A B C D
1 年 検索月 検索週 検索曜日
2 2003 3 5 1
=DATEVALUE($A$2 & "/" & $B$2 & "/" & IF($D$2>=WEEKDAY(DATE($A$2,$B$2,1),1),$D$2-WEEKDAY(DATE($A$2,$B$2,1),1)+(($C$2-1)*7)+1,8-WEEKDAY(DATE($A$2,$B$2,1),1)+(($C$2-1)*7)+$D$2))
・マクロ版エクセル関数(日にちだけ返します。)
(単純に回してるだけです。)
Function SarCWeek関数(年, 月, 検索週, 曜日)
Dim DCnt As Long, DM As String, DD As String, FCFDM As String
Application.Volatile
FCFDM = Format(CDate(年 & "/" & 月 + 1 & "/" & 1) - 1, "d")
For i = 1 To FCFDM
bby = Format(CDate(年 & "/" & 月 & "/" & i), "aaa")
If Format(CDate(年 & "/" & 月 & "/" & i), "aaa") = 曜日 Then
DCnt = DCnt + 1
If 検索週 = DCnt Then
SarCWeek関数 = i
Exit Function
End If
End If
Next
SarCWeek関数 = CVErr(xlErrValue)
End Function
PS
春分、秋分の日は、堪忍してください。
地中の自転までの計算はちょっと...
独断と偏見で、取合えず目安箱に載せます。
|
|