【Excelアニメーション】雪が降る 技術解説
- yuji fukami
- 12月5日
- 読了時間: 4分
前書き
師走。寒くなってきました。
そろそろ冬の贈り物が降りてくるころです。
概要(「雪が降る」のデモンストレーション)
下記動画のようなExcelを利用したアニメーションを作成したので、今回はこちらの技術的な解説を行います。
雪の結晶が回転したり揺れたりしながら、等間隔で舞い降りてくるようなアニメーションです。
技術解説
今回のExcelアニメーションの技術要素は次の通りです。1つずつ掻い摘んで解説していきます。
雪の結晶のランダム作成
シェイプが動くアニメーション
雪の落下の動き計算
複数のシェイプ(雪の結晶)を同時に動かすアニメーション
同時に音を鳴らす
停止ボタン
雪の結晶のランダム作成
こちらは動画で説明を作りました。
動画に沿って説明すると次の通りです
①:セル範囲に「=IF(RAND()<0.3,1,"")」のような数式を利用して、特定の確率で「1 or 空白」が表示されるような数式を設定する。紹介している数式は「30%の確率で1になる」という感じ。
②:条件付き書式でセルの値が1の場合に「黒塗潰し」となるようにする。
③:セル範囲をリンク付き画像としてコピー。これを雪の結晶の最小単位となる。
④:雪の結晶の最小単位を上下にコピー反転して、2つを結合する。
⑤:結合した図形を60度ずつ5つ複製する。
④,⑤の部分はVBAで処理していますが、実際のコードは下記の通りです。詳しく見たい人は参照してもよいですが、めんどくさい人は飛ばして良いです。
シェイプが動くアニメーション
アニメーションの基本操作は
「図形の移動や変形を実行」→「シート上で変形を反映」→「図形の移動や変形を実行」...
を繰り返すことです。
実際の「雪が降る」の操作は下記画像の様になっていますが、この繰り返しをDo-Loopで延々と繰り返しています。
「図形の移動や変形を実行」は今回クラスモジュールで定義したメソッドを利用しています。(詳細は説明が大変になるので割愛)
「シート上で変形を反映」は「DoEvents」を実行します。環境にもよりますが処理を安定させるために3回実行しています。もしこのDoEventsを実行しないと、VBA処理が連続で動いてExcelがフリーズしてしまいアニメーションは出来ません。

雪の落下の動き計算
雪の落下の動きは上下方向の移動、左右方向の移動、回転、X軸まわり回転の4つを変更しています。
それぞれ初期パラメータをランダムに設定した後で、時間の経過とともに値が変化するようにしています。
・上下方向:等速で速度を設定
・左右方向:cos関数を利用して左右に揺れるように設定
・回転:一定の速度で回転するように設定。.Rotationプロパティを変更
・X軸回り回転:一定の速度で回転だが、ThreeD.RotationXプロパティを変更

これらのランダム設定をいろいろ調整することで雪が舞い降りるような感じに表現を近づけています。
複数のシェイプ(雪の結晶)を同時に動かすアニメーション
雪の結晶のシェイプはアニメーションの開始の前に20個だけ先に描画します。これは1つの雪の結晶の描画に時間がかかるので、アニメーションの途中で行わないことでアニメーションをスムーズにすることができます。
描画された雪の結晶シェイプの専用に定義したクラスモジュール(clsSnow)に紐づけます。
クラスモジュール1つ1つで別々にアニメーションを行うことで、複数のシェイプを同時にアニメーションが可能となります。

同時に音を鳴らす
1つの雪の結晶が落ちてくるタイミングで音が再生されていますが、こちらはWindowsのシステムサウンドを再生しています。

Windowsのシステムサウンドは「PlaySystemSound」という汎用プロシージャで簡単に呼び出せるように準備しています。システムサウンドはその音声ファイルのフルパスを毎回指定して実行する必要がありますが、「PlaySystemSound」ではシステムサウンド1つ1つにEnumで名前を与えており、引数で簡単に選択して好きな音を再生することができるようにしています。
今回の処理ではこの引数のEnumを整数乱数として処理してランダムに音を再生しています。
「PlaySystemSound」の詳細は下記コードを参照してみてください。
停止ボタン
「雪が降る」ボタンの右側には「停止」ボタンがあります。
アニメーションを途中で停止させるテクニックですが、こちらは次のような方法で可能となります。
①:Private変数でPriJudgeStopという変数名でトリガーを用意する。(変数名は自由でOK)
②:アニメーションのDo-Loop内でトリガーのPriJudgeStopがTrueになったらExitDoで抜ける処理を入れておく。またアニメーション(Do-Loop)の開始前にトリガーのPriJudgeStopは必ず False(トリガーOFF)にしておく。
③:「S_停止」プロシージャでPriJudgeStop = Trueの処理を行うようにする
このテクニックがないとEscキーやVBE画面で停止を行わないと、永遠にアニメーションが動いてしまうので、Excelでアニメーションを構築する上では欠かせないテクニックです。





コメント