Excel VBAの配列を基礎から理解しよう!固定長・可変長配列の違いを解説
生徒
「先生、変数は1つの箱に1つのデータを入れると教わりましたが、たくさんのデータをまとめて管理する方法はないんですか?」
先生
「ありますよ!それを『配列(はいれつ)』と呼びます。1つの名前でたくさんのデータをまとめて扱える、とても便利な仕組みです。」
生徒
「配列を使うと、どんな良いことがあるんですか?」
先生
「例えば100個のデータがあるとき、変数を100個用意するのは大変ですよね。配列なら1つの宣言で済みますし、ループ処理と組み合わせることで驚くほど効率的に処理ができるようになります。さっそく基本から見ていきましょう!」
1. 配列とは?たくさんのデータをまとめる「仕切り付きの箱」
Excel VBA(エクセル・ブイビーエー)の配列(はいれつ)とは、同じ種類のデータを一つのグループとしてまとめて管理するための仕組みです。これまでの「変数」が単なる1つの箱だったのに対し、配列は「内部にたくさんの仕切りがある大きな箱」をイメージすると分かりやすいでしょう。
プログラミング未経験の方にとって、10個のデータが必要なときに Dim a, Dim b, Dim c... と10個の変数を作るのは非常に手間がかかります。配列を使えば、「aという名前の10個入りの箱」を1回で作ることができます。これにより、大量のデータを扱うエクセル作業の自動化が劇的に楽になります。
2. 配列の基本用語「要素」と「添字(インデックス)」
配列を扱う上で、絶対に覚えておかなければならない重要な単語が2つあります。それは「要素(ようそ)」と「添字(そえじ)」です。パソコンに詳しくない方でも、アパートの部屋番号をイメージすれば簡単です。
- 要素: 配列の中にある、データを入れる一つ一つの「部屋」のことです。
- 添字(インデックス): 各部屋に割り振られた「部屋番号」のことです。
ここで最大の注意点があります。VBAの配列の部屋番号は、基本的に「0番」から始まります。 1番からではないので、初めての方はここで混乱しやすいですが、「最初は0」と呪文のように覚えてしまいましょう。
3. 決まった数を管理する「固定長配列」の書き方
固定長配列(こていちょうはいれつ)とは、あらかじめ「この箱には5個入れます」と、中身の数を決めておくタイプの配列です。使い方が決まっているときに便利です。
Sub FixedArrayExample()
' 3つのデータ(0, 1, 2番)が入る配列を宣言
Dim fruits(2) As String
' 各要素にデータを代入
fruits(0) = "りんご"
fruits(1) = "みかん"
fruits(2) = "バナナ"
' メッセージボックスで表示
MsgBox "一番目の果物は " & fruits(0) & " です。"
End Sub
宣言のときに (2) と書くと、0番、1番、2番の合計3つの部屋が作られます。この「( )」の中の数字が、最大の部屋番号を表します。実行結果は以下のようになります。
一番目の果物は りんご です。
4. 後から大きさを変えられる「可変長配列(動的配列)」
実務では、データがいくつあるか事前に分からないことが多々あります。そんな時に使うのが可変長配列(かへんちょうはいれつ)、別名「動的配列(どうてきはいれつ)」です。これは、プログラムの途中で箱のサイズを自由に変更できる魔法のような配列です。
作り方は簡単で、最初は ( ) の中を空にして宣言し、後から ReDim(リディム)という命令を使ってサイズを指定します。
Sub DynamicArrayExample()
' 最初はサイズを決めずに宣言
Dim memberList() As String
' プログラムの途中で「3人分(0〜2番)」に設定
ReDim memberList(2)
memberList(0) = "田中"
memberList(1) = "佐藤"
memberList(2) = "鈴木"
MsgBox "登録人数は3人です。"
End Sub
5. データを消さずにサイズを変える「Preserve」
可変長配列で注意しなければならないのは、ただ ReDim をし直すと、中に入っていたデータがすべて消えてしまうという点です。これを防ぐためには、Preserve(プリザーブ) というキーワードを一緒に使います。プリザーブには「保存する」という意味があります。
Sub PreserveExample()
Dim scores() As Integer
ReDim scores(0)
scores(0) = 80
' データを保ったまま、サイズを1増やして(0〜1番)にする
ReDim Preserve scores(1)
scores(1) = 95
MsgBox "一人目は " & scores(0) & " 点、二人目は " & scores(1) & " 点です。"
End Sub
これを使えば、エクセルのデータを1行ずつ読み込みながら、配列をどんどん大きくしていくといった柔軟な処理が可能になります。
6. 配列とループ処理(For文)の相性はバツグン!
配列の本当の力は、繰り返し処理(ループ)と組み合わせたときに発揮されます。部屋番号(添字)を変数 i などに置き換えることで、大量のデータを一気に処理できます。
ここで便利なのが、UBound(ユーバウンド)という関数です。これは「配列の最後の部屋番号」を自動で教えてくれる機能です。これを使えば、配列のサイズが変わってもコードを書き直す必要がありません。
Sub ArrayLoopExample()
Dim colors(3) As String
colors(0) = "赤": colors(1) = "青": colors(2) = "黄": colors(3) = "緑"
Dim i As Integer
' 0番から最後の番号(UBound)まで繰り返す
For i = 0 To UBound(colors)
' セルのi+1行目に書き込む
Cells(i + 1, 1).Value = colors(i)
Next i
MsgBox "すべての色をシートに書き込みました。"
End Sub
7. 縦横の広がりを持つ「多次元配列」
これまでは横一列の箱をイメージしてきましたが、配列には縦と横、つまりエクセルの表のような形式でデータを保持できる多次元配列(たじげんはいれつ)もあります。例えば Dim table(2, 3) と書けば、「3行×4列」のような表形式の箱が出来上がります。エクセルの表を丸ごとメモリ(パソコンの作業領域)に取り込んで処理したい場合に非常に高速に動作します。
多次元配列は初心者の方には少し複雑に見えるかもしれませんが、「エクセルの表と同じ形をした変数の集まり」だと考えれば大丈夫です。まずは1次元(一列)の配列に慣れてから挑戦してみましょう。
8. 配列を使う際の注意点とエラー対策
配列を使い始めると、必ずと言っていいほど遭遇するエラーがあります。それは「インデックスが有効範囲にありません」というエラーです。これは、「10個しか部屋がないのに、11番目の部屋を開けようとした」時に発生します。
未経験の方は、以下のポイントをチェックしてください。
- 部屋番号が0から始まっているか?(2個分確保したら、最大番号は1です)
ReDimをするときに、Preserveを書き忘れてデータが消えていないか?- 配列の最大数(
UBound)を超えてループを回していないか?
これらに気をつけるだけで、配列を使ったプログラムのバグは劇的に減ります。配列は最初は少し難しく感じるかもしれませんが、一度マスターすれば「エクセル自動化のプロ」への大きな一歩になります。まずは短いコードを自分で書いて、動かしてみることから始めてみてくださいね!