Excelのグラフをアニメーションで動かそう

Excelのグラフをアニメーションで動かす プログラミング

Excelのグラフ機能を使ってアニメーション表示する方法を紹介します。

散布図、棒グラフ、円グラフなどを使って、動きのあるアニメーション表示をします。
入力したデータをリアルタイムに表示したり、記録されたデータを再生したりすることが可能です。

VBAを使ってWindows APIのタイマー(user32.dllのSetTimer)を実装します。
プログラムのコピペで対応可能(プログラムコードも多くありません)なので、是非チャレンジしてみてください。

概要

タイマーを使ってグラフの元となるデータを変更してアニメーション表示します。グラフの元データを変更すると、Excelが自動的にグラフを更新してくれます。

グラフをアニメーション表示する方法として、以下の3種類の方法を紹介します。

  1. グラフの元となるデータを変更する方法
  2. グラフの元となるデータのセル指定を変更する方法(すでに記録したデータを再生)
  3. データを記録しながらセル指定を変更する方法(記録と同時にアニメーション表示)

1.グラフの元となるデータを変更する方法

グラフの元となるデータをタイマーの間隔ごとに変更する方法です。棒グラフと円グラフは簡単にアニメーション表示ができます。散布図は少し工夫が必要な場合があります。

グラフの元となるデータを変更する方法

2.グラフの元となるデータのセルを変更する方法(記録したデータを再生)

すでに記録したデータをアニメーションで再生するような場合です。タイマーの間隔ごとにグラフ表示するセルの指定を移動します。

グラフの元となるデータのセルを変更する方法(記録したデータを再生)

3.データを記録しながらセル指定を移動する方法(記録と同時にアニメーション表示)

タイマーの間隔ごとに新たなセルにデータを記録しながら、グラフ表示は記録した新たなセルを指定します。

データを記録しながらセル指定を移動する方法(記録と同時にアニメーション表示)

VBAプログラム

全体イメージ

VBAのプログラムは、Sheet1にタイマーの開始・停止ボタンの実装とグラフ更新プログラムを記述して、Module1にタイマーの実装をします。

タイマーは、Windows APIのSetTimerKillTimerを使用します。時間間隔設定は、1msec単位で指定することが可能です(ただし、指定は可能ですがどこまで正確か分かりません)。

下図の様にModule1は、SetTimerKillTimer、タイマーのコールバック関数(タイマー実行)で構成されます。単純なので、いろいろな場面で再利用することが可能です。

VBA全体イメージ

Module1 プログラム

Module1のプログラムコードです。
SetTimerKillTimerの宣言とタイマーのコールバックを実装しています。

Option Explicit

'宣言
Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As Long, _
                                                ByVal nIDEvent As Long, _
                                                ByVal uElapse As Long, _
                                                ByVal lpTimerFunc As LongPtr) As Long
                                                
Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As Long, _
                                                ByVal nIDEvent As Long) As Long

'タイマー識別ID
Public TimerID As Long

'タイマースタート
Public Sub StartTimer()
    TimerID = SetTimer(0&, 1&, 1&, AddressOf TimerProc)
End Sub
 
'タイマーストップ
Public Sub StopTimer()
    Call KillTimer(0&, TimerID)
End Sub

'タイマー実行
Private Sub TimerProc()
    Call Sheet1.wrkTimer
End Sub

プログラムの説明

Declare PtrSafe Function SetTimer Lib “user32″() As Long
Declare PtrSafe Function KillTimer Lib “user32″() As Long
動的リンクライブラリ(DLL) 内のSetTimerと、KillTimerの参照を宣言します。

Public TimerID As Long
タイマーを識別するIDの変数を宣言します。

Public Sub StartTimer()
  hTimer = SetTimer(0&1&1&, AddressOf TimerProc)
End Sub
タイマーをスタートします。Public宣言でSheet1からコール出来るようにします。

第一引数 : タイマーに関連付けるウィンドウのハンドル
第二引数 : タイマーID(任意の値、0以外)
第三引数 : タイマーの間隔(ミリ秒単位、1/1000秒)
第四引数 : タイマーのコールバック関数のポインタを指定

戻り値 : 関数が成功し、hWnd(第一引数)がNULLの場合、タイマーを識別する整数を返します。

Public Sub StopTimer()
  Call KillTimer(0&hTimer)
End Sub
タイマーをストップします。Public宣言でSheet1からコール出来るようにします。

第一引数 : ウィンドウのハンドル。
作成したSetTimerに渡されるhWnd値と同じ。

第二引数 : タイマーを識別する整数
スタートしたSetTimerの戻り値。

Private Sub TimerProc()
  Call Sheet1.wrkTimer

End Sub
タイマーのコールバック関数です。
TimerProc()は、SetTimerの第四引数でポインタ指定する名前です。

Sheet1 プログラム

Sheet1のプログラムコードです。アニメーション表示の開始ボタンと終了ボタンを追加します。また、タイマーで実行する関数を用意します。

'タイマースタート
Private Sub CommandButton1_Click()
    Call StartTimer
End Sub

'タイマーストップ
Private Sub CommandButton2_Click()
    Call StopTimer
