即効テクニック

日付・時刻関連のテクニック

カレンダーを作成する

(Excel 97/2000)
サンプルマクロは、新規にカレンダーを作成します。
Option Explicit

Dim mySht(1 To 12) As Worksheet
Dim intYear As Integer

Sub Sample()

    Dim myMonth As Byte
    Dim strYear As String
    Dim myDate As Date, myDay As Integer
    Dim my2ndMonday As Integer, myEquinox As Integer
        
    On Error Resume Next
    Do
        strYear = InputBox("カレンダーを作成する年を入力してください。" _
            , , Year(Now))
        If strYear = vbNullString Then Exit Sub
        If Right(strYear, 1) = "年" Then _
            strYear = Left(strYear, Len(strYear) - 1)
        Err.Clear
        intYear = Year(strYear & "/1/1")
    Loop Until Err.Number = 0
    
    Application.ScreenUpdating = False
    
    For myMonth = 1 To 12
        Set mySht(myMonth) = Sheets(myMonth)
        If Err.Number <> 0 Then
            Set mySht(myMonth) = Sheets.Add(, Sheets(Sheets.Count))
            Err.Clear
        End If
        mySht(myMonth).Name = myMonth & "月"
    Next
    mySht(1).Activate
    For myMonth = 1 To 12
        With mySht(myMonth)
            .Cells.Clear
            myDay = 1
            myDate = intYear & "/" & myMonth & "/" & myDay
            While Month(myDate) = myMonth
                With .Cells(myDay, 1)
                    .Value = myDay
                    .Offset(, 1).Value = _
                        Left(WeekdayName(Weekday(myDate)), 1)
                    Select Case Weekday(myDate)
                        Case vbSunday
                            .Offset(, 1).Font.Color = RGB(255, 0, 0)
                        Case vbSaturday
                            .Offset(, 1).Font.Color = RGB(0, 0, 255)
                    End Select
                End With
                myDate = DateAdd("d", 1, myDate)
                myDay = Day(myDate)
            Wend
        End With
    Next
    
    '国民の祝日が必要ない場合はこれ以降はコメントアウトしてください。
    myFete 1, 1, "元旦"
    If intYear < 2000 Then
        myFete 1, 15, "成人の日"
    Else
        my2ndMonday = Get2ndMonday(Weekday(intYear & "/1/1"))
        myFete 1, my2ndMonday, "成人の日"
    End If
    myFete 2, 11, "建国記念日"
    myEquinox = Int(21.46758 + 0.242194 * (intYear - 1900) _
        - Int((intYear - 1900) / 4))
    myFete 3, myEquinox, "春分の日" '誤差のある可能性あり
    myFete 4, 29, "みどりの日"
    myFete 5, 3, "憲法記念日"
    myFete 5, 5, "子供の日"
    myFete 7, 20, "海の日"
    myFete 9, 15, "敬老の日"
    myEquinox = Int(23.87328 + 0.242194 * (intYear - 1900) _
        - Int((intYear - 1900) / 4))
    myFete 9, myEquinox, "秋分の日"    '誤差のある可能性あり
    If intYear < 2000 Then
        myFete 10, 10, "体育の日"
    Else
        my2ndMonday = Get2ndMonday(Weekday(intYear & "/10/1"))
        myFete 10, my2ndMonday, "体育の日"
    End If
    myFete 11, 3, "文化の日"
    myFete 11, 23, "勤労感謝の日"
    myFete 12, 23, "天皇誕生日"
    With mySht(5).Cells(4, 2)
        If .Characters(1, 1).Font.Color <> RGB(255, 0, 0) Then
            myFete 5, 4, "国民の休日"
            .Replace "祝", "休"
            .Characters(2).Font.ColorIndex = xlAutomatic
        End If
    End With
        
    Application.ScreenUpdating = True
    
End Sub

Function Get2ndMonday(my1stWeekday As Long) As Long

    Select Case my1stWeekday
        Case vbSunday, vbMonday
            Get2ndMonday = 10 - my1stWeekday
        Case Else
            Get2ndMonday = 17 - my1stWeekday
    End Select

End Function

Sub myFete(myFeteMonth As Integer, myFeteDay As Integer _
    , myFeteName As String)
    
    Dim myDate As Date
    Dim f As Boolean
    Dim myMonth As Integer, myDay As Integer
    
    myDate = intYear & "/" & myFeteMonth & "/" & myFeteDay
    f = True
    If Weekday(myDate) = vbSunday Then
        myDate = DateAdd("d", 1, myDate)
        myMonth = Month(myDate)
        myDay = Day(myDate)
        f = False
    End If
    With mySht(myFeteMonth).Cells(myFeteDay, 2)
        .Value = .Value & "(祝)"
        .Characters(1, 1).Font.Color = RGB(255, 0, 0)
        .Characters(2).Font.ColorIndex = xlAutomatic
        .Offset(, 1).Value = myFeteName
    End With
    If f Then Exit Sub
    With mySht(myMonth).Cells(myDay, 2)
        .Value = .Value & "(休)"
        .Characters(1, 1).Font.Color = RGB(255, 0, 0)
        .Characters(2).Font.ColorIndex = xlAutomatic
        .Offset(, 1).Value = "振替休日"
    End With
End Sub

'Excel2000ではこれ以降は不要です。
Function WeekDayName(myDay As Integer) As String

    Dim myWeekDayName As Variant
    
    myWeekDayName = _
        Array("日", "月", "火", "水", "木", "金", "土")
    WeekDayName = myWeekDayName(myDay - 1)
    'WeekDayName = WeekDayName & "曜日"

End Function