「配列ってなんか難しそう…」 VBAを学び始めたころ、私はそう思っていました。
変数と何が違うの? 1次元?2次元? なにそれ?と、なかなか手が出なかったのを覚えています。
でも、少しずつコードを書きながら「これができるんだ!」「繰り返し処理がラクになった!」という喜びが増え、今では配列が頼れる味方になりました。
この記事では、かつて配列に苦手意識があった私が、初心者の目線で「これだけ知っておけば大丈夫!」という配列の基本と使い方を、わかりやすくお届けします。
はじめに:なぜ配列を学ぶのか?
「VBAで配列」と聞くだけで、なんとなく身構えてしまう…。
実は私自身も、VBAを学び始めた当初はそうでした。
変数との違いがよくわからないし、1次元?2次元?Indexは0から?1から?
ちょっとでもコードを間違えればエラーになる
――そんな緊張感があって、どこか苦手意識がぬぐえませんでした。
でも今では、配列は私にとって「頼れる味方」です。
なぜなら、配列を使えるようになると、似たような処理をまとめて書ける・無駄な繰り返しを減らせる・処理が速くなるという明確なメリットがあるからです。
手作業で繰り返していた作業も、ぐっとスマートに書けるようになりました。
配列ってなに?イメージでつかもう
「配列ってなんだかむずかしそう」
――そんな第一印象を持っている方も多いかもしれません。
でも心配しなくて大丈夫。
配列は一言でいえば、“同じ種類のデータをまとめて管理できる箱の集合”です。
配列をカンタンに言うと「棚」
例えば、5人分のテストの点数を記録したいとします。
普通の変数で記録しようとすると、こうなります
Dim score1 As Integer
Dim score2 As Integer
Dim score3 As Integer
Dim score4 As Integer
Dim score5 As Integer
これでは大変ですし、あとから人数が増えたらどうすればいいの?という話になります。
ここで登場するのが 配列(Array)。
配列を使うと、同じようなデータを「1つの名前」+「番号」でまとめて管理できます!
Dim score(1 To 5) As Integer
イメージとしては、こうです
score(1) → 棚の1段目 → 田中さんの点数
score(2) → 棚の2段目 → 鈴木さんの点数
score(3) → …
番号を変えるだけで、1つずつ取り出したり、書き換えたりできます。
なぜ配列が便利なのか?
繰り返し処理との相性が抜群!
例えば、5人分の点数をループで合計する処理も、配列があるとこんなにスッキリ書けます
Dim i As Integer, sum As Integer
For i = 1 To 5
sum = sum + score(i)
Next i
通常の変数だと、ひとつひとつ加算する必要がありますが、配列を使えばループでスマートに処理が可能です。
後から数が増えても柔軟に対応できる!
変数を個別に用意していると、6人目のデータが来たときにコードを修正しなければなりませんが、配列なら対応範囲を変更するだけで済みます。
配列を扱うと、コードが生き生きしはじめる
配列の魅力は、ただ“たくさんのデータを保存できる”だけではありません。
- データの一覧を一括処理する
- 条件に合うものだけを抜き出す
- セルの中身をまとめて取得・書き込みする
…など、業務でありがちなExcel作業が、配列を使うと驚くほど効率的になるのです。
ここまでのまとめ
- 配列は「同じ種類のデータをまとめて並べておける棚」のようなもの
- 各データは 配列名(番号) でアクセスできる
- 変数をたくさん使うより、配列+ループでシンプルに処理が書ける
次章では、この“棚”の使い方を実際に学んでいきます。
「配列を宣言するには?」「どうやって値を代入するの?」
――そんな基本の型を、やさしく丁寧に解説します!
配列の基本の書き方を覚えよう
前章で「配列はデータの入れ物(棚)」というイメージをつかんだところで、いよいよ実際に使うための基本的な文法とルールを学んでいきましょう。
配列の宣言方法:固定長と可変長
まず、配列を使うには最初に宣言(=準備)する必要があります。
VBAでは Dim 文を使って配列のサイズとデータ型を指定します。
固定長配列(サイズが決まっているもの)
Dim scores(1 To 5) As Integer
この例では、scores(1) 〜 scores(5) まで、5つ分の整数型の配列が用意されます。
【補足】指定しない場合は、開始インデックスが「0」になります。
Dim names(3) As String ' → names(0) ~ names(3) の4個分の要素
値の代入と取得の基本
配列に値を入れる・取り出す方法はとてもシンプル。
通常の変数と同じように = を使います。
scores(1) = 90
scores(2) = 85
MsgBox scores(1) ' → 90と表示される
各要素にはインデックス番号(添え字)を使ってアクセスします。
番号のつけ忘れに要注意です!
配列の範囲を確認する:LBoundとUBound
配列をループ処理する際には、インデックスの開始位置と終了位置を把握しておくことが重要です。
これを調べるのが LBound(最小値)と UBound(最大値)です。
Dim i As Integer
For i = LBound(scores) To UBound(scores)
MsgBox scores(i)
Next i
こう書けば、要素数が変更になっても安全に処理できます。
可変長配列(サイズを後から変更できる)
「データの数が実行時に決まる」場合は、可変長配列を使います。
宣言時にサイズを指定せず、あとから ReDim でサイズを定義します。
Dim prices() As Double
ReDim prices(1 To 10)
また、すでに入っているデータを保持したままサイズを変えるには ReDim Preserve を使います
ReDim Preserve prices(1 To 15)
ただし、Preserveが使えるのは一番右側の次元だけという制限があるので注意です。
まとめ:配列の基礎は“書いて覚える”のが近道!
- Dim 配列名(範囲) As 型名 で宣言
- 配列(番号) = 値 で代入、MsgBox 配列(番号) で取得
- LBound / UBound でループの範囲を柔軟に設定
- ReDim を使ってサイズを動的に変更可能
少しずつコードを書きながら、「配列に入れる → 取り出す →繰り返す」の基本パターンに慣れていきましょう!
実践例①:1次元配列でデータをまとめて扱う
ここからは、いよいよ配列を使った実践的な例を紹介していきます。
まずは最も基本となる「1次元配列」を使って、複数のデータをまとめて扱う方法を学んでいきましょう。
例えば、5人分の点数を処理したいとき
1人ずつ個別の変数を用意するのは大変です
Dim s1 As Integer, s2 As Integer, s3 As Integer, s4 As Integer, s5 As Integer
配列を使えば、これをたった1つの変数名で表現できます
Dim scores(1 To 5) As Integer
1番目の点数は scores(1)、2番目は scores(2) のように番号を使ってアクセスできます。
ループと組み合わせて処理を効率化!
For文と組み合わせると、5人分の点数を一括で入力・合計できます
Dim scores(1 To 5) As Integer
Dim i As Integer
Dim total As Integer
' 点数の入力
For i = 1 To 5
scores(i) = InputBox(i & "人目の点数を入力してください")
Next i
' 合計を計算
For i = 1 To 5
total = total + scores(i)
Next i
MsgBox "合計点は " & total & " 点です"
ポイント
- 同じような処理を繰り返すときに配列+ループが威力を発揮!
- InputBoxを使えば、ユーザーからの値を柔軟に受け取れます
平均・最大値・最小値もカンタンに出せる!
配列の中身を分析するときも、同様にループで処理できます。
Dim maxScore As Integer, minScore As Integer
maxScore = scores(1)
minScore = scores(1)
For i = 2 To 5
If scores(i) > maxScore Then maxScore = scores(i)
If scores(i) < minScore Then minScore = scores(i)
Next i
MsgBox "最高点:" & maxScore & "/最低点:" & minScore
ここまでのまとめ
- 1次元配列を使えば、複数のデータを1つの名前でまとめられる
- 配列+ループで、入力・集計・分析がスムーズに
- 同じ処理を“書き直さずに済む”ことで、コードがスッキリ&変更に強くなる
実践例②:2次元配列で表形式のデータを操作する
1次元配列で“縦に並んだデータ”の扱いに慣れてきたら、次はExcelらしい「表形式」のデータを一括で操作するために、2次元配列を活用しましょう。
Excelの表は「行 × 列」= 2次元構造。
だからこそ、VBAで表を扱うときは2次元配列がピッタリなんです。
Excelの表を配列に読み込んでみよう
まずは「セル範囲→配列」にデータを読み込む基本パターンです
Dim data As Variant
data = Range("A2:C6").Value
この1文で、セルA2~C6にある“5行×3列”の表データが、data(1 To 5, 1 To 3) という2次元配列に読み込まれます。
ポイント
配列の最初の次元(行)が「1」からスタート(Rangeで読み込んだ場合)
1行目=data(1, 列番号)、2行目=data(2, 列番号) という形になります
配列の内容をセルに書き戻す
読み込んだデータは、そのまま別の場所に貼り付ける(転記する)ことも簡単です
Range("F2:H6").Value = data
これは「配列 → セル範囲」への一括出力! サイズさえ一致していれば、瞬時にコピー&貼り付けできます。
配列の中身をループで処理する
たとえば、1列目(氏名)と2列目(得点)をセットで表示してみましょう
Dim i As Long
For i = 1 To UBound(data, 1)
Debug.Print data(i, 1) & "さんの得点:" & data(i, 2)
Next i
- UBound(data, 1) → 行数
- UBound(data, 2) → 列数
など、第2引数を指定して次元ごとのサイズを確認できます。
こんな処理もできる!
配列に読み込んで処理すれば、たとえばこんなこともできます
- 得点が一定以上の人だけ表示
- 氏名をキーに並べ替え(ソート)
- 合計・平均・最高点などを一括で計算して表示
- 複数の表をマージ・統合する
2次元配列を使えば、これらの処理が超高速&スッキリなコードで実現できます!
まとめ:2次元配列は“表形式のデータ操作”に最適
- Range(“範囲”).Value で2次元配列として取得
- 配列名(行番号, 列番号) の形でアクセス・出力できる
- Excelの表(行×列)を扱うなら、2次元配列で一括処理が圧倒的に便利!
次章では、配列を使う上でよくある「つまずきポイント」「エラーの原因と対処法」を丁寧に解説します。
「実行時エラー9」との向き合い方などもお伝えします!
配列のありがちなミスとエラーの対策
「配列を使うとエラーが出やすい」「意味不明な数字のメッセージが出てくる」
――そんな印象を持っている方も多いと思います。
実際、配列を扱うときは少しだけ“気をつけるべきルール”があるのも事実です。
でもご安心を。つまずきやすいポイントを知っていれば、防ぐのは意外とカンタンです!
ここでは、初心者がよく経験する代表的なエラーとその対策をまとめてご紹介します。
実行時エラー 9:「インデックスが有効範囲にありません」
よくある原因
- 指定したインデックス番号が 配列の範囲外 になっている
- Dim arr(1 To 5) なのに arr(0) を参照している、など
解決策
LBound と UBound で 範囲を動的に取得しましょう
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
宣言していない配列にアクセスしている
Dim arr() As String
Debug.Print arr(1) ' ← ReDimしてないのに参照している
このように、サイズ未設定の配列を使うとエラーになります。
解決策
必ず ReDim を使ってサイズを確保しましょう
ReDim arr(1 To 5)
配列のサイズを変更すると値が消える?
ReDim arr(1 To 3)
arr(1) = "A"
ReDim arr(1 To 5) ' ← arr(1) の中身が消える!
解決策
値を残したままサイズ変更したいときは ReDim Preserve を使います
ReDim Preserve arr(1 To 5)
ただし、Preserveできるのは一番右の次元だけ。2次元配列では注意!
Variant型以外でセルの範囲を読み込もうとしている
Dim data() As String
data = Range("A1:B5").Value ' ← エラー!
セル範囲のような2次元データを受け取るときは、型をVariantにする必要があります。
解決策
Dim data As Variant
data = Range("A1:B5").Value ' 正常動作!
配列の番号は0から?1から?混乱しがち!
よくある勘違い
- Dim arr(5) とすると、0~5の6個分の要素が作られます(Option Baseが0の場合)
- Dim arr(1 To 5) と明記すれば、1から始まることが明確になります
不安なときは、LBound / UBound を使って安全に処理しましょう!
まとめ:「配列=エラーが出やすい」は誤解です
配列で起こるトラブルの多くは、実は“少しの工夫”で防げるものばかり。
- 範囲外アクセス → LBound / UBound を使う
- 宣言忘れ → Dim + ReDim をセットで考える
- 型の不一致 → セル範囲は Variant型で受け取る
「エラーが出た=失敗」ではなく、「原因を知って次に活かせるチャンス」として、前向きに向き合っていきましょう!
応用編:動的配列と配列の便利活用
これまで配列の基本を学んできたあなたは、もう十分に“配列のしくみ”がわかってきたはずです。
ここからは、さらに一歩進んで「可変長(動的)配列」や「配列を操作する関数」を使い、より自由度の高い処理を体験してみましょう。
ReDimを使ってサイズを変える
配列のサイズが「あとで決まる」ケース、実務でよくありますよね。
そんなときは、次のように ReDim を使います。
Dim users() As String
Dim i As Integer
ReDim users(1 To 3)
users(1) = "田中"
users(2) = "鈴木"
users(3) = "佐藤"
これで、実行時にサイズを決めたり変更することが可能になります。
値を残したままサイズを拡張:ReDim Preserve
サイズを変えると中身が消える?
そんなときは Preserve オプションをつけましょう
ReDim Preserve users(1 To 5)
users(4) = "高橋"
users(5) = "山本"
これで、元の「田中〜佐藤」も残したまま、要素を追加できます。
注意:2次元配列で使う場合は、右端の次元しかPreserveできません。
Split関数で文字列 → 配列に変換
1つの文字列を特定の区切り文字で分割し、配列に変換したいときに便利なのが Split 関数です
Dim words() As String
words = Split("りんご,バナナ,オレンジ", ",")
MsgBox words(0) ' → りんご
CSV形式やフォーム入力など、カンマ区切りのデータを扱う場面で大活躍!
Filter関数で条件に合う値だけ抽出
配列の中から条件に合う値だけを取り出したい…というときは、Filter 関数が便利です。
Dim fruits() As String
Dim result() As String
fruits = Split("りんご,バナナ,メロン,バナナ", ",")
result = Filter(fruits, "バナナ")
MsgBox result(0) ' → バナナ
同じ内容を複数含む配列からの“条件抽出”も、コード1行で実現!
まとめ:配列の応用は“ひと工夫で世界が変わる”
- ReDim / Preserve で可変的に対応
- Split で文字列を配列に分解
- Filter で必要なデータだけを抽出
こうした応用テクニックを知っておくと、配列を使った処理の“引き出し”が一気に広がります。
次章では、ここまで学んできた内容をふり返りながら、VBA×配列の学習を「知識」から「使えるスキル」へつなげるためのまとめとステップをご紹介します!
まとめ:配列が使えると、VBAがもっと楽しくなる!
ここまで読んでくださったあなたは、「配列って思っていたよりも難しくないかも?」と感じてくれているかもしれません。
そう、配列はたしかに最初こそつまずきやすいものの、仕組みがわかればVBAをグッとパワーアップさせてくれる存在なのです。
本記事で学んできたことをふりかえろう
- 配列の基本的なイメージと使い方(変数との違い、棚のたとえ)
- 1次元・2次元配列の活用(ループ処理や表データとの相性)
- 配列を扱う上での落とし穴とエラー対策(LBound / UBound / Variant型 など)
- 可変長配列や、Split・Filter関数といった応用テクニック
これらを順に身につけていくことで、配列が怖いものではなく、使いこなすための「道具」に変わっていったはずです。
配列は「思考の整理ツール」にもなる
プログラミングに慣れてくるとわかるのですが、配列は単なる“データの箱”ではありません。
- 処理の単純化(同じような処理の整理)
- ロジックの明確化(ルールにそった繰り返し)
- 書き換えやすさ(規模が変わっても修正が少ない)
といった面で、考え方そのものをシンプルに、見通しのよいものにしてくれるツールでもあるのです。
これからのステップ:配列を実務に応用してみよう!
たとえばこんな方向に進めていくと、さらに配列の力を感じられます
- Excelの入力表を2次元配列に読み込んでまとめて集計
- 条件に応じて必要なデータだけを抽出(Filter)して別シートに転記
- ReDimを使って可変サイズのフォーム入力を柔軟に処理
- CSVやログデータの文字列をSplitで解析して加工
小さな処理からでも大丈夫!
配列を「使って慣れていく」ことで、VBAの書けること・できることが一気に広がっていきます。

