エクセルのグラフをアニメーション的に描画する

表計算ソフトExcelのグラフをVBAで動的に描画してアニメーション的に動かしてみました。

グラフを動的に描画する方法は、次の二つが考えられます。
(1)グラフを1プロットずつ増やして再描画する事を繰り返す。
(2)グラフのデータを変数に格納して1データずつ追加していく。

グラフを1プロットずつ増やして再描画する方法

この例では、グラフシート”Graph1″とデータのシート”Sheet1″を用意しています。

“Graph1″シート
excel_graph_a_1

“Data1″シート
excel_graph_a_2

グラフシート上に配置された”Start”ボタンをクリックするとグラフの描画が開始されます。
excel_graph_a_3

グラフを再描画するVBAマクロ”Plot_Chart()”は下記のコードになります。実際にグラフを動的に描写している箇所は、For 〜 Nextの間の処理になります。

Sub Plot_Chart()
Dim mySh As Chart
Set mySh = Charts("Graph1")
Dim i As Long
Const dataCount As Long = 302

With mySh

    ActiveChart.SeriesCollection(1).Select
    Selection.MarkerStyle = -4142
    ActiveChart.SeriesCollection(2).Select
    Selection.MarkerStyle = -4142
    ActiveChart.ChartArea.Select
    ActiveChart.Axes(xlCategory).MaximumScale = 400
    ActiveChart.Axes(xlValue).MaximumScale = 7
    ActiveChart.Axes(xlValue).MajorUnit = 0.5
    ActiveChart.Axes(xlValue).MinorUnit = 0.1
    ActiveChart.Axes(xlValue).MinimumScale = 0

    For i = 2 To dataCount

        Application.Wait [Now() + "00:00:00.01"]
        ActiveChart.SetSourceData Source:=Worksheets("Data1").Range(Worksheets("Data1").Cells(2, 1), Worksheets("Data1").Cells(i, 3)), PlotBy:=xlColumns
        ActiveChart.SeriesCollection(1).Name = "=""A"""
        ActiveChart.SeriesCollection(2).Name = "=""B"""
        DoEvents

    Next i

End With

Set mySh = Nothing

End Sub

データを変数に格納して追加していく方法

もう一つの「データを変数に格納して追加していく方法」は、”Sheet1″シート1つで構成しています。
excel_graph_b_1

“グラフ描画”ボタンをクリックすると、動的な描画が始まります。
excel_graph_b_2

下記がVBAマクロの”plot_data()”のコードです。
まずB41からD60のセルを変数に格納します。
次に一定間隔の時間で、B41からD60のセルに値を戻します。
これてグラフを動的に描いている様に見える仕組みです。

plot_data()

Dim myDataRange1 As Range
Dim countRange1 As Range
Dim myArea1 As Variant
Dim myCount1 As Long
Dim i As Long
Const dataCount1 As Long = 60

Set myDataRange1 = Range(Sheets("Sheet1").Cells(41, 2), Sheets("Sheet1").Cells(dataCount1, 4))
myCount1 = myDataRange1.Count

ReDim myArea1(1 To 1, 1 To myCount1)

For Each countRange1 In myDataRange1
    i = i + 1
    myArea1(1, i) = countRange1.Value
Next countRange1

myDataRange1.ClearContents

For Each countRange1 In myDataRange1
    k = k + 1
    Application.Wait [Now() + "00:00:00.01"]
    countRange1.Value = myArea1(1, k)
Next countRange1

Set myDataRange1 = Nothing

End Sub

この方式は、グラフ描画中に中断したりするとセルの値が失われてしまう可能性があるので、オリジナルのデータを別のセルに記述しておき、ロードできるマクロ”data_load”も念のため用意しておきます。

Sub data_load()

    Range("F41:H60").Select
    Selection.Copy
    Range("B41").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    Range("A1").Select

End Sub

まとめ

以上、エクセルのグラフをアニメーション的に動かす方法を紹介しました。途中で処理を中断したい場合は、ESCキーを押して表示されたメニューで終了を選択します。またグラフを描くスピードは、Application.Waitの時間間隔で設定していますが、パソコンの性能に依存し、正確ではありませんので、使用環境にあわせて調整しましょう。

→その他の技術情報

Sponsored Link