ホールケーキをカットしたような、円を分割したタイムスケジュールをサクッと作成できるエクセルを作りました。
実はこの手のグラフの作り方を解説しているサイトはたくさんあるのですが、この記事ではそれに一工夫加えて、自動でグラフが調整されるようなエクセルに仕上げました。
もちろんグラフのデザインは自由に設定できます。お好みのおしゃれなスケジュールを作成してみてください。
ダウンロードはここから
使用方法
予定欄にスケジュールを入力するだけで、自動でグラフが変化します。
グラフの色や文字のフォントなど、自由に調整してお使いください。
グラフの設定
実はこのスケジュールは、2つの円グラフの組み合わせにより作成されています。

そして、それぞれの系列ごとに「系列値」「ラベルの内容」「軸の基線位置」を設定しています。3つ目の「軸の基線位置」とはグラフの回転のことで、マクロで自動的に角度の設定をしています。
系列 | 系列値 | ラベルの内容 (セルの値) | 軸の基線位置 |
---|---|---|---|
系列1 | 固定値(F4:F27) | 時刻表示(G4:G27) | 353° |
系列2 | 継続時間(E4:E27) | 予定(C4:C27) | マクロで自動調整 |
そのほかにデザイン的な設定として、ラベルの位置、枠線、文字の色など細かい変更を加えています。
マクロについて
全体の流れ
マクロによるエクセル全体の流れは、
- (予定を入力)
- ユーザー定義関数により、予定の継続時間を計算
- (1のデータをもとにグラフが変化)
- 1日の最初の予定の時刻をもとにグラフを回転
となっています。1と2はマクロによる自動操作ではないのでカッコで囲んでいます。
なかでもポイントは3の回転で、スケジュールがきちんと0時から始まるように、ここで調整をしています。
モジュールの概要
このエクセルでは、標準モジュールとシートモジュールを1つずつ作成していて、それぞれ1つのプロシージャを記述しています。
標準モジュールにはシートモジュールでは
標準モジュール | シートモジュール | |
---|---|---|
プロシージャ | Functionプロシージャ | Subプロシージャ |
記述内容 | ユーザー定義関数 | Worksheet_Changeイベント |
目的 | 予定の継続時間を計算 | グラフを回転 |
このサイトで紹介するVBAは、変数やオブジェクト名を日本語でコーディングするようにしています。そのほうがコードに目を通したときに、視覚的にでわかりやすいと思うからです。
主に変数、シートやコントロールのオブジェクト名、モジュール名を日本語もしくは日本語を含めて命名しています。VBAコードを見る際に、ご参考にしてください。
標準モジュール
標準モジュールにはFunctionプロシージャを1つだけ記述していて、グラフの系列値を求めるためのユーザー定義関数を作成しています。
求める系列値は継続時間(予定の長さ)であって、入力された予定が次の予定まで何時間かを計算する関数となっています。また1日の最後の予定の場合は、最初の予定までの時間を計算するように工夫しています。
この関数をもとに継続時間が計算され、グラフが変動することとなっています。
VBAコード
Function 継続時間(予定 As Range, 開始時間 As Range)
Application.Volatile '自動で再計算
'入力欄、時刻欄のセル番地指定
Dim 入力欄 As Range, 時刻欄 As Range
Set 入力欄 = Range("C4:C27")
Set 時刻欄 = Range("B4:B27")
'次の予定までの時間を計算
継続時間 = Hour(WorksheetFunction.MinIfs(時刻欄, 入力欄, "*", 時刻欄, ">" & 開始時間) - 開始時間)
'最後の予定の場合、最初の予定までの時間を計算
If 継続時間 = Hour(開始時間) Then 継続時間 = Hour(WorksheetFunction.MinIfs(時刻欄, 入力欄, "*") - 開始時間 + 24)
'予定がない場合
If 予定 = "" Then 継続時間 = 0
End Function
シートモジュール
シートモジュールには1つのSubプロシージャがあり、入力欄の変更のイベントによる処理を記述しています。
その処理とはグラフの回転で、円グラフの頂点がきちんと0時になるように、1日の最初の予定の時刻により回転して調整をしています。
ただそれだけだと入力欄になにもない場合にエラーがでてしまうので、それを回避するような記述も含んでいます。
VBAコード
Private Sub Worksheet_Change(ByVal Target As Range) 'いずれかのセル内容を変更時のイベント
If Intersect(Target, Range("C4:C27")) Is Nothing Then Exit Sub '入力欄以外の変更は処理終了
Dim セル位置 As Range: Set セル位置 = Selection '変更後のセル位置
'画面描画を停止、エラーの無視、シート保護の解除
Application.ScreenUpdating = False
On Error Resume Next
ActiveSheet.Unprotect
'入力欄の内容でグラフの回転
ActiveSheet.ChartObjects("グラフスケジュール").Select
ActiveChart.ChartGroups(2).FirstSliceAngle = 15 * Hour(Range("C3:C27").Find("*").Offset(0, -1))
'画面描画を開始、エラーの表示、シート保護
ActiveSheet.Protect
On Error GoTo 0
Application.ScreenUpdating = True
セル位置.Activate '変更後のセル位置をアクティブに
End Sub
まとめ
以上、円グラフで1日のスケジュールを作るエクセルの紹介でした。自動調整が今回のポイントですので予定の変更にも簡単に対応できます。何度でも作り直して完璧なタイムスケジュールを考案してください。
不具合、要望、改善点などありましたら、コメントもしくは問い合わせフォームからご指摘いただければ幸いです。
またリクエストも随時受け付けています。お気軽にご連絡ください。
コメント