[VBA]アニメーションを作る

VBA

どうもこんにちはえんちゃです。
前回こっそりエクセルでアニメーションが作れると本当にこっそり書いたので

今回は、エクセルでアニメーションする方法を書いていきます。

[VBA]3D書式 エクセルとパワーポイントの違い

各プログラムは、以下の内容です。

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の幅が幅が広がりますね。

コメント

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