最初は「むずかしそう…」だった配列も、 今では「できることが増えて面白い!」に変わってきていませんか?
配列が使えるようになると、あなたのコードが“指示”から“会話”に変わっていきます。 それはまるで、Excelと対等にやりとりができるようになるような感覚。 VBAの世界が、ぐんと自由になるはずです。
ぜひこの記事をきっかけに、「配列はちょっと得意かも」と思える自分へ近づいてみてください!
VBA配列まわりの用語集
用語 | 読み方 | 意味・解説 |
---|---|---|
Variant | バリアント | さまざまな型のデータを受け取れる“なんでも箱”。配列の受け皿として使うと便利(特にセル範囲の読み込み時に必須) |
1次元配列 | いちじげんはいれつ | 横一列または縦一列に並んだ、1方向のデータの配列。arr(1), arr(2) のように使う |
2次元配列 | にじげんはいれつ | 行×列のデータ構造。Excelの表と同じイメージ。arr(行, 列) のようにアクセスする |
Index(添え字) | インデックス(そえじ) | 配列の中の「何番目か」を表す番号。例:arr(1) の 1 がインデックス |
LBound | エルバウンド | 配列の中での“最小のインデックス”(=何番目から始まるか)を返す関数 |
UBound | ユーバウンド | 配列の中での“最大のインデックス”(=どこまで使えるか)を返す関数 |
ReDim | リディム | 配列のサイズをあとから変更(再定義)する命令。動的配列に使う |
Preserve | プリザーブ | ReDimと組み合わせて、既存のデータを残しながらサイズを変更できるキーワード |
Split | スプリット | 文字列を区切り文字で分割して、配列に変換する関数 |
Filter | フィルター | 配列の中から、特定の条件に合う要素だけを取り出す関数 |
おまけ:配列と仲良くなるコツ
- 名前をつけたら、インデックスは“住所”だと思おう(arr(1) は1番地)
- LBound/UBoundを使えば“何個あるか”を知らなくてもループできる
- Variant型は「セルの塊(Range)」を一括で読み込むときの強い味方!
コメント