VBAでカレンダーに氏名と人数を重複対応で自動着色表示する方法

Visual Basic

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行表示、月切替対応を組み合わせることで、複雑な条件下でも見やすいカレンダーを作成できます。

コメント

タイトルとURLをコピーしました