【VBA】Waitメソッドの機能を使ってアニメーションを作ります
この記事では、VBA のセルに色塗りする機能と Waitメソッド を使って簡単なアニメーションを作ってみます。コードはとっても簡単です。
'[VBA] Waitメソッドでブロック落とし(1) Sub Drop_Cell_1() Dim i As Integer For i = 1 To 9 '背景色をクリア Cells(i, 2).Interior.ColorIndex = 0 '背景色を赤に塗る Cells(i + 1, 2).Interior.ColorIndex = 3 '次の処理まで1秒待つ Application.Wait (Now + TimeValue("0:00:01")) Next i End Sub
Drop_Cell_1 を実行すると赤いセルがブロックみたいに下に落ちて行きます。
Drop_Cell_1 が何をしているのかというと、
① セル A1 の背景色をクリアする
② セル A2 を赤く塗る
③ セル A2 の背景色をクリアする
④ セル A3 を赤く塗る
⑤ セル A3 の背景色をクリアする
てことを繰り返しているだけなのです。でも普通に For…Next で実行させると目にも止まらぬ速さで処理してしまうので、何が起こったのかわらないうちに終わってしまいます。そんな高速アニメーションを目で追うなんて、一生懸命忍術の修業をしなくては無理です(意味不明)。でも忍術修業より VBA 修業のほうが簡単ですよ。たぶん。てことで、
Application.Wait [Now() + "0:00:01"]
という一文で処理を敢えて遅くしておきましょう。Applicationオブジェクトに対して Waitメソッドを使用すると、指定時間まで処理を一時停止 しておけるのです。Now関数で現在のシステム日付と時刻を得て、それに 1 秒を加えています。つまり「次の処理に移るまで 1 秒待ちなさい」という命令を与えているのです。
ところで、Drop_Cell_1() を実行してみると「ちょっと動きが遅いな」と感じるかもしれません。アニメーションで 1 秒はかなり長く感じる間隔です。てことで、待ち時間を 0.5 秒間隔にしてみましょう。
'[VBA] Waitメソッドでブロック落とし(2) Sub Drop_Cell_2() Dim i As Integer For i = 1 To 9 '背景色をクリア Cells(i, 2).Interior.ColorIndex = 0 '背景色を赤に塗る Cells(i + 1, 2).Interior.ColorIndex = 3 '次の処理まで0.5秒待つ Application.Wait [Now() + "0:00:00.5"] Next i End Sub
Waitメソッド の引数の中で加える時間を
"0:00:00.5"
のように指定してあります。これがコンマ 5 秒を表す書き方です。最小でミリ秒まで指定できます。これを応用すると「テトリス」みたいなゲームが作れるかもしれません … たぶん …. 作ったことないからわからないけど。
次はブロックがあちこち動き回るプログラムを作ってみましょう。
'[VBA] ブロックをぐるぐる動かすマクロ Sub Cell_Animation() Dim i As Integer Dim j As Integer Dim ct As Integer Dim rd As Integer Randomize i = 10 j = 10 For ct = 1 To 30 '1から4の乱数を作る rd = Int(RND * 4 + 1) Cells(i, j).Interior.ColorIndex = 0 Select Case rd Case 1 i = i + 1 Case 2 i = i - 1 Case 3 j = j + 1 Case Else j = j - 1 End Select '端に来たら戻す If i <= 0 Then i = i + 1 End If If j <= 0 Then j = j + 1 End If Cells(i, j).Interior.ColorIndex = 3 '次の処理まで0.5秒待つ Application.Wait [Now() + "0:00:00.5"] Next ct End Sub
Rnd関数で乱数を発生させて、色を塗るセルをランダムに移動させているのです。Cell_Animation() を実行すると、ブロック(セル)がぐるぐる動き回ります。面白いのでぜひ試してみてね。それではまた次回お会いしましょう。
コメント
[K] ChatGPTにアニメーション・マクロを作ってもらいました。
[Q] ワークシート上に1秒間に1回転する三角形を描くマクロを作ってください。
[ChatGPT] 以下は、ワークシート上に1秒間に1回転する三角形を描くVBAマクロの例です。三角形は、セルB2を中心として回転します。
指定した座標を中心として指定した角度だけ回転させるサブルーチン
[K] 実行してみると、処理が重すぎてフリーズしました … アニメーションのような複雑なコードを書いてもらう時は、もう少し細かい指示が必要かもしれません。