どうもこんにちはえんちゃです。
前回こっそりエクセルでアニメーションが作れると本当にこっそり書いたので
今回は、エクセルでアニメーションする方法を書いていきます。
各プログラムは、以下の内容です。
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の幅が幅が広がりますね。
コメント