• ベストアンサー

土日祝以外の日付表示方法について

エクセルの表示方法を教えてください。 2008年2月3日 2008年3月3日 2008年4月3日 2008年5月3日 ・ ・ と5年間毎月3日を表示させたいたのですが、3日が土日祝日の場合は翌日、翌日が土日祝日の場合は翌々日を表示させたいです。 IF文の条件で1日づつ見ていき、表示させていましたが、GW等で5日程繰越が発生してしまい、うまく表示させる事が出来ませんでした。 どのようにすれば、うまく表示させる事が出来ますでしょうか? よろしくお願いいたします。 エクセルのバージョンは2000です。

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

  • ベストアンサー
回答No.6

ANo.5です。 考え方は同じなんですが、別シートを使う方法です。 以下の方が、祝祭日の日付が変わった時などは便利かも知れません。 新規にシート(日付変換テーブル)を作ります。 これは各月の3日の曜日に対応する、求める日のテーブルです。 考え方はANo.5のものです。 A1:G12を以下にします。 4 4 4 4 4 6 5 1月 4 3 3 3 3 3 5 4 3 3 3 3 3 5 4 3 3 3 3 3 5 7 6 6 8 7 7 7 5月 4 3 3 3 3 3 5 4 3 3 3 3 3 5 4 3 3 3 3 3 5 4 3 3 3 3 3 5 4 3 3 3 3 3 5 5 4 4 4 4 6 5 11月 4 3 3 3 3 3 5 sheet1のA,B列はANo.5同様に A1=2008(開始年) B1=1(開始月) A2=IF(B1=12,A1+1,A1) B2=IF(B1=12,1,B1+1) として、A2:B2を5年分下へコピー C1=INDEX(日付変換テーブル!$A$1:$G$12,B1,WEEKDAY(DATE(A1,B1,3))) D1=DATE(A1,B1,C1) として、C1:D1を5年分下へコピー の方が、すっきりするかもしれません。 「日付変換テーブル」シートのA1:G12以外の所に、AN5で書いたテーブルの意味を書いておくといいかと思います。 後から見た時や修正する場合などにわかりやすいと思います。 >「weekday(y/m/3)に対応する答えの配列」 >の部分が解読出来ずにおりますが、今後の課題とさせていただきます。 ある年月の3日の曜日(日曜が1..土曜が7)の時に、求める日の一覧です。 (かえって分かりにくい表現かな・・・)

itit
質問者

お礼

ありがとうございます。 前回の関数+今回の説明ですごく良く分かりました。 >ある年月の3日の曜日(日曜が1..土曜が7)の時に、求める日の一覧です。 とても分かりやすかったです。 と言っても理解するまで少々お時間を頂きましたが… 先日不明だった部分がすっきり判明しとても嬉しかったです。ホントに助かりました。 ありがとうございます。

その他の回答 (5)

回答No.5

計算式でできそうな感じもしますが、計算で出ない場合の力技です。 各月の3日の曜日に対応する答えの日 普通の月 日月火水木金土日月 34|||||||(日曜日は翌日) -3||||||| --3|||||| ---3||||| ----3|||| -----3||| ------345(日曜日は翌々日) 1月(4日)(祭日扱いでない翌日) 日月火水木金土日月 34||||||| -34|||||| --34||||| ---34|||| ----34||| -----3456(4日が土曜で翌々日) ------345(4日が日曜で翌日) 5月(3,4,5日が祭日) 日月火水木金土日月火水 34567||||||(6日が振替休日) -3456|||||| --3456||||| ---345678||(6日が土曜で翌々日) ----34567||(6日が日曜で翌日) -----34567|(6日が振替休日) ------34567(6日が振替休日) 11月(祭日) 日月火水木金土日月火 345||||||(4日が振替休日) -34|||||| --34||||| ---34|||| ----34||| -----3456(4日が土曜で翌々日) ------345(4日が日曜で翌日) weekday(y/m/3)に対応する答えの配列 普通の月 {4,3,3,3,3,3,5} 1月 {4,4,4,4,4,6,5} 5月 {7,6,6,8,7,7,7} 11月 {5,4,4,4,4,6,5} ここで、 A1=2008(開始年) B1=1(開始月) A2=IF(B1=12,A1+1,A1) B2=IF(B1=12,1,B1+1) として、A2:B2を5年分下へコピー C1=WEEKDAY(DATE(A1,B1,3)) D1=IF(B1=1,INDEX({4,4,4,4,4,6,5},C1),IF(B1=5,INDEX({7,6,6,8,7,7,7},C1),IF(B1=11,INDEX({5,4,4,4,4,6,5},C1),INDEX({4,3,3,3,3,3,5},C1)))) E1=DATE(A1,B1,D1) として、C1:E1を5年分下へコピー これでE列が求める答えになると思うのですが・・・

