プロジェクトの進捗管理でおなじみの「ガントチャート」。専用ツールを使わずにExcelで作っている方も多いと思いますが、タスクが増えるたびにセルを1つずつ塗り直すのは意外と手間がかかります。
この記事では、タスク一覧表(タスク名・開始日・終了日・進捗率)から、日付ヘッダーとバー(棒)を自動生成するVBAマクロを紹介します。進捗率に応じて完了部分と未完了部分を色分けする方法まで解説するので、そのままコピペして使っていただけます。
元になるデータの準備
まず、シート上に以下のような表を用意します。シート名は「ガントチャート」としています。
| 列 | 内容 | 例 |
|---|---|---|
| A列 | タスク名 | 要件定義 |
| B列 | 開始日 | 2026/10/1 |
| C列 | 終了日 | 2026/10/5 |
| D列 | 進捗率 | 0.6(60%) |
F列以降には、マクロが自動で日付ヘッダーとバーを作成します。あらかじめ用意しておく必要はありません。
完成イメージ
マクロを実行すると、以下のような表になります。
- F1セル以降:プロジェクト全体の開始日〜終了日までの日付が横に並ぶ
- 各タスクの行:開始日〜終了日の範囲のセルに色が付く(バーになる)
- バーのうち、進捗率に応じた部分だけ濃い色で塗られる(完了部分の可視化)
ガントチャートを自動作成するマクロ
タスク一覧からプロジェクト全体の期間を割り出し、日付ヘッダーとバーをまとめて作成するコードです。
Sub CreateGanttChart()
Dim ws As Worksheet
Dim lastRow As Long
Dim lastCol As Long
Dim headerCol As Long
Dim projectStart As Date
Dim projectEnd As Date
Dim taskStart As Date
Dim taskEnd As Date
Dim doneEnd As Date
Dim currentDate As Date
Dim progress As Double
Dim totalDays As Long
Dim doneDays As Long
Dim i As Long
Dim c As Long
Application.ScreenUpdating = False
Set ws = ThisWorkbook.Worksheets("ガントチャート")
headerCol = 6 ' F列から日付ヘッダーを配置
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' プロジェクト全体の開始日・終了日を算出
projectStart = WorksheetFunction.Min(ws.Range("B2:B" & lastRow))
projectEnd = WorksheetFunction.Max(ws.Range("C2:C" & lastRow))
lastCol = headerCol + (projectEnd - projectStart)
' 日付ヘッダーを作成
For c = headerCol To lastCol
ws.Cells(1, c).Value = projectStart + (c - headerCol)
ws.Cells(1, c).NumberFormat = "m/d"
Next c
' 既存のバーをクリア
ws.Range(ws.Cells(2, headerCol), ws.Cells(lastRow, lastCol)).Interior.ColorIndex = xlColorIndexNone
' タスクごとにバーを描画
For i = 2 To lastRow
taskStart = ws.Cells(i, "B").Value
taskEnd = ws.Cells(i, "C").Value
progress = ws.Cells(i, "D").Value
totalDays = taskEnd - taskStart + 1
doneDays = Int(totalDays * progress)
doneEnd = taskStart + doneDays - 1
For c = headerCol To lastCol
currentDate = ws.Cells(1, c).Value
If currentDate >= taskStart And currentDate <= taskEnd Then
If currentDate <= doneEnd Then
ws.Cells(i, c).Interior.Color = RGB(68, 114, 196) ' 完了部分:濃い青
Else
ws.Cells(i, c).Interior.Color = RGB(189, 215, 238) ' 未完了部分:薄い青
End If
End If
Next c
Next i
Application.ScreenUpdating = True
End Sub
コードのポイント解説
プロジェクト全体の期間を自動算出
WorksheetFunction.MinとWorksheetFunction.Maxを使って、全タスクの開始日・終了日から自動でプロジェクト全体の期間を割り出しています。タスクが追加・削除されても、この部分を書き直す必要はありません。
進捗率で色を2段階に分ける
totalDays × progressでタスク期間のうち完了している日数を計算し、doneEnd(完了部分の最終日)を求めています。日付ヘッダーの各セルがこの範囲に含まれるかどうかで、濃い色・薄い色を出し分けています。
既存バーのクリア処理
タスクの期間が変更された場合に古いバーが残らないよう、色を塗る前に対象範囲をいったんクリアしています。マクロを何度実行しても正しい状態に更新されます。
カスタマイズのヒント
- 土日を強調したい場合:日付ヘッダーの
Weekday関数で判定し、土日の列だけ背景色を薄いグレーにすると視認性が上がります - 今日の位置を強調したい場合:
Date関数と日付ヘッダーを比較し、該当する列だけ罫線を太くすると「現在地」がひと目で分かります - タスクが多い場合:
Application.ScreenUpdating = Falseを入れているため大きな表でも比較的高速に動作しますが、さらに行数が多い場合はApplication.Calculation = xlCalculationManualも併用すると効果的です
まとめ
今回は、タスク一覧表から自動でガントチャートを作成するマクロを紹介しました。
WorksheetFunction.Min・Maxでプロジェクト全体の期間を自動算出できる- 日付ヘッダーはループで1日ずつ加算して作成する
- 進捗率に応じてバーの色を2段階に塗り分けることで、進み具合を視覚化できる
- 再実行しても正しく更新されるよう、事前にバーをクリアしておくのがポイント
タスクの追加・変更のたびに手作業でセルを塗り直していた方は、ぜひこのマクロを活用して進捗管理を効率化してみてください。

コメント