• ベストアンサー

エクセルで毎年、日にちが異なる祝日(成人の日等)の返し方

エクセルでカレンダーを作成しようとしていますが、 つまづいてしまったので、どなたか教えていただけないでしょうか A1セルに指定年月日(例:平成19年1月1日)と 入力したら、該当月の日にちと曜日を表示させ 土日はセルの色を変えるというところまで できたのですが、さらに出勤しない日(国民の祝日)も セルの色を変えたいと思っています。 カレンダーとは別のシートなどに国民の祝日リストを 作成し、条件付き書式でmatch関数を利用して、 国民の祝日リストに合致したセルも色を変えたいのですが、 元旦やこどもの日のように月日が決まっている祝日ではなく 成人の日や海の日など、ある月の第2月曜日という祝日の場合、 A1セルの指定年月日から当該年の成人の日等を返すことは できるのでしょうか? 説明がわかりにくいかもしれませんが、要は、 A1セルが2007/1/1の時に B1セルに当月の第2月曜日を返す C1セルに7月の第2月曜日を返す ということは可能なのでしょうか? よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • maron--5
  • ベストアンサー率36% (321/877)
回答No.4

◆いろんな式がありますが、これを使っています >A1セルが2007/1/1の時に >B1セルに当月の第2月曜日を返す >C1セルに7月の第2月曜日を返す B1=DATE(YEAR(A1),MONTH(A1),7*2-WEEKDAY(DATE(YEAR(A1),MONTH(A1),0),3)) C1=DATE(YEAR(A1),7,7*2-WEEKDAY(DATE(YEAR(A1),7,0),3))

nbd-1
質問者

お礼

大変助かりました。 どうもありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • Nii
  • ベストアンサー率48% (79/162)
回答No.5

