見出し画像

Excel VBA - WBSとガントチャートでタスクを管理する

Shinji Yamaguchi
※ WBSに関する本文およびテンプレートは制限無く公開しておりますので、当該記事をご購入頂かなくてもWBSテンプレートの利用は可能です。応援いただける方のみご購入頂けますと幸甚です。

こんにちは。最近ふとWBSのテンプレートを作ってみたくなりまして、ExcelのVBAを使ってWBSからガントチャートを作成するテンプレートを作成いたしました。

画像1

Windows版

・Windows10 Pro環境 2021/9/20時点のMicrosoft Office365環境下で動作確認済み

Windows&Mac両対応版

・Windows10 Pro環境、MacBook Pro (M1 2020) Big Sur 11.5.2環境における2021/9/20時点のMicrosoft Office365環境下で動作確認済み

主な機能:
カレンダーにマイルストンを反映する機能
WBSをもとにガントチャートを生成する機能(二重線方式)
イナズマ線を引く機能
クリティカルパスを引く機能
エクスポート機能
※ 動作確認済みではございますが、不具合が全く無いことを保証するものではございません。ご利用にあたって、不具合等による不利益が生じたとしても一切ご対応できませんのでご留意ください。

当記事では、WBSの書き方について簡単な説明と、VBAでの機能実装時の考え方について説明いたします。

VBAの学習や機能実装の考え方に興味のある方、実際にVBAのソースをみたい方、ご自身でカスタマイズしたい方はご自由にWBSテンプレートをご利用ください。

ただし、個人利用、会社内での利用は問題ありませんが、当該テンプレートを販売するのはやめてください。

WBSとは

システム開発等の現場ではタスク管理ツールとしてWBSがよく使われています。

おそらく誰でも一度はタスク管理を経験しているのではないかと思います。仕事におけるタスク管理はもちろん、小中高大と学校における時間割、試験前の学習ス計画、夏休み冬休みの学習計画等々、何か自身でやるべきことをリスト化して書き出して期日を決めたり、優先度を決めたりなど。

タスク管理ツールとしてよく使われるのはやることを箇条書きにしたTODOリストですが、WBSもTODOリストの一種です。

Work Breakdown Structureの略で、単純にやることを列挙するのではなく、目的に必要な作業を漏れなく列挙し、構造化して見える化するための工夫を施したTODOリストになります。

Work Breakdownとあるように、WBSでは大枠の作業をまず列挙して、それぞれを無理なく取り組めるサイズの作業に分解して列挙していきます。これによって大きなタスクを小さなタスクの集合体と捉えることができるため、必要な作業が漏れにくくなります。

また、Structureとあるように、大きな作業を中くらいの作業、小さな作業へと分解しているため、全体として何をやれば目的を達成できるのか、必要な作業が構造化されて見えるようになります。

通常のTODOリストでは目の前の見えている作業を列挙してしまいがちで、全体として何をしなければいけないのかが見えにくく、余裕をもって作業完了したつもりが最終的に作業漏れがあってスケジュールの遅延に繋がることもあります。

非常に小さなタスクであれば単純なTODOリストでも作業漏れ等無く管理できるかもしれませんが、長期にわたって多人数で進めたりするような大きなプロジェクトのタスクになりますと、TODOリストで管理するのは非常に大変です。

そのため、システム開発等の現場ではタスク管理ツールとしてWBSをよく利用します。

また、単純なTODOリストやWBSとセットでよく使われるのがガントチャートになります。ガントチャートとはカレンダーにタスクの開始終了予定やそれらに対する実績を棒グラフ上に記述したもので、スケジュールを目で見てわかるようにしたものです。

WBSとガントチャートはほとんどセットで利用されるため、昨今WBSと呼ばれているもののほとんどはガントチャートとセットになっていることが多いと思います。

Redmine、Backlog、Jiraなどのタスク管理アプリケーションやサービスも多く存在しています。それらのサービスにおいてもガントチャート機能はよく使われています。

いまさらExcelで管理なんて非効率だとか、高度なタスク管理ができないなどの声もあるでしょうが、あえてExcelで作成したのは配布しやすく、個人でも組織でも利用しやすいメリットがあるためです。

当該記事は高度なタスク管理ツールを既に導入済みの方々に向けたものでは無いことを予めご認識頂ければと存じます。

また、システム開発以外のお仕事でもWBSでタスク管理を行っている方は多いのではないでしょうか。

