『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

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

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

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

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

コメント