[VBA] Waitメソッドでアニメーション

Waitメソッドでアニメーション

 今回はセルに色塗りする機能を使って簡単なアニメーションを作ってみます。コードはとっても簡単です。

'[VBA] Waitメソッドでブロック落とし

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 を実行すると赤いセルがブロックみたいに下に落ちて行きます。

 WaitメソッドでVBAブロックアニメーション

 何をしているのかというと、

 ① セル 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 秒を表す書き方です。最小でミリ秒まで指定できます。これを応用すると「テトリス」みたいなゲームが作れるかもしれません ... たぶん .... 作ったことないからわからないけど。
 

Waitメソッドで動き回らせます

 Waitメソッド を使って、ブロックがあちこち動き回るプログラムを作ってみましょう。

'[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() を実行すると、ブロック(セル)がぐるぐる動き回ります。面白いのでぜひ試してみてね。それではまた次回お会いしましょう。

コメントをどうぞ

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)