もう回答は出てしまっているようだけど、参考までに 別のシートに祝日を設定する方法じゃない方法でなく、与えられた日付が祝日かどうかを返す非常に見にくいモジュールを^^; 祝日を表示させたいセル =国民の祝日(日付が入ったセル,1) Public Function 国民の祝日(今日 As Date, chk_l As Integer) As String Dim 年 As Long 国民の祝日 = "" 年 = Year(今日) If Format(今日, "yyyymm") < 194807 Then Exit Function End If If Format(今日, "mmdd") = 101 Then 国民の祝日 = "元日" Exit Function End If If 年 < 2000 And Format(今日, "mmdd") = 115 Then 国民の祝日 = "成人の日" Exit Function ElseIf 年 >= 2000 Then If 第一月曜(DateSerial(年, 1, 1)) + 7 = 今日 Then 国民の祝日 = "成人の日" Exit Function End If End If If 年 >= 1966 And Format(今日, "mmdd") = 211 Then 国民の祝日 = "建国記念の日" Exit Function End If If DateSerial(年, 3, Int(0.24242 * 年 - Int(年 / 4) + 35.84)) = 今日 Then 国民の祝日 = "春分の日" Exit Function End If If Format(今日, "mmdd") = 503 Then 国民の祝日 = "憲法記念日" Exit Function End If If Format(今日, "mmdd") = 429 Then If 年 < 1989 Then 国民の祝日 = "天皇誕生日" Exit Function ElseIf 年 >= 1989 And 年 < 2007 Then 国民の祝日 = "みどりの日" Exit Function Else 国民の祝日 = "昭和の日" Exit Function End If End If If 年 >= 2007 And Format(今日, "mmdd") = 504 Then 国民の祝日 = "みどりの日" Exit Function End If If Format(今日, "mmdd") = 505 Then 国民の祝日 = "こどもの日" Exit Function End If If 年 >= 1995 Then If 年 < 2003 And Format(今日, "mmdd") = 720 Then 国民の祝日 = "海の日" Exit Function ElseIf 年 >= 2003 Then If 第一月曜(DateSerial(年, 7, 1)) + 14 = 今日 Then 国民の祝日 = "海の日" Exit Function End If End If End If If 年 >= 1966 Then If 年 < 2003 And Format(今日, "mmdd") = 915 Then 国民の祝日 = "敬老の日" Exit Function ElseIf 年 >= 2003 Then If 第一月曜(DateSerial(年, 9, 1)) + 14 = 今日 Then 国民の祝日 = "敬老の日" Exit Function End If End If End If If DateSerial(年, 9, Int(0.24204 * 年 - Int(年 / 4) + 39.01)) = 今日 Then 国民の祝日 = "秋分の日" Exit Function End If If 年 >= 1966 Then If 年 < 2000 And Format(今日, "mmdd") = 1010 Then 国民の祝日 = "体育の日" Exit Function ElseIf 年 >= 2000 Then If 第一月曜(DateSerial(年, 10, 1)) + 7 = 今日 Then 国民の祝日 = "体育の日" Exit Function End If End If End If If Format(今日, "mmdd") = 1103 Then 国民の祝日 = "文化の日" Exit Function End If If Format(今日, "mmdd") = 1123 Then 国民の祝日 = "勤労感謝の日" Exit Function End If If 年 >= 1989 And Format(今日, "mmdd") = 1223 Then 国民の祝日 = "天皇誕生日" Exit Function End If If 今日 = #4/10/1959# Then 国民の祝日 = "皇太子明仁親王の結婚の儀" Exit Function End If If 今日 = #2/24/1989# Then 国民の祝日 = "昭和天皇の大喪の礼" Exit Function End If If 今日 = #11/12/1990# Then 国民の祝日 = "即位礼正殿の儀" Exit Function End If If 今日 = #6/9/1993# Then 国民の祝日 = "皇太子徳仁親王の結婚の儀 " Exit Function End If If chk_l Then If 今日 > #4/12/1973# Then If Weekday(今日) = 2 Then If Len(国民の祝日(今日 - 1, 0)) Then 国民の祝日 = "振替休日" Exit Function End If ElseIf 年 >= 2005 Then If Weekday(今日) = 3 Then If Len(国民の祝日(今日 - 1, 0)) Then If Len(国民の祝日(今日 - 2, 0)) Then 国民の祝日 = "振替休日" Exit Function End If End If ElseIf Weekday(今日) = 4 Then If Len(国民の祝日(今日 - 1, 0)) Then If Len(国民の祝日(今日 - 2, 0)) Then If Len(国民の祝日(今日 - 3, 0)) Then 国民の祝日 = "振替休日" Exit Function End If End If End If End If End If End If If 年 >= 1985 Then If Len(国民の祝日(今日 - 1, 0)) Then If Len(国民の祝日(今日 + 1, 0)) Then 国民の祝日 = "国民の休日" Exit Function End If End If End If End If End Function Public Function 第一月曜(今日 As Date) As Date 今日 = DateSerial(Year(今日), Month(今日), 1) Do Until Weekday(今日) = 2 今日 = 今日 + 1 Loop 第一月曜 = 今日 End Function

参考URL:
http://okwave.jp/qa2417145.html
すると、全ての回答が全文表示されます。
noname#153814
noname#153814
回答No.3

ここに全部書いてあり、私も使わせていただきました。 http://www.eva.hi-ho.ne.jp/ohtake/excel/calender2.htm

nbd-1
質問者

お礼

この問題が解決したら振替休日の方法を考えなきゃ いけないと思っていたのですが、すべてこちらのサイトに 載っているようですね どうもありがとうごいざいました。

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 こんな風にすれば出来ると思います。 A1: 2007/1/1 B1: =DATE(YEAR($A$1),MONTH($A$1),15)-WEEKDAY(DATE(YEAR($A$1),MONTH($A$1),6)) C1: =DATE(YEAR($A$1),7,22)-WEEKDAY(DATE(YEAR($A$1),7,6))

すると、全ての回答が全文表示されます。
noname#39970
noname#39970
回答No.1

対象月の1日の曜日をまず求める 月曜=0 日曜=6 になるようにしておく 第1月曜日まで何日足りないか求める(上の数値曜日を7から引く) 最初に求めた月の1日が月曜でない場合だけ上の値に更に7を足す この値がその月の第2月曜にならないかな?

すると、全ての回答が全文表示されます。

関連するQ&A