VBA

ExcelVBAでアニメーションマクロを作ってみた

VBAanimeサムネイル
ねぇもりさん、いつも仕事のマクロばかり作ってるから飽きたよ
もりさん
もりさん
そうだね。たまにはVBAであそんでみよっか!

Excelマクロ(VBA)といえば「オフィスワークの手作業を自動化するもの」というイメージが強いですね。

『作業を効率化できるのはうれしい!』

『残業が減って早く帰れるのもうれしい!』

でも、なんかそれだけじゃもの足りない・・・

VBAで遊んでみましょう!

アニメーションマクロその1

まずはこちらをご覧ください

 

え~むずかしそう

このアニメーションマクロは、仕事でもよく使うおなじみのステートメント・メソッド・関数で作っています。

  • Do~Loopステートメント
  • Select Caseステートメント
  • Copyメソッド
  • Sleep関数

※Sleep関数とは
指定の時間(ミリ秒)処理を中断する関数です。

モジュールの宣言セクションにお決まりのフレーズを記述することで使用できます。
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

処理を1秒中断させたいときはSleep 1000と書きます。

もりさん
もりさん
ぜひ最後まで読んでいってね~

アニメーションマクロの作り方

Excelの事前設定

①Excelシートの行と列を同じ幅に設定して、方眼紙のようにします。
(この記事の場合は行列それぞれ20ポイントに設定しています。)

anime2-1

②オプションでR1C1形式に設定。
「ファイル」タブをクリック→「オプション」をクリック
「数式」→「R1C1参照形式を使用する」にチェックを入れる

シートの列番号が数値で表示されるので、列番号が確認しやすくなります。

anime2-2

Excelシート上に画像を準備

シート名を「オリジナル画像」という名前に変更。

動きをつけるため、2パターンの絵を用意します。

パターン1→パターン2→パターン1→・・・と、2つの画像を交互に表示することで動きをつけるパラパラ漫画のような仕組みです。

※画像の赤枠線は、Rangeオブジェクトに格納する範囲です

マクロ実行用シートの準備

「オリジナル画像」シートとは別にマクロ実行用のシートを用意して下記2点の準備をします。

  • 方眼紙形式(行列の幅をオリジナル画像シートと同じ設定にする)
  • セルをすべて黒色で塗りつぶし

ソースコード

標準モジュールに貼り付けて使用してください。

ポイント

画像範囲をRangeオブジェクトにセットする処理(Set Pattern1 = ~~)で、画像範囲よりも一回り(一行・一列)バッファを持たせて格納するのがポイントです。

下記の水色枠のように、画像サイズピッタリでRangeオブジェクトにセットすると、

マクロを動かしたときに、自らの残像が残ってしまうのです・・・

一回り余分に持たせることで、上下左右どの方向に移動しても、自らの残像を上書きしながらキレイに描画できるんですよ。

VBAっておもしろいですね!

もりさん
もりさん
まだまだ遊んじゃうよ~

アニメーションマクロその2

 

えーさっきよりすごくなってる~

画像の準備

これも、2パターンの絵を作成します。(これが一番大変!)

anime2-3

※画像の赤枠線は、Rangeオブジェクトに格納する範囲です

アニメ2のソースコード

アニメの解説

こんな風に動いています。

anime2-4

画面更新・停止処理

1つの画像Rangeを合計10個、1RangeずつFor~Next文でコピー貼り付けしています。

そのため、画面更新したままでは各オブジェクトのコピー貼り付けに若干のタイムラグが発生してアニメーションが美しくないのです。

そこで、画面更新をいったん止めてから、
Application.ScreenUpdating = False

画像Range×10をコピー貼り付けして、

画面更新を再開する(アニメーション再開)
Application.ScreenUpdating = True

という流れにしています。

画像のコピー貼り付け

コピー貼り付け処理のコードがこちらです。

貼り付け先の列番号を示すc + interval * nがちょっと難しいですね。

このような仕組みで全10個の画像Rangeを配置しています。

anime2-5

(参考)

anime2-6
へぇ~VBAっておもしろいんだね
もりさん
もりさん
そうだよ~こんなふうに遊びながら勉強できるといいね!