マクロ(Excel VBA)を使えば、簡単なアニメーションを作ることができます。
アニメーションを作っていると楽しいだけでなく、プログラミングのスキルアップに繋がります。
今日は、VBA で Rnd 関数を使って「Excel シート上のセルの色を変更してキラキラさせる」プログラミングコードを紹介したいと思います。
まず、アニメーションの動画を見て頂きたいと思います。2回同じアニメーションを実行しています。
(画面録画ソフトを使うと 録画しながら VBA を実行することとなり、処理速度が遅くなってしまうのでスマホで撮影しました。)
1回のアニメーションの中で
➀セルを塗りつぶしてキラキラさせる
②途中から塗りつぶしを無くす
という2つの動作を行っています。
1、セルの色を変えてキラキラさせるプログラミングコード
さて、まずは上記アニメーションの全てのコードを示したいと思います。
VBE で使ったモジュールの数は1つです。
1つのモジュールの中身は、一番上から以下のように4つのパートに別れています。
●API 宣言
●「Kirakira」プロシージャ
●「Kirakira1」プロシージャ
●「Kirakira2」プロシージャ
API 宣言
1 |
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) |
「Kirakira」プロシージャ
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub Kirakira() 'セルF6~U21の色を消す' Range("F6:U21").Interior.ColorIndex = xlNone Call Kirakira1 Call Kirakira2 'セルF6~U21の色を消す' Range("F6:U21").Interior.ColorIndex = xlNone End Sub |
「Kirakira1」プロシージャ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
Private Sub Kirakira1() Dim x1 Dim y1 Dim x2 Dim y2 Dim Color_Code For i = 1 To 600 '色を付けるセル1の指定' x1 = 15 * Rnd + 6 y1 = 15 * Rnd + 6 x1 = Round(x1, 0) y1 = Round(y1, 0) '色を付けるセル2の指定' x2 = 15 * Rnd + 6 y2 = 15 * Rnd + 6 x2 = Round(x2, 0) y2 = Round(y2, 0) '色(ColorIndex)番号' Color_Code = 56 * Rnd Color_Code = Round(Color_Code, 0) 'セル1、セル2の色付け' Cells(x1, y1).Interior.ColorIndex = Color_Code Cells(x2, y2).Interior.ColorIndex = Color_Code '休む時間' Sleep 1 Next i x1 = 0: y1 = 0: x2 = 0: y2 = 0 End Sub |
「Kirakira2」プロシージャ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Private Sub Kirakira2() Dim x1 Dim y1 Dim x2 Dim y2 Dim Color_Code For j = 1 To 600 '色を付けるセル1の指定' x1 = 15 * Rnd + 6 y1 = 15 * Rnd + 6 x1 = Round(x1, 0) y1 = Round(y1, 0) '色を付けるセル2の指定' x2 = 15 * Rnd + 6 y2 = 15 * Rnd + 6 x2 = Round(x2, 0) y2 = Round(y2, 0) 'セル1、セル2の色付け' Cells(x1, y1).Interior.ColorIndex = xlNone Cells(x2, y2).Interior.ColorIndex = xlNone '休む時間' Sleep 1 Next j End Sub |
2、プログラミングコードの説明
まず、大きな流れを示したいと思います。
モジュールの一番上の API 宣言 についての説明は割愛させて頂きます。
sleep 関数を使うために必要な宣言だと思っていただければ良いです。
Excel シート上に黄色の四角形をスタートボタンとして設定してあります。
スタートボタンには、マクロ「Kirakira」を埋め込んであります。
したがってスタートボタンを押すことで、「Kirakira」プロシージャが実行することになります。
そして、「Kirakira」プロシージャの中で「Kirakira1」プロシージャと「Kirakira2」プロシージャを順番に呼び出しています。
「Kirakira」プロシージャの説明
プロシージャ「Kirakira」のコードを再度示します↓
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub Kirakira() 'セルF6~U21の色を消す' Range("F6:U21").Interior.ColorIndex = xlNone Call Kirakira1 Call Kirakira2 'セルF6~U21の色を消す' Range("F6:U21").Interior.ColorIndex = xlNone End Sub |
最初と最後に記述した以下のコードを入れることによって、セル「F6~U21」(色付けをするセルの範囲)の塗りつぶしを無しにしています。
1 |
Range("F6:U21").Interior.ColorIndex = xlNone |
カラーインデックス番号を xlNone とすることで、塗りつぶしを無しにすることができるのです。
また
Call プロシージャ名
と記述することで、プロシージャを呼び出して実行することができます。
以下の記述によって、「Kirakira1」プロシージャと「Kirakira2」プロシージャを順番に呼び出して実行することになります。
Call Kirakira1
Call Kirakira2
プロシージャ 「Kirakira1」
プロシージャ「Kirakira1」のコードを再度示します↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
Private Sub Kirakira1() Dim x1 Dim y1 Dim x2 Dim y2 Dim Color_Code For i = 1 To 600 '色を付けるセル1の指定' x1 = 15 * Rnd + 6 y1 = 15 * Rnd + 6 x1 = Round(x1, 0) y1 = Round(y1, 0) '色を付けるセル2の指定' x2 = 15 * Rnd + 6 y2 = 15 * Rnd + 6 x2 = Round(x2, 0) y2 = Round(y2, 0) '色(ColorIndex)番号' Color_Code = 56 * Rnd Color_Code = Round(Color_Code, 0) 'セル1、セル2の色付け' Cells(x1, y1).Interior.ColorIndex = Color_Code Cells(x2, y2).Interior.ColorIndex = Color_Code '休む時間' Sleep 1 Next i x1 = 0: y1 = 0: x2 = 0: y2 = 0 End Sub |
冒頭で Dim を使って宣言した変数は x1、y1、x2、y2、Color_Code の5つです。
x1、x2 は行番号、y1、y2 は列番号を示し、Color_Code はカラーインデックス番号を示します。
For 文を使って iが1~600になるまで、繰り返し処理(セルを色付けしてキラキラさせる)をするので600回同じ処理を繰り返すことになります。
さて、色付けをするセル1とセル2(色付けは2つのセル同時に行う)の行番号、列番号の指定の仕方として、以下のように Rnd 関数を用いた式を使っています。
●セル1
行番号 x1 = 15 * Rnd + 6
列番号 y1 = 15 * Rnd + 6
●セル2
行番号 x2 = 15 * Rnd + 6
列番号 y2 = 15 * Rnd + 6
Rnd 関数
Rnd 関数とは、単精度浮動小数点型の乱数(疑似乱数)を返す関数のことです。
返す値の範囲は0以上1未満です。
この Rnd 関数を使ってキラキラ光らせるセルの範囲をランダムに指定しているということです。
x1 = 15 * Rnd + 6
y1 = 15 * Rnd + 6
Rnd 関数を使って指定した x1、y1 をさらに Round関数を用いて0未満を四捨五入して整数にすることによって、セルを指定しているのです。
x1 = Round(x1, 0)
y1 = Round(y1, 0)
セル1の行番号「x1 = 15 * Rnd + 6」は、
Rnd が0を返すときには、x1=6 となり
Rnd が0.9999…を返すときは、四捨五入することで x1=21 となります。
同様に、セル1の列番号「y1 = 15 * Rnd + 6」は、
Rnd が0を返すときには、y1=6 となり
Rnd が0.9999…を返すときは、四捨五入することで y1=21 となります。
セル1の行番号x1と列番号y1をランダムで指定することによって、色付けするセルを決めているのです。
同様に、セル2の行番号x2と列番号y2も、ランダムに指定して色付けしています。
また「Color_Code = 56 * Rnd」として計算した Color_Code を四捨五入することで、0~56までに割り当てられたカラーインデックス番号をランダムで指定しています。
Sleep 関数
Sleep 関数はプログラミイングコードの実行を休ませる関数です。
Sleep 時間
のように記述し、時間はミリ秒単位で指定します。
1000とすれば 1000ミリ秒ということになります。
今回
Sleep 1
としてあるので、本当にわずかな時間だけ休ませているのですが、この数値を大きくすると休む時間が長くなり今回のマクロを実行した際には色の変化がゆっくりになります。
*なお、指定した時間で目で見て分かるレベルでどれだけの時間休むかは PC のスペックによっても異なるようです。
Sleep 500
とした場合において私の PC でマクロを実行させた動画を載せておきます。
セルの色が2つずつゆっくり変化することが確認できます。
プロシージャ 「Kirakira2」
プロシージャ「Kirakira2」のコードを再度示します↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Private Sub Kirakira2() Dim x1 Dim y1 Dim x2 Dim y2 Dim Color_Code For j = 1 To 600 '色を付けるセル1の指定' x1 = 15 * Rnd + 6 y1 = 15 * Rnd + 6 x1 = Round(x1, 0) y1 = Round(y1, 0) '色を付けるセル2の指定' x2 = 15 * Rnd + 6 y2 = 15 * Rnd + 6 x2 = Round(x2, 0) y2 = Round(y2, 0) 'セル1、セル2の色付け' Cells(x1, y1).Interior.ColorIndex = xlNone Cells(x2, y2).Interior.ColorIndex = xlNone '休む時間' Sleep 1 Next j End Sub |
「Kirakira2」プロシージャは「Kirakira1」プロシージャで色付けしたセルの塗りつぶしを無くしていくコードです。
「Kirakira1」プロシージャと同様に For 文を用いて、セル1とセル2の2つのセル同時に塗りつぶしを無くす動作を iが1~600まで600回繰り返します。
以下のように、カラーインデックス番号を xlNone にすることによってセル1、セル2の色の塗りつぶしを無くすことができます。
Cells(x1, y1).Interior.ColorIndex = xlNone
Cells(x2, y2).Interior.ColorIndex = xlNone
3、まとめ
Rnd 関数を使ってセルの色を変えてキラキラさせる Excel VBA アニメーションの作り方を紹介しました。
Rnd 関数はアニメーションを作る上ではとても役に立つ関数です。
使い方も簡単なので、ぜひマスターして頂きたいです。