【ExcelVBA・マクロ】ガントチャートを自動作成するマクロ|開始日・終了日・進捗率からスケジュールバーを自動生成【コピペOK】

ExcelVBA

プロジェクトの進捗管理でおなじみの「ガントチャート」。専用ツールを使わずに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段階に塗り分けることで、進み具合を視覚化できる
  • 再実行しても正しく更新されるよう、事前にバーをクリアしておくのがポイント

タスクの追加・変更のたびに手作業でセルを塗り直していた方は、ぜひこのマクロを活用して進捗管理を効率化してみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

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