ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Excel(エクセル)活用コミュのマクロで祝日を判別 1984年5月4日の祝日名?

  • mixiチェック
  • このエントリーをはてなブックマークに追加
「Excelの極意3計算式と関数」という本のサンプルを、メーデーと現在の祝日に対応するようにコードの修正をしたのですが、1984年5月4日の祝日名がネット検索しても解りません。Excelには関係ないのですがあせあせ(飛び散る汗)どなたか親切な方、教えてください。あと、間違いなどもありましたらお教えください。宜しくお願い致します。HDayName(7)のIIF末尾に入れる祝日名です。

※管理人様
本のサンプルに手を加え公開する事が問題であれば、お手数ですが削除してください。

関数の例: =HOLIDAY(DATE(1984,5,4),1)

Option Explicit
'=============================================
' 日付に対応した祝日や曜日を返す関数
' HOLIDAY(DATE(yyyy,mm,dd)[,オプション])
'
' オプション = 0〜3
' 0 祝日判定(TRUE/FALSE)
' 1 祝日名表示(曜日名なし)
' 2 祝日名表示(曜日名あり)
' 3 省略祝日名表示
'=============================================
Function HOLIDAY(日付 As Date, Optional オプション As Integer = 1)
Dim HDayName(16) As String
Dim HDayList(16) As Date
Dim TempDate As Date
Dim iYear As Integer
Dim i As Integer

If 日付 = 0 Then
HOLIDAY = CVErr(xlErrValue)
Exit Function
End If
iYear = Year(日付)

'祝日の設定
HDayName(0) = "元日"
HDayList(0) = DateSerial(iYear, 1, 1)
HDayName(1) = "成人の日"
If iYear >= 2000 Then
TempDate = DateSerial(iYear, 1, 6)
HDayList(1) = DateSerial(iYear, 1, 15 - Weekday(TempDate))
Else
HDayList(1) = DateSerial(iYear, 1, 15)
End If
HDayName(2) = "建国記念の日"
HDayList(2) = DateSerial(iYear, 2, 11)
HDayName(3) = "春分の日"
HDayList(3) = DateSerial(iYear, 3, Fix(20.8431 _
+ 0.242194 * (iYear - 1980) - Fix((iYear - 1980) / 4)))
HDayName(4) = IIf(iYear >= 2007, "昭和の日", IIf(iYear >= 1989, "みどりの日", "天皇誕生日"))
HDayList(4) = DateSerial(iYear, 4, 29)
HDayName(5) = "メーデー"
HDayList(5) = DateSerial(iYear, 5, 1)
HDayName(6) = "憲法記念日"
HDayList(6) = DateSerial(iYear, 5, 3)
HDayName(7) = IIf(iYear >= 2007, "みどりの日", IIf(iYear >= 1985, "国民の休日", ""))
TempDate = DateSerial(iYear, 5, 4)
HDayList(7) = IIf(Weekday(TempDate) <= 2, 0, TempDate)
HDayName(8) = "こどもの日"
HDayList(8) = DateSerial(iYear, 5, 5)
HDayName(9) = "海の日"
If iYear >= 2003 Then
TempDate = DateSerial(iYear, 7, 6)
HDayList(9) = DateSerial(iYear, 7, 22 - Weekday(TempDate))
ElseIf iYear >= 1996 Then
HDayList(9) = DateSerial(iYear, 7, 20)
Else
HDayList(9) = 0
End If
HDayName(10) = "敬老の日"
If iYear >= 2003 Then
TempDate = DateSerial(iYear, 9, 6)
HDayList(10) = DateSerial(iYear, 9, 22 - Weekday(TempDate))
Else
HDayList(10) = DateSerial(iYear, 9, 15)
End If
HDayName(12) = "秋分の日"
HDayList(12) = DateSerial(iYear, 9, Fix(23.2488 _
+ 0.242194 * (iYear - 1980) - Fix((iYear - 1980) / 4)))
HDayName(11) = "国民の休日"
HDayList(11) = IIf(iYear >= 2003 And _
HDayList(12) - HDayList(10) = 2, HDayList(10) + 1, 0)
HDayName(13) = "体育の日"
If iYear >= 2000 Then
TempDate = DateSerial(iYear, 10, 6)
HDayList(13) = DateSerial(iYear, 10, 15 - Weekday(TempDate))
Else
HDayList(13) = DateSerial(iYear, 10, 10)
End If
HDayName(14) = "文化の日"
HDayList(14) = DateSerial(iYear, 11, 3)
HDayName(15) = "勤労感謝の日"
HDayList(15) = DateSerial(iYear, 11, 23)
HDayName(16) = "天皇誕生日"
HDayList(16) = IIf(iYear >= 1989, DateSerial(iYear, 12, 23), 0)
'祝日の判断
For i = 0 To 16
If 日付 = HDayList(i) Then
Select Case オプション
Case 0
HOLIDAY = True
Case 1, 2
HOLIDAY = HDayName(i)
Case 3
HOLIDAY = "祝"
End Select
Exit Function
End If
Next i
'振替休日の判断
If Weekday(日付) = vbMonday Then
For i = 0 To 16
If 日付 - 1 = HDayList(i) Then
Select Case オプション
Case 0
HOLIDAY = True
Case 1, 2
HOLIDAY = "振替休日"
Case 3
HOLIDAY = "振"
End Select
Exit Function
End If
Next i
End If
'祝日が見つからなかったときの処理
Select Case オプション
Case 0
HOLIDAY = False
Case 1
HOLIDAY = ""
Case 2
HOLIDAY = WeekdayName(Weekday(日付))
Case 3
HOLIDAY = WeekdayName(Weekday(日付), True)
End Select
End Function

