今回は VBA の Array関数 のサンプルコードで配列変数の基本について学んだ後に、配列を応用して簡単な「くじ引き」マクロを作ってみます。
【VBA】Array関数
配列変数とは1つ1つのデータを番号付の箱に入れるという概念です。配列を用意する方法はいくつかありますが、VBA で比較的小さな数のデータを扱うときには Array関数を用いると便利です。まずは簡単なサブルーチンを動かして配列の感覚を掴んでみましょう。
'[VBA] Array関数のサンプルコード(1) Sub Array_Sample_1() Dim mydata As Variant mydata = Array("a", "b", "c") MsgBox mydata(1) End Sub
Array_Sample_1() を実行するとメッセージボックスに「b」と表示されます。配列変数は必ず Variant 型で宣言します。Variant 型とはあらゆる種類の型を格納できるデータ型であると同時に、配列を格納できる唯一のデータ型です。3 行目のコード
mydata = Array("a","b","c")
によって、mydata(0), mydata(1), mydata(2) にそれぞれ a, b, c が格納されます。ここで注意しなければならないのは、配列は 0 番からインデックスされてしまうということです。ですから、
MsgBox mydata(1)
と書くと、2 番目の箱に入れられた「 b 」が表示されるのです。この方式がどうも馴染めないという場合はサブルーチンの外に
Option Base 1
と書き込みます。
'[VBA] Array関数のサンプルコード(2) Option Base 1 Sub Array_Sample_2() Dim mydata As Variant mydata = Array("a", "b", "c") MsgBox mydata(1) End Sub
するとメッセージボックスに「a」と表示されるようになります。文字 a, b, c が格納される箱がそれぞれ mydata(1), mydata(2), mydata(3) となったからです。
袋の中に「当たり」を 1 つ、「ハズレ」を 3 つ入れて、1/4 の確率で「当たり」を引くプロシージャを Array() を使って実装してみます。
'[VBA] くじ引きプロシージャ Option Base 1 Sub Kuji() Dim ball As Variant Dim rd as Integer Randomize ball = Array("当たり", "ハズレ", "ハズレ", "ハズレ") rd = Int(4 * RND + 1) MsgBox ball(rd) End Sub
Kuji() を実行するとメッセージボックスに「当たり」か「ハズレ」のどちらかが表示されます。何回か試してみると「ハズレ」を引く確率が高くなっていることが分かると思います。
Kuji() について解説します。前回説明したように
Option Base 1
によって配列のインデックス番号の下限値を 1 に設定し、
ball = Array("当たり", "ハズレ", "ハズレ", "ハズレ")
という記述で ball(1) に「当たり」、ball(2), ball(3), ball(4) にそれぞれ「ハズレ」という文字列を入れています。次にこのインデックス番号を無作為に選択することを考えます。端数を丸めて整数値に変える INT 関数、 0 から 1 までの乱数を発生させる RND 関数を用いると、a ~ b のランダム整数は
Int((a - b + 1) * RND + a)
という記述で得られます。ですから
rd = Int(4 * RND + 1)
と書けば 1 から 4 のランダム整数を変数 rd に入れることになります。rd には 1 から 4 までの数字が入っているので、
MsgBox ball(rd)
とすれば、「当たり」か「ハズレ」のいずれかを無作為に表示することになります。
エクセルや数学に関するコメントをお寄せください