Excel VBAを活用して、カレンダー上に氏名と人数を期間に合わせて表示し、重複対応やセル自動調整を行う方法を解説します。特に、開始日と終了日に基づき初日のみに表示させつつ、セルのサイズや内容の重なりも考慮した実践的な手法です。
カレンダー範囲とデータ構造の確認
カレンダーの対象範囲はE5からAI28で、入力シートには部屋、氏名、人数、開始日、終了日がA1からE1にあり、A2からE500までの手入力データがあります。
この構造をもとにVBAでループ処理を行い、期間の範囲に合わせてセルの色付けと氏名・人数の表示を行います。
期間に基づいた氏名と人数の表示
まず、各データ行の開始日と終了日を取得し、対象カレンダー範囲に対応するセルを計算します。初日のセルには氏名と人数を2行に分けて表示することで、重複時にも見やすくなります。
氏名はセルからはみ出せるように、セルのWrapTextをFalseにし、横方向に表示できるように設定します。人数はその下の行に着色して表示します。
セルの自動調整と重複対応
セル内の表示内容に応じて高さや幅を自動調整します。VBAのAutoFit機能や、必要に応じて列幅や行高さを手動調整することで、重複した期間でも見やすいレイアウトを維持できます。
重複する期間は、セル内で氏名と人数を改行で2行に表示することで整理します。これにより、同じセルで複数の情報を管理可能です。
月切替に対応する動的表示
カレンダーの月を切り替えると、入力シートの開始日と終了日に基づいて表示内容を再計算します。VBAで月の変更イベントやボタンにマクロを割り当て、再描画することで動的な表示が可能です。
土日や祝日の色付けは既存のカレンダー構造を利用し、VBA実行時に影響が出ないように設定します。
サンプルVBAコード例
Sub DisplayCalendar()
Dim wsCal As Worksheet, wsData As Worksheet
Dim lastRow As Long, i As Long
Set wsCal = ThisWorkbook.Sheets("Calendar")
Set wsData = ThisWorkbook.Sheets("Input")
lastRow = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row
wsCal.Range("E5:AI28").ClearContents
wsCal.Range("E5:AI28").Interior.ColorIndex = xlNone
For i = 2 To lastRow
Dim startCol As Long, endCol As Long
startCol = DateDiff("d", DateSerial(Year(Now), Month(Now), 1), wsData.Cells(i, 4).Value) + 5
endCol = DateDiff("d", DateSerial(Year(Now), Month(Now), 1), wsData.Cells(i, 5).Value) + 5
If startCol >= 5 And startCol <= 35 Then
wsCal.Cells(5, startCol).Value = wsData.Cells(i, 2).Value & vbCrLf & wsData.Cells(i, 3).Value
wsCal.Cells(5, startCol).WrapText = False
wsCal.Range(wsCal.Cells(5, startCol), wsCal.Cells(5, endCol)).Interior.Color = RGB(200, 230, 255)
End If
Next i
End Sub
まとめ
VBAを使えば、カレンダー上に氏名と人数を期間に合わせて表示し、セルの自動調整や重複対応も可能です。初日のみ表示や2行表示、月切替対応を組み合わせることで、複雑な条件下でも見やすいカレンダーを作成できます。


コメント