当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

【VBA】Array関数でデータを番号付の箱に入れます

今回は VBAArray関数 のサンプルコードで配列変数の基本について学んだ後に、配列を応用して簡単な「くじ引き」マクロを作ってみます。

【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)

とすれば、「当たり」か「ハズレ」のいずれかを無作為に表示することになります。

エクセルや数学に関するコメントをお寄せください