先日アップした DateCalculatorClass を使ってカレンダーを作ってみる。
エクセルの関数を使って万年カレンダー的なものを作るのは結構ややこしい。特に月末の日付表示の部分で頭が混乱してくる。
DateCalculatorClass を使えば簡単にカレンダー形式の二次元配列を得られるため、かなり簡単にカレンダーが作れる。
サンプルコード
Public Sub CreateCal()
Dim cal As DateCalculatorClass
Set cal = New DateCalculatorClass
‘ 年月の設定
Dim y As Integer, m As Integer
y = 2018
m = 9
‘ カレンダーデータの取得
Dim dt As Date
Dim cData
dt = DateSerial(y, m, 1)
cData = cal.GetCalendar(dt)
‘ 曜日を書き込み
Dim i As Integer, j As Integer
For j = 0 To UBound(cData, 2)
Cells(3, j + 1) = cData(0, j)
Next j
‘ 3行おきに日付と祝日名を書き込み
Dim r As Integer, c As Integer
Dim hol As Variant
For i = 1 To UBound(cData, 1)
‘ 3行おきの設定
r = (i – 1) * 3 + 4
For j = 0 To UBound(cData, 2)
c = j + 1
With Cells(r, c)
‘ 日付のみを表示する
.NumberFormatLocal = “d”
.Value = cData(i, j)
End With
‘ 祝日の取得と書き込み
hol = cal.IsHoliday(CDate(cData(i, j)))
If hol <> False Then
Cells(r + 1, c) = hol
End If
Next j
Next i
Set cal = Nothing
End Sub
実行結果

あとはセルの表示や罫線などを整えると良い。
こんな感じで。

振替休日の表示はちょっとくどいので、コード上で
If hol like "*振替休日" Then
hol = "振替休日"
End If
などと処理を入れたほうが良いかもしれない。
後の罫線の処理もマクロでやりたくなるところだけれど、万年カレンダーとして月ごとに書き換えていっても表示される枠は変わらないので、手作業でやってしまっていいと思う。
また、上記のコードをシートモジュールのワークシートチェンジイベントプロシージャで、月を入力したセルが変更されるタイミングで実行するようにしても良いかもしれない。
コメント