itit
質問者

お礼

ありがとうございます。 理想通りの結果になり、大変助かりました。 「weekday(y/m/3)に対応する答えの配列」 の部分が解読出来ずにおりますが、今後の課題とさせていただきます。 ありがとうございました。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.4

1月3日はどう扱いますか。

itit
質問者

補足

1月3日も祝日として扱いたいです。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.3

次の方法は如何でしょうか。 =WORKDAY((DATE(YEAR("2008/1/1")+INT(ROW(A1)/12),MOD(ROW(A1),12),3))-1,1,{"5/3","5/4","5/5"}) 但し、振替休日は考慮していません。

itit
質問者

お礼

大変失礼致しました。 11/3は固定の祝日ですので、分析ツールを使わない方法のみ何かございましたら教えていただけますでしょうか。 よろしくお願いいたします。

itit
質問者

補足

ありがとうございます。 大変参考になりました。 ただ、11/3が固定で祝日ではなくなったので、その処理も含めて出来るようにお願い出来ますでしょうか。 また、出来れば共有ファイルとして使用を考えておりますので分析ツールがなくても出来る方法があると大変助かります。 よろしくお願いいたします。

  • highton
  • ベストアンサー率23% (14/59)
回答No.2

祝日については、事前に調べておく必要があります。 毎年5月3日、5月4日、5月5日、11月3日は 祝日だと考えてよいのですか?

itit
質問者

補足

ありがとうございます。 毎年5月3日、5月4日、5月5日、11月3日は祝日としてお願いいたします。

noname#140971
noname#140971
回答No.1

エクセルは操作したことがないので別角度から・・・・ 余り難しく考えない方がよいかもです。 [毎月3日以上の平日一覧.txt] 2008年2月3日 2008年3月3日 2008年4月3日 2008年5月3日 例えば、こういうテキストファイルを用意するのは10分程度の作業。 [イミディエイト] ? 三日以上の平日("2008年2月") 2008/02/03 そうすれば、このように簡単に目的の日付を求めることが可能です。 Public OrdinaryDays() As String Public Function CutStr(ByVal Text As String, _             ByVal Separator As String, _             ByVal N As Integer) As String   Dim strDatas() As String      strDatas = Split("" & Separator & Text, Separator, , 0)   CutStr = strDatas(N * Abs((N <= UBound(strDatas)))) End Function Public Function FileReadArray(ByVal FileName As String) As String() On Error GoTo Err_FileReadArray   Dim fso    As Object   Dim strTexts() As String      Set fso = CreateObject("Scripting.FIleSystemObject")   strTexts() = Split(fso.OpenTextFile(FileName).ReadAll, vbCrLf) Exit_FileReadArray:   FileReadArray = strTexts()   Exit Function Err_FileReadArray:   MsgBox Err.Description & "(FileReadArray)", vbExclamation, " 関数エラーメッセージ"   strTexts() = Split("")   Resume Exit_FileReadArray End Function Public Function 三日以上の平日(ByVal 年月 As String) As Date   Dim I As Integer   Dim N As Integer      OrdinaryDays() = FileReadArray("毎月3日以上の平日一覧.txt")   N = UBound(OrdinaryDays())   For I = 0 To N     If 年月 = CutStr(OrdinaryDays(I), "月", 1) & "月" Then       三日以上の平日 = CDate(OrdinaryDays(I))       Exit For     End If   Next I End Function

itit
質問者

お礼

簡単なエクセル関数しか知らなかったため、悪戦苦闘しておりますが参考にさせていただきます。 ありがとうございました。