Excelでガントチャート自動作成ツールを作ってみた

RPA Advent Calendar 2019 2日目ですね。滑り込みですみません。
2日目にしてちょっと趣向を変えてみます。

##今回作ったもの
**WBSからガントチャートを自動作成するツールをExcelで自作してみました。**

ポイントは3点。

1. シンプルであること
2. プロジェクトの開始日/終了日、タスク、担当者、工数さえ決めれば、勝手にガントチャートを作ってくれること。期限内に終わらない場合はアラートで知らせてくれること。
3. 割込タスクが入ったり、タスクの工数が膨らんだら、以降のタスクを自動的にスライドしてくれること

#####デモ
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Qiita記事用☆<br>ExcelWBS機能拡張版です。担当者別の非稼働日を考慮できるようになりました。 <a href="https://t.co/8pafX5OvYk">pic.twitter.com/8pafX5OvYk</a></p>&mdash; いろはまる (@irohamaruRabbit) <a href="https://twitter.com/irohamaruRabbit/status/1201346983362871296?ref_src=twsrc%5Etfw">December 2, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
#####WBS作成前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/31ef3d33-c60a-971c-ca46-2d482d71118b.png)
#####WBS作成後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/2030e690-56d5-fb21-1b90-b255e66468bd.png)
#####Config
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/2024620e-9782-cd4b-d7e1-d08058912d45.png)



##今回実装する機能
| 機能                | 実装すること       |
|:--------------------|:------------------|
| **ガントチャート作成**   | - グループ、担当者、予定工数を考慮したGC作成<br> - 開始予定日を太字⇒必ずその日からタスク開始<br> - プロジェクト期限内に終わらない場合はアラートを出す<br> - 開始日を太字⇒現在の進捗を青枠で表示<br> - 開始日＆完了日を入力⇒実績を赤枠で表示<br> - 土日祝日、各担当者の非稼働日を考慮 |
| **行追加**              | 選択しているセルの行+1行目に、前タスクをコピーした内容の行を追加 |        
| **行削除**              | 選択しているセルの行を削除 |
| **エクスポート**        | WBS+ガントチャートを別ファイルに出力 |
| **ガントチャート初期化** | 作成されたガントチャートを初期化 |


##機能解説
###ガントチャート作成
####初期設定
#####プロジェクト開始日/終了日を決める
まず、プロジェクトの開始日/終了日を決めます。表示上はM/dですが、値はyyyy/M/dです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/6ff9c9d4-64ad-c5d7-dd5f-d6910202a9d7.png)

終了日は、全タスク×工数がプロジェクトの期限内に収まるか判定するために必要です。
収まらなかった場合、WBS作成時に以下のようなアラートが出て処理が止まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/e70f9e2e-df40-5235-6786-ca71bc3fb5ae.png)

#####Configを設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/2024620e-9782-cd4b-d7e1-d08058912d45.png)

設定できる内容は、

- **祝日、（プロジェクト共通の）非稼働日**
- **各担当者の設定**
    - **ガントチャートの色**
    - **非稼働曜日**
    - **非稼働日**

です。
**（プロジェクト共通の）非稼働日**には、夏休みや年末年始の休暇などの日付を入れておくと良いでしょう。
**各担当者の非稼働曜日**は、個人的に欲しかった項目です（笑）
なぜなら、週1,2常駐の案件を掛け持ちしたとき、曜日でタスクを区切ることが多いからです。月、水はAプロジェクト、火、木はBプロジェクト…といった管理を自動でやってくれるとかなり助かります。
**各担当者の非稼働日**は、例えば有給休暇などの予定が入った場合に随時追加していけば、その日以降のタスクスケジュールも自動計算してくれます。

非稼働日を考慮してくれることで、メンバー全員が休みを取ることに怯えることなく（笑）健康的にプロジェクトを進めることができます。素晴らしい☆

####タスクをグループ化する
今回のWBSツールでは、複数のタスクをグループ化して管理します。グループ番号はそのまま消化の順番になります。
グループに属する各タスクはウォーターフォールでスケジュールが引かれることになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/5088891d-de05-ca4b-da56-512d7b862e1c.png)
例えば上図の場合、2020/1/6までの斎藤さんのタスクが完了しないと、次タスクの「プロセス/オブジェクトレビュー」が行えないことになります。

タスクによりますが、2020/1/10から始まる鈴木さんのタスクが、斎藤さんがタスク消化している間に並行して進められる内容であれば、前倒して実施することももちろんできるでしょう。
その場合、以下のように一度自動的にWBSを作成した後に、2020/1/10からの鈴木さんのタスク開始予定日を「2020/1/6」からに変更してみましょう。

鈴木さんのタスク開始予定日を「2020/1/6」に変更し、**太字**にします（Ctrl+B）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/3f8d1bd0-8538-4729-1dc5-759e325d1eef.png)

その後、**WBS作成ボタン**を押します。
細かいけど、本当は**GC（ガントチャート）作成**の方が良かったかも…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/e4786a44-9a50-ffb1-937c-8e0cf05e22de.png)

すると、鈴木さんのタスク開始予定日は「2020/1/6」からになります。
このように**タスク開始予定日を太字にすると、問答無用でその日からタスクが始まります。**
その日が土日祝日、プロジェクト共通 or 担当者ごとの非稼働日も一切無視されますので、利用するときは注意しましょう。気づかないうちに休出前提のスケジュールになってたなんてことがないように…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/5ebebe02-2122-f9a7-46b2-a98c0e82ca2f.png)

グループ番号について補足します。
例えばグループ番号「1」「2」「3」があったとします。
この場合、グループ番号1の全タスク消化後、グループ番号2に着手する流れとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/1072aae9-56ff-78b9-cae1-681032685ee6.png)


