【Excelマクロ】円グラフで1日のスケジュールを作る【自動調整】

Uncategorized

転用、商業利用等フリーです。ダウンロードしてご自由にお使いください。

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

ダウンロードはここから

使用方法

予定欄にスケジュールを入力すると、それに合わせて自動でグラフが変化します。
あとはグラフの色や文字のフォントなどをいじくって、見やすいデザインに魔改造してお使いください。

シートはマクロにより自動で保護がかかる仕様になっています。

グラフの設定

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

それぞれの系列ごとに「系列値」「ラベルの内容」「軸の基線位置」を設定しています。「軸の基線位置」とはグラフの回転のことで、金庫のダイヤルキーのようにどれだけ回して表示するかを角度で指定します。それをマクロで自動的に設定することで、スケジュールがきちんと0時から始まるようにしています。

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

マクロについて

全体の流れ

今回のマクロはコマンドボタン等で自ら操作するのではなく、シートへの入力をきっかけに自動で実行されるものとなっています。入力後は、

  1. (予定を入力)
  2. ユーザー定義関数で、それぞれの予定が何時間続くかを計算
  3. スケジュールが0時から始まるようにグラフを回転

といった流れでスケジュールを調整します。ポイントは3の回転で、自分でグラフを回転させて0時から始まるように調整する手間を省いています。

標準モジュール

標準モジュールにはFunctionプロシージャを1つだけ記述していて、予定が何時間続くかを計算するためのユーザー定義関数を作成しています。

ポイントは6行目の「次の予定のセルを取得するループ処理」です。23時の次に0時に戻るようにしているのと、予定を全部消したときの無限ループ対策をしています。もしシートを魔改造するならこの辺も一緒にいじくってください。

あとは単純に引き算です。ちなみに予定の継続時間はグラフの系列値となっているので、この関数で計算した時間をもとにスケジュールが変化することになります。

VBAコード

変数やオブジェクト名などの意義や目的をわかりやすくするために、日本語を多用してコーディングしています。

Function 継続時間(予定 As Range) '次の予定までの何時間かを計算する関数
    
    'グラフが自動で調整されるように、関数を入力しているセル以外の更新でも再計算
    Application.Volatile
    
    'ループ処理で次の予定のセルを取得
    Dim 次の予定 As Range
    Set 次の予定 = 予定.Offset(1, 0)
    Do While 次の予定.Value = ""
        Set 次の予定 = 次の予定.Offset(1, 0)
        If 次の予定.Row > 99 Then Set 次の予定 = Range("C4") '0時に戻る
        If 次の予定 = 予定 Then Exit Do '入力欄を消したときの無限ループ対策
    Loop
    
    '次の予定までの時間を計算
    継続時間 = Hour(次の予定.Offset(0, -1)) - Hour(予定.Offset(0, -1))
    If 継続時間 < 0 Then 継続時間 = 継続時間 + 24 '一日の最後の予定
    
    '予定がない場合は継続時間は0にする
    If 予定 = "" Then 継続時間 = 0
End Function

シートモジュール

シートモジュールにはWorksheet_Changeイベントだけを作成してあります。

イベント

Worksheet_Changeイベントで、予定を入力するとスケジュールが自動で回転するようにしています。これによりきちんと0時から始まるように調整しています。

ただそれだけだと、予定を全部消したときに13行目のFindメソッドでエラーがでてしまうので、エラーを無視する記述も含んでいます。

VBAコード

変数やオブジェクト名などの意義や目的をわかりやすくするために、日本語を多用してコーディングしています。

Private Sub Worksheet_Change(ByVal Target As Range) 'いずれかのセル内容を変更時のイベント

    '入力欄以外の変更はなにもしないで処理を抜ける
    If Intersect(Target, Range("C4:C27")) Is Nothing Then Exit Sub
    
    '画面描画を停止、エラーの無視、シート保護の解除
    Application.ScreenUpdating = False
    On Error Resume Next
    ActiveSheet.Unprotect
    
    '入力欄を変更したとき、スケジュールが0時から始まるようにグラフを回転
    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
    
    ActiveCell.Select
End Sub

まとめ

以上、円グラフで1日のスケジュールを作るエクセルの紹介でした。この類のグラフはよくあるのですが、今回はそれに回転による自動調整をマクロで組み込みました。それにより気軽に作り直しができるタイムスケジュールになったかなと思います。

配布しているエクセルの不具合、要望、改善点などありましたら、コメントもしくは問い合わせフォームからご指摘いただければ幸いです。
またこのサイトではリクエストも受け付けています。「あんなエクセルが欲しい」「こんな風に魔改造して」といったご要望があれば、リクエストフォームからお気軽にご連絡ください。

コメント

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