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

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

Excel(エクセル)活用コミュのマクロで振替休日の判別をしたい

  • mixiチェック
  • このエントリーをはてなブックマークに追加
http://mixi.jp/view_bbs.pl?id=25946683&comm_id=2106
上記のurlのコードを新しい祝日に対応するように修正しました(下記コード)が、振替日の判別がうまくいかず困ってます。
憲法記念日(5/3)、国民の休日(5/4)、こどもの日(5/5)の中に日曜日が含まれると5/6が振替日になるように判別したいのです。アドバイスよろしくお願いいたします。

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) = IIf(iYear >= 1945, DateSerial(iYear, 4, 29), 0)
HDayName(5) = "メーデー"
HDayList(5) = DateSerial(iYear, 5, 1)
HDayName(6) = "憲法記念日"
HDayList(6) = DateSerial(iYear, 5, 3)
HDayName(7) = IIf(iYear >= 2007, "みどりの日", "国民の休日")
TempDate = IIf(iYear >= 1988, DateSerial(iYear, 5, 4), 0)
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

コメント(2)

一応、自己解決できました。
コードは下記のとおりです。
インデントはよっちゃんさんに教えていただいた置換で再現できました。m(__)m

※法的な事や変更された部分など理解するのに役立ったサイトです。
■2007年より施行される「振替休日」と(2009年9月)秋の「国民の休日」
http://www.maitown.com/soft/info/kyuujitu2.html

※元コードは下記のサイトのサンプルデータから…本も購入いたしました
 みどりの日の変更も対応してありました。
■Excelの極意 サポートサイト
http://book.mycom.co.jp/support/e2/xlsgokui2007/
  '昭和の日
  If iYear >= 2007 Then
    HDayName(4) = "昭和の日"
  ElseIf iYear >= 1989 Then
    HDayName(4) = "みどりの日"
  Else
    HDayName(4) = "天皇誕生日"
  End If
  HDayList(4) = DateSerial(iYear, 4, 29)


  '憲法記念日
  HDayName(6) = "憲法記念日"
  HDayList(6) = DateSerial(iYear, 5, 3)
  'みどりの日
  If iYear >= 2007 Then
    HDayName(7) = "みどりの日"
    HDayList(7) = DateSerial(iYear, 5, 4)
  Else
    HDayName(7) = "国民の休日"
    TempDate = DateSerial(iYear, 5, 4)
    HDayList(7) = IIf(Weekday(TempDate) <= 2, 0, TempDate)
  End If
  'こどもの日
  HDayName(8) = "こどもの日"
  HDayList(8) = DateSerial(iYear, 5, 5)


  '振替休日の判断
  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 = "振"
        Case 4
          HOLIDAY = WeekdayName(Weekday(日付), True)
        End Select
        Exit Function
      End If
    Next i
  'みどりの日が日曜日の場合
  ElseIf Weekday(日付) = vbTuesday Then
    If 日付 - 2 = HDayList(7) Then
      Select Case オプション
      Case 0
        HOLIDAY = True
      Case 1, 2
        HOLIDAY = "振替休日"
      Case 3
        HOLIDAY = "振"
      Case 4
        HOLIDAY = WeekdayName(Weekday(日付), True)
      End Select
      Exit Function
    End If
  '憲法記念日が日曜日の場合
  ElseIf Weekday(日付) = vbWednesday Then
    If 日付 - 3 = HDayList(6) Then
      Select Case オプション
      Case 0
        HOLIDAY = True
      Case 1, 2
        HOLIDAY = "振替休日"
      Case 3
        HOLIDAY = "振"
      Case 4
        HOLIDAY = WeekdayName(Weekday(日付), True)
      End Select
      Exit Function
    End If
  End If
  '祝日が見つからなかったときの処理
  Select Case オプション
  Case 0
    HOLIDAY = False
  Case 1
    HOLIDAY = ""
  Case 2
    HOLIDAY = WeekdayName(Weekday(日付))
  Case 3, 4
    HOLIDAY = WeekdayName(Weekday(日付), True)
  End Select
End Function

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

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

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

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

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