End Sub

'タイマー処理
Public Sub wrkTimer()
    With ActiveSheet.ChartObjects(1)
        ’グラフ内容を更新するコードを追加する
    End With
End Sub

プログラムの説明

Private Sub CommandButton1_Click()
  Call StartTimer
End Sub
タイマーをスタートします。Module1のStartTimer()をコールします。

Private Sub CommandButton2_Click()
  Call StopTimer
End Sub
タイマーをストップします。Module1のStopTimer()をコールします。

Public Sub wrkTimer()
  With ActiveSheet.ChartObjects(1)
    ’グラフ更新のコードを追加します
  End With
End Sub

タイマー間隔ごとに実行する処理を追加します。主にグラフの元となるデータの更新を行います。Module1のTimerProc()からコールされます。

VBAプログラムのまとめ

ここまで説明したModule1とSheet1のプログラムが、グラフのアニメーション表示の基礎となる部分です。次項にこれらを使って実際にアニメーション表示する具体的な方法を紹介します。

アニメーション表示

散布図を例に波形モニタのアニメーション表示を解説します。
時間軸を短くして流れるように波形を表示したり、長くしてゆっくり波形を動かしたりできます。

元となるデータを更新する方法

データすべてを更新する方法と、データの一部を更新する方法の2種類を例に挙げます。

1.データのすべてを変更する方法

タイマーの間隔ごとにデータをすべて更新します。

データのすべてを変更する方法

2.データの一部を変更する方法

古いデータを一部削除して新しいデータを追加します。下図の様にデータを削除したらシフトして、空いた部分に新しいデータを追加します。

データの一部を変更する方法

データのセルを移動する方法(データの再生)

タイマーの間隔ごとに元となるデータのセル指定を移動します。

データのセルを移動する方法(データの再生)

データを記録しながらセルを移動する方法

タイマーの間隔ごとに新たなセルにデータを記録しながら、この新たなセルをグラフ表示の範囲に指定します。

データを記録しながらセルを移動する方法

サンプルプログラム

事前の準備として、Sheet1の”A”列に0~360を入力し、”B”列にSIN(”A”列)の計算結果を出力します。散布図も挿入します。また、CommandButton1(開始ボタン)とCommandButton2(停止ボタン)も準備します。

プログラムの動きは、開始ボタンを押すと正弦波の波形が右から左にアニメーション表示します。停止ボタンを押すか、X軸の値が360度になるとアニメーションが止まります。

Sheet1のサンプルプログラムです。

’グラフのX軸カウント用
Dim lngAng As Long

'タイマースタート
Private Sub CommandButton1_Click()    
    lngAng = 0
    Call start_timer    
End Sub

'タイマーストップ
Private Sub CommandButton2_Click()
    Call stop_timer
End Sub

'タイマー処理
Public Sub wrkTimer()

    ’X軸の最小値と最大値を設定
    With ActiveSheet.ChartObjects(1).Chart.Axes(xlCategory)
        .MinimumScale = lngAng
        .MaximumScale = lngAng + 120
    End With

    ’グラフ表示の元データのセルを1つづつ移動する
    lngAng = lngAng + 1
    If lngAng >= 360 Then
        Call stop_timer
    End If

End Sub

プログラムの説明

'タイマー処理
Public Sub wrkTimer()

Public Sub wrkTimer()
指定したタイマーの間隔で、Module1のTimerProc()からwrkTimer()がコールされます。

’X軸の最小値と最大値を設定
With ActiveSheet.ChartObjects(1).Chart.Axes(xlCategory)
    .MinimumScale = lngAng
    .MaximumScale = lngAng + 120
End With

.MinimumScale = lngAng
グラフの開始セルの指定です。

.MaximumScale = lngAng + 120
グラフの終了セルの指定です。グラフのX軸は120度分のデータを表示します。

’グラフ表示の元データのセルを1つづつ移動する
lngAng = lngAng + 1
If lngAng >= 360 Then
    Call stop_timer
End If

lngAng = lngAng + 1
タイマーの間隔ごとに1度づつX軸をインクリメントします。
(この加算する値を大きくすれば、波形表示が速くなります。)

If lngAng >= 360 Then
  Call stop_Timer
End If
360度になったら、タイマーを停止します。

実際にサンプルプログラムを実行した動画です。

(47秒)

その他のグラフのアニメーション表示

棒グラフによるイコライザ表示や、円グラフによるスピードメータ表示なども、概要で説明した3種類の方法でアニメーション表示できると思います。

(56秒)

(53秒)

センサーから読み込んだデータをアニメーションでグラフ表示している動画です。

(1分46秒)

(3分29秒)

まとめ

Excelのグラフ機能を使ってアニメーション表示する方法を紹介しました。如何でしたでしょうか。SetTimerを使うことで簡単にアニメーション表示することが出来ると思います。

ここで紹介した方法は、一例にすぎません。他にもアニメーション表示をする方法は色々あると思いますので、それを考えるのも面白いと思います。

それでは、楽しんでいきましょう。

いろいろなセンサーの使い方を紹介しています。

コメント