どうもこんにちはえんちゃです。
前回こっそりエクセルでアニメーションが作れると本当にこっそり書いたので
今回は、エクセルでアニメーションする方法を書いていきます。
各プログラムは、以下の内容です。
Declare Sub Sleep Lib "kernel32"(byVal dwmilliseconds as long)
Sub 処理名()
For i = 1 to 100
~処理を書く~
Sleep 100
DoEvents
ActiveSheet.Calculate
Next i
End Sub
プログラムは基本的に結果だけを表示します。なのでアニメーションの最後の図を出力して終わりです。
ですがこの機能を使えばプログラムを一時停止して、再描画することが可能になります。
最初の一行
declare sub Sleep lib kernel32 (byval dwmilliseconds as long)
の意味を調べていきましょう
・C:\Windows\System32\kernel32
を指します。kernel32にはWindowsの基本的なプログラムが登録されてると思ってください
・Sleepは以下のところに内容が書いています。
Microsoft: Sleep function
要約すると、実行を〇ミリ秒止めるメソッドです。
上のプログラムだと100ミリ秒つまり0.1秒止めます
次にDoEventsですがこれはVBAの関数になります。
基本的にプログラムは実行が終了するまで表示されません。
なので、プログラムをわざわざSleepで止めても、フリーズしたように見えます。
DoEventは一度処理をオペレーティングシステムに制御を移し、イベントの処理を行います。
これで処理が表示されるようになりました。
最後にActiveSheet.Calculateです。これは同様にVBAの関数でシートの再計算を行います。
これは、アニメーションの場合によりますが、シートの計算式などを再計算して再描画します。
セルに文字を入力するだけで構成されたアニメーションの場合、必要ないと思います。
しかし図形の場合は、これがないと正常に表示がされない場合があるので、場合によって追加しましょう。
これでループ文中にアニメーションさせたい処理を書いて完成です。
ストップウォッチや、タイマー、アニメーション、ゲームなど
全てのVBAゲームプログラミングの基盤になりますので是非覚えておきましょう
最後に例として図形をアニメーションさせてみます。

まず、図形に名前をつけてあげます。今回は矢印と名づけています。
Declare Sub Sleep Lib "kernel32" (ByVal dwmilliseconds As Long)
Sub 処理名()
Dim arrow As Shape
Set arrow = ActiveSheet.Shapes("矢印")
For i = 1 To 100
arrow.ThreeD.IncrementRotationY 5
Sleep 16
DoEvents
ActiveSheet.Calculate
Next i
End Sub矢印という名前の図形を取得してY方向に5度回転させるプログラムです。
ゲームなどの描画は1秒に60回画面を更新するのが主流なのでそれに合わせて、1秒(1000ms)/60 = 16ms にしました。

矢印が回りました。
Excelの幅が幅が広がりますね。


コメント