何かのプロジェクトにおいて複数の人と同時並行で仕事を進める時は、進捗が適切に管理できていなければプロジェクトが遅延してしまう場合があります。
原因としては、必要なタスクを忘れていたり、必要なタスクに人を充てていたがトラブルで遅延したりする事が挙げられます。
そのような場合を未然に防ぐ策の1つとして、ガントチャートを活用する事が出来ます。
ガントチャートソフトは無料で配布されているものもあれば、有料で配布されているものもあります。
また、エクセルで作っている方もいます。関数で作っている方もいれば、VBAでマクロを作成している方もいます。
今回は、ExcelのVBAを使ってガントチャートを描画するマクロを作成しました。
その作り方を紹介します。
ソースコードも書いているので簡単に作れますので、
「どうやってコードを書けばいいんだろう?」と悩んでいる方は是非ご覧ください。
VBAでガントチャートを描画する方法
今回紹介するガントチャートは、エクセルのオートシェイプ(図形)で描画します。
ですので、コードのメイン部分は「VBAでどのようにオートシェイプを追加するか?」となります。
詳しく説明していきます。
1. ガントチャートで管理したい項目は?
期日通りにプロジェクトを完遂させるためには何が必要でしょうか?
それら1つ1つのタスクを日程通りに完遂する。
こんな感じでタスクを管理してプロジェクトを成功させていく必要がありますよね。
したがって、ガントチャートで最低限管理したい項目は下記の6項目です。
① タスク
② タスクの担当者
③ 開始予定日
④ 終了予定日
⑤ 開始実績日
⑥ 終了実績日
プロジェクトを成功させるために、①②③④を事前にしっかり計画し、
期日通りに完遂するために、①②④⑤の進捗状況を管理していく事になります。
進捗が悪ければ、計画を立て直す必要もあります。
2. 管理項目をシートに配置する
先ほどの6項目を含むように、エクセルのシートを調整します。
また、プロジェクトの工程を細分化し、タスクレベルまで内容を分解して記載します。
(この作業をWBSを作る、と言います)
※下のイメージでは既にタスクの分類分けがされていたり、罫線が調整されています。
形は自由ですが、最低限の6項目が含まれていればどのような形式でも問題ないと思います。
3. 計画バーをVBAで描画する
VBAで計画バーを描画してみます。
計画バーを描画するためには、「開始予定日」と「終了予定日」の日付を取得し、その日付に対応した計画バーを行く必要があります。
そのコード例を示します。こちらをVBAの標準モジュールに記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | PrivateSub予定日程バー追加() Dimws1AsWorksheet DimiAsLong DimstAsRange,enAsRange DimdayEndAsLong,rowEndAsLong DimrngStartAsRange,rngEndAsRange DimxStartAsSingle,yStartAsSingle,xEndAsSingle,xAsSingle,yAsSingle Setws1=ActiveSheet Withws1 dayEnd=.Cells(4,Columns.Count).End(xlToLeft).Column'カレンダー上の最終日付列の取得 rowEnd=.Cells(Rows.Count,5).End(xlUp).Row'タスクの最終行の取得 OnErrorResumeNext Fori=5TorowEnd '開始予定日と終了予定日の対応列を設定する Setst=.Cells(4,WorksheetFunction.Match(.Cells(i,7),.Range(.Cells(4,1),.Cells(4,dayEnd)),0))'開始予定日のカレンダー上での対応列を設定 Seten=.Cells(4,WorksheetFunction.Match(.Cells(i,8),.Range(.Cells(4,1),.Cells(4,dayEnd)),0))'終了予定日のカレンダー上での対応列を設定 '開始予定日と終了予定日の両方が見つからればバーを描画する SetrngStart=.Cells(i,st.Column)'バーの描画開始セルの設定 SetrngEnd=.Cells(i,en.Column+1)'バーの描画終了セルの1日後を設定 xStart=rngStart.Left 'バーの描画開始位置のX座標 yStart=rngStart.Top'バーの描画開始位置のY座標 xEnd=rngEnd.Left'バーの描画終了位置のX座標 y=rngEnd.Height'バーの高さ方向の幅 With.Shapes.AddShape(msoShapeRectangle,xStart,yStart,xEnd-xStart,y)'オートシェイプでバーを追加 .Fill.ForeColor.RGB=RGB(160,229,133)'バーの色を指定 .Line.ForeColor.RGB=RGB(120,150,90)'枠線の色を指定 EndWith Nexti'次の行へ EndWith EndSub |
大まかな動きは、
1. 開始日予定日と終了予定日に対応するセルをカレンダーから特定する。
2. 開始予定日と終了予定日までのバーをオートシェイプで描画する。
3. もし開始実績日や終了実績日が見つからない場合は、エラー処理を行う。
4. 1~4を最終タスク行まで繰り返す。
となります。
※上のサンプルコードには、3の処理が含まれていません。
例えば、記入された日付がカレンダー上で見つからない場合、日付が入力されていない場合などはエラーが出たり、思い通りの動きをしません。
実際に自分で作ったマクロを運用するためには、様々なエラーを想定して必要なエラー処理を入れておく必要があります。
上のマクロを実行すると次のような画面になります。
5行目から22行目までのタスクや分類項目について、開始予定日と開始予定日に対応した計画バーが描画できました。
4. 実績データを記入する
プロジェクト管理には、一つ一つのタスクの進捗管理が非常に重要です。
そのためには、実績データをまとめていく必要があります。
計画バーと同様に実績バーも描画するために、実績データを入力しましょう。
着手した日を開始日、完了した日を完了日として記入します。
5. 実績バーをVBAで描画する
予定バーを参考にして作成してみてください。
「開始実績日」と「終了実績日」の日付を取得し、その日付に対応した実績バーを行く必要があります。
大まかな動きは、
1. 開始日実績日と終了実績日に対応するセルをカレンダーから特定する。
2. 開始実績日と終了実績日までのバーをオートシェイプで描画する。 ※計画バーより細く設定
3. もし開始実績日や終了実績日が見つからない場合は、エラー処理を行う。
4. 1~3を最終タスク行まで繰り返す。
となります。
5. 描画されている図形の消去
ガントチャートは更新して、新しく書き換えて運用するものです。
そのため、新しい日程に書き換える前に、すでに描画したバーを消去する必要があります。
その際には、下記のようなコードを使います。
※マクロ実行ボタン以外の図形を削除します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | PrivateSubオートシェイプ一括消去() DimshpAsShape ForEachshpInActiveSheet.Shapes Ifshp.Type=msoFormControlThen 'マクロ実行ボタンである場合は何もしない Else shp.Delete 'マクロ実行ボタンでない図形は消去 EndIf Nextshp EndSub |
6. ガントチャートの更新を一括実行させる
ガントチャートをVBAで実現するためには、
「計画バーの追加」
「実績バーの追加(計画バーを参考に作成してみてください)」
「図形の一括消去」
という3つの機能が必要です。
ガントチャートを更新するためには、すべての動作を1サイクル回す必要があります。
その1サイクル分の動きを表すコードを、例えば次のように書きます。
※処理の高速化のために、画面更新・イベント抑制・自動計算停止機能を入れています。
1 2 3 4 5 6 7 8 9 10 11 12 | Subガントチャート描画() 'オートシェイプ一括消去 Callオートシェイプ一括消去 '予定日程バー追加 Call予定日程バー追加 '実績日程バー追加 ’予定バーを参考に作成してみてください。 EndSub |
7. マクロ実行ボタンの配置
マクロを実行するためのボタンを配置します。
開発タブからフォームコントロールのボタンを挿入し、
実行マクロとして「ガントチャート描画」を登録します。
最後に
以上、エクセルのVBAでガントチャートを作成する方法について紹介しました。
ちなみに、コードを追加していくと様々な事が出来るようになります。
ガントチャート描画マクロをガント君という名前で販売しておりますので、一例としてその動作をご確認ください。
ご自分で作られるマクロでどの程度の機能を搭載したいのか? を考える参考にしてみてください。
ガント君 の動作イメージ
ガント君の最新版の内容は、こちらのページからご確認ください。
VBAを学んでいる方は、下のサンプルコードを改造して自分なりのガントチャートを作ってみてはいかがでしょうか?
参考として、今回作ったマクロをサンプルとして保存しています。
VBAを用いたガントチャート作成を検討されている方はダウンロードしてご自由にお使いください。
コメント