配列ってそもそも何者?
まず「配列宣言」の前に、配列そのもののイメージをはっきりさせましょう。
配列はざっくり言うと、
「同じ種類のデータを、番号付きでズラッと並べて入れておく箱」
です。
普通の変数は「1つの値」を入れる箱でした。
Dim score As Long
score = 80
VBこれは「score という箱に 80 が1つ入っている」状態です。
配列は、「score がたくさんある」イメージです。
- score(0)
- score(1)
- score(2)
- …
というふうに、「同じ名前だけど番号違いの箱」が並びます。
この「番号付きで並んだ箱」を使うために、最初に「配列として宣言する」のが配列宣言です。
一次元配列の基本的な宣言方法
最も基本の形
一番シンプルな配列宣言はこうです。
Dim scores(4) As Long
VBここで大事なポイントがいくつかあります。
scoresが配列の名前(4)は「添字(インデックス)の上限」- VBAの配列は、何も指定しないと「0から始まる」
つまり、この宣言で使えるのは、
- scores(0)
- scores(1)
- scores(2)
- scores(3)
- scores(4)
の5個分です。
「(4) と書いたのに、5個使える」のが最初のつまずきポイントです。
VBAの配列は「下限が0、上限が4」なので、0~4の5個になる、という仕組みです。
0始まりがしっくりこない人向けの書き方
「0から始まるのがどうしても気持ち悪い…」という人は、
下限と上限を両方書くこともできます。
Dim scores(1 To 5) As Long
VBこの場合は、
- scores(1)
- scores(2)
- scores(3)
- scores(4)
- scores(5)
の5個です。
「1~5」と書いているので、直感的に分かりやすいですよね。
超初心者のうちは、
「0から始まる形」と「1から始まる形」の両方を見て、
自分がしっくりくるほうを選んでOKです。
配列宣言と代入の流れを具体例で見る
5人分の点数を配列に入れてみる
Sub SampleArrayBasic()
Dim scores(1 To 5) As Long
scores(1) = 80
scores(2) = 65
scores(3) = 90
scores(4) = 75
scores(5) = 60
MsgBox scores(3) ' 3人目の点数(90)が表示される
End Sub
VBここでやっていることを言葉にすると、
- scores という「5人分の点数を入れる配列」を宣言
- scores(1)~scores(5) に、それぞれ点数を代入
- scores(3) を取り出して表示
という流れです。
重要なのは、
「scores という1つの名前の中に、“番号違いの箱”が複数ある」
という感覚です。
普通の変数なら、score1, score2, score3…と名前を増やしていくところを、
配列なら scores(1), scores(2), scores(3)…と「番号」で区別します。
配列宣言で一番大事な「要素数」の考え方
何個分必要かを先に考える
配列を宣言するときに、一番大事なのは「何個分必要か」です。
例えば、「5人分の点数を扱いたい」と決まっているなら、
Dim scores(1 To 5) As Long
VBのように、最初から5個分の箱を用意します。
もし「10人分」なら、
Dim scores(1 To 10) As Long
VBです。
ここでのポイントは、
- 配列宣言のときに「最大何個使うか」を決める
- その範囲外の番号を使おうとするとエラーになる
ということです。
範囲外アクセスのイメージ
Dim scores(1 To 5) As Long
scores(6) = 100 ' これはエラー(範囲外)
VBscores は「1~5」までしか箱がないのに、
6番目に代入しようとしているので、実行時エラーになります。
「配列宣言=使える番号の範囲を決めること」
という意識を持っておくと、エラーの理由が理解しやすくなります。
動的配列宣言(サイズをあとから決める)
サイズが最初から分からないとき
「何個必要か、実行してみないと分からない」
という場面もよくあります。
例えば、
- シートのA列に何行データがあるか分からない
- ユーザーの入力数によって変わる
こういうときは、最初からサイズを決める固定配列ではなく、
動的配列 を使います。
動的配列の宣言と ReDim
動的配列は、最初の宣言では「サイズを決めない」のが特徴です。
Dim scores() As Long ' ここではサイズを決めない
VBそのあとで、実際に必要なサイズが分かったタイミングで、ReDim を使って大きさを決めます。
ReDim scores(1 To 5)
VBこれで、scores(1)~scores(5) が使えるようになります。
具体例:A列のデータ件数に合わせて配列サイズを決める
Sub SampleDynamicArray()
Dim scores() As Long
Dim lastRow As Long
Dim i As Long
' A列の最終行を求める(ざっくり例)
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
' データ件数に合わせて配列サイズを決める
ReDim scores(1 To lastRow)
' A列の値を配列に読み込む
For i = 1 To lastRow
scores(i) = Range("A" & i).Value
Next i
MsgBox "配列に " & lastRow & " 件のデータを読み込みました。"
End Sub
VBここでの流れは、
- まず
Dim scores() As Longで「動的配列」として宣言 - 実際のデータ件数(lastRow)を調べる
ReDim scores(1 To lastRow)で、その件数分の箱を用意- For文でA列の値を配列に入れていく
というものです。
「サイズが変わる可能性があるなら、動的配列+ReDim」
というパターンは、実務でかなりよく使います。
二次元配列の宣言(行と列を持つ配列)
行×列の表を配列で持つイメージ
一次元配列は「1列に並んだ箱」でしたが、
二次元配列は「行と列を持つ表」のようなイメージです。
宣言はこう書きます。
Dim table(1 To 3, 1 To 4) As Long
VBこれは、
- 行方向に 1~3
- 列方向に 1~4
の「3行×4列=12個」の箱を持つ配列です。
使うときは、
table(1, 1) = 10 ' 1行1列
table(2, 3) = 20 ' 2行3列
table(3, 4) = 30 ' 3行4列
VBのように、「(行, 列)」の順番で指定します。
シートの表をそのまま配列に読み込むイメージ
Excel VBAでは、Range をそのまま二次元配列に入れることもできます。
Dim data As Variant
data = Range("A1:C3").Value
VBこのとき data は、
- data(1,1) → A1
- data(1,2) → B1
- data(1,3) → C1
- data(2,1) → A2
…
という二次元配列になります。
ここは少し先の話ですが、
「配列宣言の形」として、二次元もあるんだ、くらいは頭の片隅に置いておくといいです。
配列宣言でつまずきやすいポイント
「(4) と書いたのに5個使える」問題
Dim a(4) As Long
VBこれで使えるのは a(0)~a(4) の5個です。
VBAのデフォルトの下限は0だから、という仕様です。
「0から始まるのがややこしい」と感じるなら、
素直に「1 To n」を使ってしまうのも全然アリです。
Dim a(1 To 5) As Long ' 1~5 の5個
VB宣言した範囲外を触ってエラーになる
Dim a(1 To 5) As Long
a(6) = 10 ' 範囲外 → 実行時エラー
VB配列宣言は「使っていい番号の範囲を決めること」なので、
その外側を触ろうとすると怒られます。
「この配列は何個分の箱を持っているのか?」を、
宣言を見るだけでパッと把握できるようになると、エラーの原因がすぐ分かるようになります。
まとめ:配列宣言は「同じ種類の箱を何個並べるか決める作業」
配列宣言の本質は、
「同じ型の変数を、番号付きでいくつ並べるかを決める」
ことです。
今日のポイントをコンパクトにまとめると、
- 配列は「同じ型の箱を番号付きで並べたもの」
Dim a(4) As Longは a(0)~a(4) の5個分- 「1から始めたい」なら
Dim a(1 To 5) As Longのように下限も書ける - サイズが変わるなら
Dim a() As 型→ReDim a(1 To n)の動的配列 - 二次元配列は
Dim a(1 To 行数, 1 To 列数) As 型の形