コメント(6)

補足ですが、
HOLIDAYの中にDATE関数を入れるのはエラー(日付と認識しない)になるからです。オリジナルではA1に日付、関数はHOLIDAY(A1,1)ですが、A1セルを書式設定してもエラーになりました。
現在、1984年5月4日は""(空白)にしてあります。
昔の5/4の祝日の名前はありません。

国民の祝日に関する法律の第三条3には
『その前日及び翌日が「国民の祝日」である日(「国民の祝日」でない日に限る。)は、休日とする。 』
とだけかかれてあります。
http://law.e-gov.go.jp/htmldata/S23/S23HO178.html

それが適用されていたので、しいて言うなら「休日」です。
あ、
祝日にはさまれた日を休日にするようになったのは、
1985年に制定されたみたいですので、
1984年5/4は平日の模様です。

参考:http://ja.wikipedia.org/wiki/%E5%9B%BD%E6%B0%91%E3%81%AE%E7%A5%9D%E6%97%A5%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E6%B3%95%E5%BE%8B
「二つの祝日に挟まれた平日を休日とする国民の休日を制定。初適用日は1988年5月4日である。 」
しのさんありがとうございます。
1985年の前は振替以外は祝日ではないということですね。
あらら、振替には対応してるのですが、平日の場合でも祝日と出てしまいます。コードを見直してみます冷や汗
> HDayName(11) = "国民の休日"
> HDayList(11) = IIf(iYear >= 2003 And _
> HDayList(12) - HDayList(10) = 2, HDayList(10) + 1, 0)

これも、正しくは「休日」です。昔の5/4と同じ定義です。


しかし、2003年以降かどうかのチェックは要らないような気がします。
2003年以前は敬老の日が9/15固定だったんで、
HDayList(12) - HDayList(10) = 2が成り立たないはずかと。

マクロは詳しくないので見当違いだったらごめんなさい。
ご指摘、ありがとうございます。
なんかこのサンプル、ボロボロですねあせあせ
入力できる年数を制限してしまったほうがいいような気がしてきましたあせあせ(飛び散る汗)

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Excel(エクセル)活用 更新情報

Excel(エクセル)活用のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。