【VBA自動調整】円グラフで1日のスケジュールを作る【ダウンロード可】

Uncategorized

ホールケーキをカットしたような、円を分割したタイムスケジュールをサクッと作成できるエクセルを作りました。
実はこの手のグラフの作り方を解説しているサイトはたくさんあるのですが、この記事ではそれに一工夫加えて、自動でグラフが調整されるようなエクセルに仕上げました。
もちろんグラフのデザインは自由に設定できます。お好みのおしゃれなスケジュールを作成してみてください。

ダウンロードはここから

使用方法

予定欄にスケジュールを入力するだけで、自動でグラフが変化します。
グラフの色や文字のフォントなど、自由に調整してお使いください。

入力欄のセル位置が変わらないように、マクロにより自動で保護がかかる仕様になっています。

グラフの設定

実はこのスケジュールは、2つの円グラフの組み合わせにより作成されています。

そして、それぞれの系列ごとに「系列値」「ラベルの内容」「軸の基線位置」を設定しています。3つ目の「軸の基線位置」とはグラフの回転のことで、マクロで自動的に角度の設定をしています。

系列系列値ラベルの内容
(セルの値)
軸の基線位置
系列1固定値(F4:F27)時刻表示(G4:G27)353°
系列2継続時間(E4:E27)予定(C4:C27)マクロで自動調整

そのほかにデザイン的な設定として、ラベルの位置、枠線、文字の色など細かい変更を加えています。

マクロについて

この記事ではステートメントやメソッドごとの細かい解説はしていません。ただ、記述しているVBAはごく一般的なものなので、簡単に調べることができると思います。
直接質問したい方は「問い合わせフォーム」からお気軽にお問い合わせください。

全体の流れ

マクロによるエクセル全体の流れは、

  1. (予定を入力)
  2. ユーザー定義関数により、予定の継続時間を計算
  3. (1のデータをもとにグラフが変化)
  4. 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日のスケジュールを作るエクセルの紹介でした。自動調整が今回のポイントですので予定の変更にも簡単に対応できます。何度でも作り直して完璧なタイムスケジュールを考案してください。

不具合、要望、改善点などありましたら、コメントもしくは問い合わせフォームからご指摘いただければ幸いです。
またリクエストも随時受け付けています。お気軽にご連絡ください。

コメント

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