しかしながら、会社やプロジェクトの事情によりタスク管理ツールの導入が難しく、Excelファイルで管理している会社はまだまだ多いだろうと想像しております。

WBSの作り方 - 概要

簡単にですがWBSの作り方についてご説明いたします。

WBSを作るには、その名前の通り、目的のために必要なタスクを洗い出し、分解して、構造化して見えるようにすることが必要になります。

手順1:目的のために必要なタスクを洗い出す

例えば、システム開発であればウォーターフォールモデルにあるように、要件定義、基本設計、詳細設計、開発・単体テスト、結合テスト、システムテスト…と大枠のタスクがあります。まずはこれらのタスクを洗い出します。

もちろん、システム開発以外のタスクにおいても利用できますので、例えば〇〇試験に向けての午前試験対策、午後試験対策等々の大枠のタスクを洗い出します。

手順2:手順1で洗い出したタスクをより細かい単位に漏れなく分解する

手順1で大枠のタスクを洗い出したあとは、それぞれの大枠のタスクでやるべきことをもう少し細かい粒度で洗い出します。

要件定義であれば、現在の業務フローのまとめ、新業務フローのまとめ、機能一覧の作成、画面一覧や画面イメージの作成等々のタスクに分解していきます。

そして、例えば「現在の業務フローのまとめ」タスクをさらに分解して、現在の〇〇業務フロー図作成、△△業務フロー図作成というように「現在の業務フローのまとめ」タスクを終わらせるには何を揃える必要があるのか?ということを考えながら漏れなく必要なタスクを洗い出していきます。

手順3:手順2で分解した作業をツリー構造によって階層化して表す

上記手順1、2で洗い出した作業をツリー構造によって階層化して記述します。ツリー構造とすることで、大作業、中作業、小作業と分けられ、中作業を終えるためにはどのような小作業が必要なのかを把握することができます。

以上になります。

タスクの分解の目安としては3段階までの分解にします。それ以上分解してしまうと、粒度が細かくなり過ぎて管理が難しくなります。

もしも3段階以上細かくなるようであれば、大枠のタスクの単位でクローズアップしたWBSを作成します。例えば〇〇システム開発というプロジェクトにおいて、プロジェクト全体のタスクを管理するWBSのほかに、要件定義だけにフォーカスしたWBSや、基本設計にフォーカスしたWBSを作成します。

そうすることで、全体スケジュールを把握しつつ、各フェーズ毎のスケジュールも細かく管理することができるようになります。

WBSのメリット

WBSは簡単に作成できそうですが1日2日がかりで作成することもあり、手間がかかる結構面倒なものです。しかしながら、その分メリットもあります。

1.全体の見通しが良くなり、何をすればよいのかスコープが明確になる
2.必要な作業の抜け漏れ、重複を防げる
3.小さなタスクに分解することで作業を進めやすくなる

WBSを作成するようになりますと、目的を達成するために必要なタスクを大枠で捉える力、分解する力が身につきます。また、それに伴いタスクを進めるにあたり並行作業できるもの、直列作業しかできないものなどが見えてくるようになり、ほかのタスクの完了待ち時間などを考えたスケジュールを組むことができるようになります。

何となく1週間くらいでやれるだろう、1か月もあればできるだろうなんて考えていたタスクが、実は分解して個々のタスクに必要な作業量を見積もっていくと全然見通しが甘かったなんてことはよくあります。

WBSを作成すると、それらの一つ一つのタスクを先立って考えることになりますので、漠然としていたスケジュール感が修正され、「ある程度」現実的なスケジュール感で計画することができるようになります。

※ 「ある程度」としているのはWBSを作成しても正確なスケジューリングは難しいからです。

WBSの作り方 - タスク分解のコツ

WBSを作成する際は、何を目的としたプロジェクトのWBSかを意識して、そのプロジェクトの成果物や作業の流れに着目します。

1.プロジェクトは何を目的としているか
2.プロジェクトはどんな成果物を必要としているか
3.プロジェクトはどのような作業の流れで進めるのか

例えば、夏休みの学習計画であれば各教科の宿題、システム開発であれば要件定義書や基本設計書などのドキュメントにプログラムのソースコードなどが成果物に該当します。

そして、その成果物を作成するためにはどんな作業が必要か?という観点で組み立てていきます。

例えば要件定義書については業務フローを明確にして、業務の中で必要なアプリケーションの機能(入出力)を明らかにして、と作業の順番を考えます。

具多的な進め方のステップは以下の通りです。