####進捗・実績を表示する
予定だけでなく、実績も表示したいですよね。やっちゃいましょう☆
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/a2683488-072c-2c73-517e-579506a54920.png)

表現を2パターン用意しています。

- 進捗中
- タスク消化実績

進捗中とは、まだそのタスクを消化中で未完の場合を指します。
その場合、**「開始日」列の日付欄に日付を入力し、太字にします。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/8291dbbb-9de0-808e-300a-1d87602a8ae9.png)

すると、ガントチャートのバーに青枠が追加されます。これで進捗中のタスクであることが表現されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/92dc59f4-44e5-e758-d263-9e097d2ce975.png)

タスク消化実績とは、タスクが完了していて、結果的にいつからいつまでタスク消化に時間を充てていたかを表す実績のことです。
その実績を表現するには、「開始日」列に日付を入力するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/f04800fb-8f5b-c653-2a3d-d6539e9ff42b.png)

すると、ガントチャートのバーに赤枠が追加されます。これで実績が表現されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/e677137d-eec5-1489-7743-612642feb826.png)

####プロジェクト共通の非稼働日を設定する
Configシートに非稼働日を設定することができます。
ここで設定する祝日、非稼働日はプロジェクト共通なので、メンバー全員に適用されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/a814bf94-6d2b-6c3e-4de1-3486e1a4dd7e.png)

#####土日祝日
土日はデフォルトで非稼働日として設定されます。明示的に設定する必要はありません。
土日も稼働したい場合は、前述した開始予定日を太字にしてムリヤリ稼働させましょう。
祝日はyyyy/M/d形式で明示的に設定する必要があり、ちょっと面倒なのですが、以下サイトなどからコピペで良いでしょう。
[Excel最新版！2019年～ 祝日一覧（2019年～2022年まで）](http://office-qa.com/Excel/ex176.htm)

#####担当者別ガントチャートの色、非稼働曜日、日付
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/e5754000-65be-a10d-c9d1-ac582af62eb9.png)
ここで、プロジェクトメンバーと各メンバーの色、非稼働曜日/日を設定することができます。
曜日は月～金をカンマ区切りで設定する形となります。以下のように曜日順は問いません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/ded895d3-11a4-b38f-fc35-d080cfd62ee7.png)

各メンバーの非稼働日はいくつ設定してもOKです。

###エクスポート
例えば、お客さんにWBSをシェアする必要がある場合、前述した機能がそのまま使えてしまうと、スケジュールが改変される恐れがあります。
なので、ツールはこちらで持っておき、お客さんにはxlsxファイルのWBSを提供したいところです。

**エクスポートボタンを押す**と、名前を付けて保存ダイアログが表示されます。
ファイル名は「WBS_(今日の日付)」がデフォルトでは入っています。後は保存するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/d636a833-de52-1464-2fe8-4a1a0ecf34fe.png)

この機能も、プロジェクト期間やタスク数などにより多少時間がかかる場合があります。
以下ダイアログが表示されたらエクスポート完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/59022b0b-f54c-bd6e-54aa-68b159e6fee6.png)

ヘッダーの色など多少変化はありますが、複製できています。よしよし☆
ボタン群も削除されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/2a83b2b6-88d4-f7a5-0959-d7aea3d91c40.png)

###ガントチャート初期化
作成したガントチャートを初期化します。
各タスクの「完了日」列より左の項目は消されませんのでご安心を。

使い方は、**GC初期化ボタンを押すだけです。**
※GCはガントチャート（Gantt chart）の略です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/d3808215-2517-91e3-83a6-29acbc33dfed.png)

#####初期化前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/bf4364b9-de07-93b4-1b10-d0bd227d7fd7.png)
#####初期化後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/7a3807de-30f4-ab4f-3c60-78cfd6a601a5.png)

###その他
#####今日の日付列は薄い赤色で表示される
分かるに越したことはないでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/0e8fed75-aa7d-3fb8-578b-16651f10ff9b.png)

#####非稼働日はグレーで表示される
特に、各担当者の非稼働日がタスク別でもちゃんと表示される点は、我ながらポイント高いと思っています（笑）
下図の場合、鈴木さんは月～水、佐藤さんは水曜日が非稼働日だということが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/c33df6dd-9291-c67d-77f0-99a16cea32d5.png)

##2021/02/01 v1.1 UPしました
### 修正点

- **スケジュールの開始日以前に本ツールでWBSを作ろうとすると処理が途中で止まってしまうバグを修正**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/2bd5b603-4482-96d0-62eb-79d4dfcc7801.png)

- **直近の自分のタスクの終了日を起点に次のタスク開始日を決められる**
ちょっと何言ってるか分かんないと思いますが（笑）図の**H列**に何らかのテキストを入力すると、誰かのタスクが終わらないと着手できないタスクではなく、直近の自分のタスクが終わればすぐに着手できるタスクとしてみなすことができる機能を追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/6bf8a5d3-baad-c23a-dd5e-f14d5e4cf73b.png)

eng1のタスクに注目してください。
一つ上のタスク「単体テスト再実施」より日付が過去になっています。これはeng1の直近のタスク終了日3/10を起点にタスクの開始日を設定しているからです。
3/12の左のセルに「1」が入っていることにより、このようなスケジュールの設定が可能になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/ed3a725d-fae2-9413-36c0-8e6f52a721a8.png)

3/12の左のセルに何も入力しなければ、タスク開始日は3/19になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/29bb7aec-1774-5ab1-3aae-5cd1fbb7789b.png)

##ツール置いてます
本記事で紹介したWBSツールです。

[easyWBS_v1.2](https://github.com/kktrip/excel/blob/master/easyWBS_v1.2.xlsm)