Excel VBAでカレンダーを作成する際、月末が1マスや2マス空いてしまう問題はよくあります。この記事では、シートから日付を取得し、空白セルを最小限に抑えてカレンダーを自動生成する方法を解説します。
カレンダーの基本構造と課題
一般的に、1か月分のカレンダーを横方向または縦方向に配置する場合、月の初日の曜日に合わせて開始列を決める必要があります。
初期コードでは、単純に日付を順番に配置するため、月末が週の途中で終わると余分な空白が発生してしまいます。
空白セルを防ぐ配置の考え方
解決策としては、各週の開始列を曜日に基づいて設定し、日付を配置する際に自動で改行または次の行に移動させる方法があります。
VBAでは、DateSerial関数を使って対象月の初日と最終日を取得し、Weekday関数で曜日を判定することで、セルの配置を正確に制御できます。
サンプルVBAコード
以下は、月初の曜日を計算し、空白を最小化してカレンダーを生成する例です。
Sub GenerateCalendar()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Calendar")
ws.Cells.Clear
Dim year As Integer, month As Integer
year = 2026
month = 4
Dim firstDay As Date, lastDay As Date
firstDay = DateSerial(year, month, 1)
lastDay = DateSerial(year, month + 1, 0)
Dim row As Integer, col As Integer, currentDay As Date
row = 2 '開始行
col = Weekday(firstDay, vbSunday) '日曜日を1列目とする
currentDay = firstDay
Do While currentDay <= lastDay
ws.Cells(row, col).Value = Day(currentDay)
If col = 7 Then
col = 1
row = row + 1
Else
col = col + 1
End If
currentDay = currentDay + 1
Loop
End Sub
このコードでは、月初の曜日に応じて列を決定し、日付を順に配置します。週の終わりで自動的に次の行に移動するため、月末に空白セルが残りにくくなります。
カスタマイズと応用
必要に応じて、土日や祝日のセルの色付けや、日付以外の情報をセル内に追加することも可能です。また、月を切り替えるボタンや入力セルを作ることで、動的なカレンダー生成も実現できます。
まとめ
VBAでカレンダーを作成する際は、月初の曜日とWeekday関数を活用することで、月末の空白セルを最小限に抑え、見やすいカレンダーを生成できます。サンプルコードを応用することで、さらにカスタマイズしたカレンダー作成も可能です。

コメント