1.WBS作成の準備 - WBS作成に必要な情報を収集する(プロジェクトで何をするのか?何が成果物か?前提条件は?)
2.タスクの洗い出し - プロジェクトの成果物を用意するにあたり、どんな作業が必要なのか?必要な作業に漏れはないか?
3.各タスクの工数見積もり - 各タスクにはどのくらいの人、どのくらいの時間が必要か?
4.スケジュールの作成 - 各タスクの優先度、前後関係から作業順を決めて、必要な工数をもとに期日を決めてスケジュールする
5.各タスクの役割分担を行う

上記の手順でプロジェクトの計画段階でWBSを作成します。

プロジェクトの計画段階では不確定要素も多く、粗いタスクの洗い出しになるかもしれませんが、粗くても全体をおさえることが大切です。全体をおさえるために必ずトップダウンでタスクの洗い出しを行います。

また、末端タスクの詳細内容が判明しておらず、粗いものだったとしても、漏れなく必要な作業を捉えておくことが大切になります。

例えば要件定義の場合、要件定義実施前なので当然具体的な業務の内容や必要なアプリの画面などについては情報が不足していると思います。

しかしながら、業務フロー図を作成する(どの業務の?)、画面イメージを作成する(どの画面の?)、といった詳細不明でも必要になる作業はすべて洗い出しておく必要があります。

各工程を通じて計画段階では不透明だったタスクについては明らかになった段階でWBSを詳細化していきます。

WBSでタスクを洗い出す際は、粒度を揃えて分解するとわかりやすく使いやすいものになります。

例えば要件定義、基本設計などの工程を1段階目、2段階目に業務フローなどの各種ドキュメント(中間成果物)、3段階目に中間成果物を作成するための作業項目など。

メインの作業と、付帯作業にわけて考えると粒度を揃えやすくなります。メインの作業とは例えば「要件定義書を作成する」といった必要な成果物に直結する作業になります。付帯作業というのは技術情報の調査や現状のヒアリング、社内で必要な手続きや成果物のレビューなどです。

また、切り出すタスクのボリュームについても30分や1時間など非常に短時間で終わるようなタスクは個々で管理すると大変ですので、半日から1日単位ぐらいのタスクになるようにするとよいと思います。

簡単にWBSの書き方についてご説明いたしましたが、より詳しいWBSの書き方やテクニックにつきましては、いくつか書籍が出ておりますので、工数やスケジュールの見積もり方法を含め、より詳しい情報をお求めの方は書籍を参考にされると良いと思います。

VBAで機能を実装する

ここから先はプログラミングに興味のある方、自分でもVBAを使ったマクロを作成してみたい方向けの内容になります。

ExcelなどのMicrosoft Office製品ではマクロと言って、VBAという言語を用いてプログラミングによる機能開発をすることができるようになっています。

Excelのオプションで開発タブをリボンに加えると、VBAに関する機能メニューが追加されます。

VBAで機能開発するにあたって便利なのが「マクロの記録」機能です。マクロの記録機能を使いますと、オートシェイプを生成したり、背景色を変更したり、Excelファイル上の操作がそのままプログラムとして記録されます。

これをうまく使うことでオートシェイプの操作にはどういうライブラリを使えば良いのかなどヒントを得ることが可能です。

記録されたプログラムからVBAのリファレンスを確認することでさらに詳細の利用方法を知ることができます。

機能を実装する際にまずやること

何かしらの機能を実装する場合、まずはその機能に必要な情報が何かを考えます。

プログラミングを学び始めたばかりですと、このような必要な情報を揃える作業に慣れていないため、何かを作ろうと考えてもそこから手も足も出ずに行き詰まってしまうことがしばしばあります。

例えば今回作成したWBSについては、WBSとはどんなモノでどんな項目が必要か?ガントチャートとはどういうものか?イナズマ線とは?クリティカルパスとは?そもそもWBSは何を管理するものだった?等々、さまざまな情報が必要になります。

このような情報を集めて整理することで、扱うデータ項目にどういうものが必要になるのかが見えてきます。

まずはゆっくりでいいので、落ち着いて作りたいものに必要な項目を洗い出し、それらの項目を使ってどのような動きをさせたいのかじっくり考えてみましょう。

WBSに必要な項目

WBSを作成するにあたり、必要な項目を洗い出してみます。

WBSは一種のToDo管理であり、「プロジェクト」における「やること」=「タスク」を管理します。そのタスクは「プロジェクトの工程」別に管理され、「誰が」「何を」「いつまで」にやるのか、実際には「何時着手」して「何時終えた」のか、「予定」、「実績」を管理するためによく使われます。

