難易度:★★☆(やや難)
※当校のExcel VBAコースを補足する内容となっています。
【Sample9】カレンダーを作ろう では、翌月ひと月分のカレンダーを作りました。
今回は、1年分のカレンダーを作りましょう。
1年分、同じシートに並べて作るの?
今回は、ひと月ごとにシートをわけます。
ひと月分の罫線と曜日だけを記載したひな形(テンプレート)となるシートを用意し、そのシートをコピーして、1月から12月のカレンダーとしてみましょう。
ひな形シートをコピーする
まずは、ひな形シートを作りましょう。シート見出しを「Template」とし、[A1]セルには、作りたい年の1月1日の日付を入力します。「セルの書式設定」の「日付の表示形式」を変更して年月のみが表示されるようにしましょう。
また、曜日の見出し(日~土)を入力し、日曜日のセル(A2:A8)には赤の文字色、土曜日のセル(G2:G8)には青の文字色を設定しておきます。
これをコピーして1月のシートを作り、1~月末日付を表示することにします。
2~12月分も同様にTemplateシートをコピーして作ります。
Sub YearCalender()
Dim Ws As Workshee
Dim w_date As Date
Dim i, j, n, x As Long
Dim sw As Boolean
Const ix7 = 7
Const ix8 = 8
Const ix12 = 12
Application.DisplayAlerts = False
For Each Ws In Worksheets
If InStr(Ws.Name, "月") > 0 Then Ws.Delete
Next Ws
Application.DisplayAlerts = True
w_date = Worksheets("Template").Range("A1")
x = Weekday(w_date)
For n = 1 To ix12
Worksheets("Template").Copy After:=Worksheets(Worksheets.Count)
Set Ws = ActiveSheet
With Ws
.Cells(1, 1) = w_date
.Name = Year(w_date) & "年" & Month(w_date) & "月"
For i = 3 To ix8
For j = x To ix7
.Cells(i, j) = w_date
w_date = w_date + 1
If Month(.Cells(1, 1)) <> Month(w_date) Then
x = Weekday(w_date, vbSunday)
If i <> ix8 Then .Rows(ix8).Hidden = True
sw = True
Exit For
End If
Next j
If sw = True Then
sw = False
Exit For
End If
x = 1
Next i
End With
Next n
End Sub
【Sample9】カレンダーを作ろう と比較して違いを調べてみましょう。
祝日を赤色にする
祝日も赤文字で表示したいです。
成人の日(1月の第2月曜日)や春分の日(3月20~21日頃)など、一部の祝日は年によって日付が変わりますね。
そのために毎年プログラムを変更するのは好ましくありません。
「祝日」シートを作って1年分の祝日を設定し、それをプログラムから参照するようにしましょう。
内閣府のサイト「国民の祝日について」に祝日の記載があります。
その他、振替休日など赤色にしたい日付があれば、リストに追加しましょう。
Sub YearCalender2()
Dim Ws As Worksheet
Dim w_date As Date
Dim i, j, n, x As Long
Dim s, s_End As Long
Dim sw, S_Sw As Boolean
Dim w_Syukujitu As Variant
Const ix7 = 7
Const ix8 = 8
Const ix12 = 12
Application.DisplayAlerts = False
For Each Ws In Worksheets
If InStr(Ws.Name, "月") > 0 Then Ws.Delete
Next Ws
Application.DisplayAlerts = True
w_date = Worksheets("Template").Range("A1"): x = Weekday(w_date)
With Worksheets("祝日")
s_End = .Cells(Rows.Count, 1).End(xlUp).Row
ReDim w_Syukujitu(1 To s_End)
For s = 1 To s_End
w_Syukujitu(s) = .Cells(s, 1)
Next s
End With
For n = 1 To ix12
Worksheets("Template").Copy After:=Worksheets(Worksheets.Count)
Set Ws = ActiveSheet
With Ws
.Cells(1, 1) = w_date
.Name = Year(w_date) & "年" & Month(w_date) & "月"
For i = 3 To ix8
For j = x To ix7
.Cells(i, j) = w_date
For s = 1 To s_End
If w_date = w_Syukujitu(s) Then
.Cells(i, j).Font.Color = RGB(255, 0, 0)
Exit For
End If
Next s
w_date = w_date + 1
If Month(.Cells(1, 1)) <> Month(w_date) Then
x = Weekday(w_date)
If i <> ix8 Then .Rows(ix8).Hidden = True
sw = True: Exit For
End If
Next j
If sw = True Then
sw = False
Exit For
End If
x = 1
Next i
End With
Next n
End Sub