Waitメソッドでアニメーション
今回はセルに色塗りする機能を使って簡単なアニメーションを作ってみますよ。コードはとっても簡単ね~。
'(C)KOBATO http://atelierkobato.com/vba-wait/
Sub CellMovement1()
Dim i As Integer
For i = 1 To 9
'背景色をクリアします
Cells(i, 2).Interior.ColorIndex = 0
'背景色を赤にします
Cells(i + 1, 2).Interior.ColorIndex = 3
Application.Wait (Now + TimeValue("0:00:01"))
Next i
End Sub
実行すると赤いセルがブロックみたいに下に落ちて行きますよ~。
何をしているのかというと、
① セル A1 の背景色をクリアする
② セル A2 を赤く塗る
③ セル A2 の背景色をクリアする
④ セル A3 を赤く塗る
⑤ セル A3 の背景色をクリアする
てことを繰り返しているだけなのね~。でも普通に For...Next で実行させると目にも止まらぬ速さで処理してしまうので、何が起こったのかわらないうちに終わってしまいます。そんな高速アニメーションを目で追うなんて、一生懸命忍術の修業をしなくては無理です(意味不明)。でも忍術修業より VBA 修業のほうが簡単ですよ。たぶん。てことで、
という一文で処理を敢えて遅くしておきましょ~。Applicationオブジェクトに対して Waitメソッド を使用すると、指定時間まで 処理を一時停止 しておけるのです。Now関数で現在のシステム日付と時刻を得て、それに 1 秒を加えています。つまり「次の処理に移るまで 1 秒待ちなさい」という命令を与えているのです。
ところで、上のマクロを実行してみると「ちょっと動きが遅いな~」と思うかもしれません。アニメーションで 1 秒はかなり長く感じる間隔です。てことで、これを 0.5 秒間隔にしてみましょ~。
Sub CellMovement2()
Dim i As Integer
For i = 1 To 9
'背景色をクリアします
Cells(i, 2).Interior.ColorIndex = 0
'背景色を赤にします
Cells(i + 1, 2).Interior.ColorIndex = 3
Application.Wait [Now() + "0:00:00.5"]
Next i
End Sub
Waitメソッドの引数の中で加える時間を
のように指定してあります。これがコンマ 5 秒を表す書き方です。最小でミリ秒まで指定できますよ。これを応用すると「テトリス」みたいなゲームが作れるかもしれません ...... たぶん ...... 作ったことないからわからないけど。
ぐるぐる動き回ります
今度はブロックがあちこち動き回るプログラムを作ってみましょ~。
マクロはこんなふうに書くのね~。
'(C)KOBATO http://atelierkobato.com/vba-wait/
Sub CellAnimation()
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
Application.Wait [Now() + "0:00:00.5"]
Next ct
End Sub
Rnd関数で乱数を発生させて、色を塗るセルをランダムに移動させているのです。このマクロを実行すると、ブロックがぐるぐるぐると動き回りますよ~。面白いのでぜひ試してみてね~。それではまた次回お会いしましょ~。 ≫ VBA の技術