予定より進んでいるのか、遅れているのか、現在の状態はなど、「進捗」を把握するためのツールです。予定より進んでいるのか、遅れているのかを判断するには何時から見て進んでいるのか、遅れているのか「基準となる日」が必要です。

このようにWBSとは何ぞや?どんな情報必要だっけ?と考えると「」で括ったような単語から必要な情報が見えてきます。

・プロジェクト → プロジェクト名、プロジェクトの期間
・プロジェクトの工程 → タスクの大枠
・タスク → タスク名
・誰が → タスクの担当者
・何を → タスク
・何時まで → タスクの開始予定日、終了予定日
・何時着手 → タスクの開始日、終了日
・予定 → タスクの開始予定日、終了予定日
・実績 → タスクの開始日、終了日
・進捗 → 予定、実績、タスクの状態
・基準となる日 → 基準日

上記のように作りたいものの特徴を列挙していくことを実践すると、これがデータベースに必要なテーブルであったりテーブルの項目になっていきます。

今回はExcel VBAによる機能実装ですので、データベースではなく、情報を保持するのはExcelシートになります。

上記の項目を元にWBSの一覧をレイアウトします。

ガントチャートに必要な項目

WBSをもとにガントチャート生成機能を実装するにあたり、必要な項目を洗い出します。

ガントチャートは「カレンダー」上に「棒グラフ」で「タスクの予定と実績」を表示するもので、視覚的にタスクのスケジュールを把握できるようにしたものです。

ということで必要な情報としては、以下の通りです。

・カレンダー
・棒グラフ
・タスクの予定と実績

さらに詳細化していきます。

ガントチャートに必要な項目 - カレンダー

カレンダーに必要な情報としては、いつからいつまでのカレンダーが必要なのか、年月日、曜日、祝日は?会社独自のお休みの日は?などと考えていきます。

さらに、カレンダーを表示するにあたり、見た目の情報も必要になります。通常の稼働日と区別するために、土日、祝日、非稼働日に色をつけて区別できるようにしたいですね。(一般的なカレンダーでは日曜日、祝日は赤で区別されていますね。)

また、予定通りなのか遅れているのかを判断するのに基準日が必要でしたので、基準日がどの日付になっているのかも見た目でわかるようにしたいですね。

上記のようなことを考えていくと、必要な情報は以下になります。

・カレンダーの期間 → プロジェクトの期間
・土日、祝日、非稼働日、基準日の見た目 → カレンダーの背景色あるいは文字色、罫線の色など

上記情報が出てきたところで疑問が湧きます。それは「カレンダーを描画するための見た目の設定」をどこでどのように持つか?です。

WBSに必要な項目を洗い出した際に、Excel VBAではExcelシートがデータベースのテーブルの代わりと申し上げたように、やはりこれらの設定値についてもExcelシートを使います。

もちろん、プログラム内に固定値で色の情報などを持つこともできます。しかしながら、利用していく内にやはりここの色は赤よりも青がいい、灰色がいいなどと変更したくなるかもしれません。

そういった変更を行う際に都度プログラムを修正するのは面倒ですね。なので設定用のExcelシートを作って、プログラムからはその値を読み取って利用するようにすれば、プログラムを変更しなくても見た目を変えることができます。

これはVBAに限らず、アプリケーションを開発する上でよく使うテクニックの一つになります。エラーメッセージやボタン名などを設定ファイルにまとめておくことで、プログラムは変更せずとも表示する文言を変更したりすることができます。

話が逸れましたが、プログラムをなるべく変更しなくても見た目や動きを変えることができる工夫があることを知っておいてください。

ひとまずガントチャートを作るためのカレンダーについて情報整理できれば、WBSをもとにカレンダーを生成するところまで機能を作り込んでも問題ありません。

ガントチャートに必要な項目 - 棒グラフ

続いて棒グラフですが、棒グラフは縦向きでしょうか、横向きでしょうか。

ガントチャートは年月日を縦軸にして、横軸にタスクを並べ、横軸のタスクが持つ予定や実績をもとに縦軸の年月日に合わせて棒グラフを描きます。そのため、棒グラフは横棒グラフになります。

棒グラフを描くにはどうしたら良いでしょうか?

Excelシートでできることを考えますと、背景色を塗る、あるいはオートシェイプで長方形の箱、あるいは太線などを用意すれば棒グラフになりそうですね。

・背景色を塗りつぶす
・オートシェイプを描く

背景色を塗りつぶして棒グラフを作成する場合、1つのタスクを1行で表しているとすると、予定と実績をどのように1行の中で表せば良いでしょうか?

例えばよくあるのは予定と実績の色を別々にして、予定の棒グラフを進捗率に応じて実績の色で塗りつぶしていく方法です。

オートシェイプで棒グラフを用意する場合はどうでしょう?

背景色を塗りつぶす方法と同じようにしようとすると、進捗率に応じて予定のオートシェイプ、実績のオートシェイプのサイズを調整して横一列に連結すれば同じようにできそうですね。

もしくは、1行の中で予定に対応する棒グラフと、実績に対応する棒グラフの両方を並行して描画すると予定に対し、実績の棒グラフがいつから始まって、いつで終わっているかを見ることで先行着手したのか、予定通りなのか、遅れて着手したのかなど、一目瞭然ですね。

この棒グラフを予定と実績で並行して描画する方法を二重線方式と言います。おそらく背景色を塗り潰すよりもわかりやすく、VBAでオートシェイプを描く方法さえわかれば、二重線方式で表すのが予定と実績に1対1でそれぞれの棒グラフが紐づくため、一番扱い易いと思います。

ではオートシェイプで棒グラフを描くにあたって、必要な情報はどんなものが必要でしょうか?

まずはVBAでオートシェイプを描く方法を知ることから始める必要がありますね。それからカレンダーに合わせて、オートシェイプを描き始める日付の位置、終端の位置をどのように取得すれば良いか、オートシェイプの色は固定か、設定値で変えるようにするか、設定値で変える場合は担当者毎に変えることができた方が良いか?などと考えていきます。

・VBAでのオートシェイプの取り扱い方
・オートシェイプを描画する際の開始と終了位置の取得
・オートシェイプの太さ、色などの設定値をどうするか

ここでオートシェイプを描く方法を知るためのヒントとして、マクロの記録機能を有効活用します。

Excelの開発タブを開いて頂き、まずはマクロの記録を開始します。続いて使いたいオートシェイプをシート上に描きます。最後にマクロの記録を停止します。

上記の手順でVBAのコードが生成されているはずですので、使われているオブジェクト名やメソッド名を確認してみてください。

そのままGoogle検索で「VBA オートシェイプ」みたいに検索して頂いても良いですが、オートシェイプは形も様々ですので、使いたいオートシェイプを実際にシートの上に描き、マクロの記録機能でどのようなオブジェクトを使っているのか、どのようなメソッドを使っているのか、名称を知った上で検索した方がより欲しい情報に辿り着くことができます。

なお、Excelでは各セルには座標情報があり、どの列のどの行のセルなのか、セルの左端の位置、セルの上部の位置などを持っています。これらの情報とセルの幅や高さの情報を組み合わせて計算することで、セルの左から少し余白をあけてオートシェイプを描き始めたり、セルの上部位置+セルの高さの半分でセル中央位置に描画するなど可能になります。

タスクの予定と実績を1行で描画する場合、1行の高さもそれなりに太くする必要があります。そのため、セルの高さを揃える方法なども調べる必要があります。

また、棒グラフをどこからどこまで描くかは各タスクの予定と実績によって異なりますので、予定の値、実績の値といったWBSの項目に入力された値をどのように読み取ればよいか、その値からカレンダーの位置をどのように特定すれば良いかといった具体的な実装方法についても検討する必要があります。

このように必要な情報について細かく考えていきますと、機能実装に必要なものが徐々に見えてくるようになります。

おわりに

WBSテンプレートのVBAプロジェクトは当初パスワードをかけておりましたが、パスワードによる制限なく公開することにいたしました。

この先本文はございませんが、応援いただける方は当該記事をご購入頂けますと幸甚です。

※ WBSに関する本文およびテンプレートは制限無く公開しておりますので、当該記事をご購入頂かなくてもWBSテンプレートの利用は可能です。この先に本文はありませんのでご注意ください。

この続きをみるには

この続き: 0文字

Excel VBA - WBSとガントチャートでタスクを管理する

Shinji Yamaguchi

480円

期間限定
\ PayPay支払いすると抽選でお得に /

この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
Shinji Yamaguchi

もしよろしければサポート頂けますと大変幸甚に存じます。 今後ともエンジニア経験から何かお役にたてる内容を発信できればと思料しております。