【2026年8月最新】VBAの配列完全ガイド|宣言・ループ・コピー・ソート・フィルタ・Claude Code活用法
VBAで大量のデータを効率よく処理するには「配列」の理解が欠かせません。セルを1つずつ読み書きするより、配列にデータをまとめて処理することで、マクロの実行速度が数十〜数百倍速くなることもあります。
しかし配列には「固定長・可変長・動的配列」など複数の種類があり、ReDim・UBound・LBoundといった専用の構文や関数も覚える必要があります。ループ・コピー・ソート・フィルタなど操作の種類も多岐にわたります。
この記事ではVBAの配列に関する全知識を体系的に解説します。さらにClaude Codeを使って配列処理のVBAコードを自動生成する方法も紹介します。
この記事で分かること:
01 VBA ARRAY BASICS VBAの配列とは?基本概念と変数との違い 複数の値を1つの変数名でまとめて扱えるデータ構造
VBAの配列(Array)は、同じデータ型の複数の値を一つの変数名でまとめて管理できるデータ構造です。通常の変数が「1つの棚に1つの値」を入れるとすると、配列は「番号付きの棚が複数並んだラック」のイメージです。
📚 用語解説
配列(Array):VBAで複数の値を1つの変数名でまとめて管理するデータ構造。「arr(0)」「arr(1)」のように添字(インデックス)番号を使って各要素にアクセスする。通常のVBA変数が1つの値しか持てないのに対し、配列は同種のデータを大量に扱える。Excelのセル範囲を一括で配列に読み込んで処理することで、セルを1つずつ読むより実行速度が飛躍的に速くなる。
| 比較項目 | 通常の変数 | 配列 |
|---|---|---|
| 格納できる値の数 | 1つだけ | 複数(宣言時に指定した数) |
| 値へのアクセス | 変数名だけでアクセス | 変数名(インデックス)でアクセス(例: arr(0)) |
| メモリ効率 | 値の数だけ変数が必要 | 1つの変数名で複数値を管理 |
| ループとの相性 | 毎回変数名を書く必要あり | ループで全要素を順番に処理しやすい |
| 大量データの速度 | 1万件は遅い | 配列に読み込んでから処理すると高速 |
配列が特に威力を発揮するシーンを確認しておきましょう。
| 業務シーン | 配列を使う前 | 配列を使った後 |
|---|---|---|
| 1万行のデータを集計 | For i=1 to 10000: Cells(i,1)を毎回読む | 先に配列に読み込んでからメモリ内で処理 |
| 複数の商品コードを比較 | 変数を10個宣言して管理 | 1つの配列変数で全コードを管理 |
| セルにデータを書き出す | 10,000回のセル書き込み | 1回の配列書き出しで完了 |
| 条件に一致する行を抽出 | 全行を1行ずつIf文でチェック | 配列にロードしてからFilter関数 |
02 ARRAY DECLARE 配列の宣言方法:固定長・可変長・動的配列 ReDim・ReDim Preserveを使った動的配列の宣言と初期化を完全解説
VBAの配列には宣言時に要素数が決まる「固定長配列」と、実行中に要素数を変更できる「動的配列」があります。
2-1. 固定長配列の宣言
固定長配列は宣言時に要素数を指定します。「Dim arr(4) As Integer」と書くと、0〜4の添字を持つ5要素の整数型配列が作られます。VBAのデフォルトは添字が0から始まる(0始まり)です。
' 5要素の固定長配列(添字0〜4)
Dim scores(4) As Integer
' 値を代入
scores(0) = 85
scores(1) = 92
scores(2) = 78
scores(3) = 88
scores(4) = 95
' 合計を計算
Dim total As Integer
Dim i As Integer
For i = 0 To 4
total = total + scores(i)
Next i
MsgBox "合計: " & total
モジュールの先頭に「Option Base 1」と書くと、配列の添字が1から始まるようになります。Excelのシート行が1始まりなのに合わせて1始まりにしたい場合に使えます。ただし、Option Base 1を使うとコードを読む人が混乱しやすいため、0始まりのままで「添字0を使わない」スタイルを採用する場合もあります。
2-2. 動的配列の宣言:ReDimの使い方
📚 用語解説
ReDim(動的配列のサイズ変更):VBAで動的配列のサイズを実行時に変更するステートメント。「Dim arr() As String」と要素数を空欄で宣言し、後で「ReDim arr(n)」と要素数を指定する。ReDimすると既存の配列データが消えるため、データを保持したままサイズを変更したい場合は「ReDim Preserve arr(n)」を使う。処理するデータ件数が事前に分からない場合(セルの行数が可変など)に必須。
' 動的配列の宣言(要素数を空欄にする)
Dim names() As String
' データ件数を確認してからサイズを決定
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
' ReDimでサイズを設定
ReDim names(lastRow - 1)
' セルの値を配列に格納
Dim i As Long
For i = 0 To lastRow - 1
names(i) = Cells(i + 1, 1).Value
Next i
MsgBox "読み込んだ件数: " & lastRow
2-3. ReDim Preserveでデータを保持しながらサイズ変更
ReDimを実行すると既存のデータが消えてしまいます。データを保持したままサイズを変更したい場合はReDim Preserveを使います。ただし、ReDim Preserveは最後の次元のサイズだけ変更できるという制約があります。
' ReDim Preserveで要素を1つずつ追加
Dim results() As String
Dim count As Integer
count = 0
Dim i As Long
For i = 1 To 100
If Cells(i, 1).Value >= 80 Then
' 配列サイズを1つ増やしてデータを保持
ReDim Preserve results(count)
results(count) = Cells(i, 2).Value
count = count + 1
End If
Next i
MsgBox "80点以上の人数: " & count
ReDim Preserveをループの中で毎回呼ぶと、毎回メモリの再割り当てが発生して処理が遅くなります。対策として「最初に大きめのサイズで宣言→データを格納→最後に実際の要素数でReDim Preserve」するパターンか、CollectionやArrayListを使う方法があります。データ件数が事前に分かる場合は最初から正確なサイズで宣言するのがベストです。
03 UBOUND LBOUND UBound・LBoundで配列のサイズを取得する 配列の添字の上限・下限を動的に取得してループエラーを防ぐ
配列のサイズ(要素数)を取得するにはUBound関数(上限インデックスを返す)とLBound関数(下限インデックスを返す)を使います。ハードコードした数値ではなくUBound/LBoundを使うことで、配列サイズが変わってもコードを修正する必要がなくなります。
📚 用語解説
UBound・LBound:VBAで配列のインデックスの上限(UBound)と下限(LBound)を返す組み込み関数。「UBound(arr)」は配列arrの最大添字を返す。「LBound(arr)」は最小添字(通常0または1)を返す。要素数はUBound(arr) - LBound(arr) + 1で計算できる。2次元配列では「UBound(arr, 2)」で2次元目の上限を取得できる。
' UBoundを使った安全なループ
Dim scores(4) As Integer
scores(0) = 85: scores(1) = 92: scores(2) = 78: scores(3) = 88: scores(4) = 95
Dim i As Integer
For i = LBound(scores) To UBound(scores)
Debug.Print scores(i)
Next i
' 要素数を計算
Dim count As Integer
count = UBound(scores) - LBound(scores) + 1
MsgBox "要素数: " & count ' 5と表示される
| 関数 | 返す値 | 使用例 | 戻り値の例(Dim arr(4) As Integer) |
|---|---|---|---|
| UBound(arr) | 配列の最大添字(上限) | For i = 0 To UBound(arr) | 4 |
| LBound(arr) | 配列の最小添字(下限) | For i = LBound(arr) To UBound(arr) | 0 |
| UBound(arr) - LBound(arr) + 1 | 配列の要素数 | count = UBound(arr) - LBound(arr) + 1 | 5 |
| UBound(arr, 2) | 2次元配列の2次元目の上限 | 2次元配列のみ | 列数の上限 |
04 ARRAY LOOP For文・For Each文で配列をループ処理する Forループと高速なFor Eachループの使い分けを実例で解説
配列の全要素を処理する場合、For文(インデックスを使う)とFor Each文(各要素を直接参照)の2つのループが使えます。
4-1. For文(インデックスを使うループ)
For文はインデックス変数を使って配列を順番に処理します。インデックスの値を使った計算が必要な場合や、逆順に処理したい場合に適しています。
' For文で配列を順番に処理
Dim fruits(2) As String
fruits(0) = "りんご"
fruits(1) = "みかん"
fruits(2) = "バナナ"
Dim i As Integer
For i = 0 To UBound(fruits)
Cells(i + 1, 1).Value = fruits(i)
Next i
4-2. For Each文(要素を直接参照するループ)
For Each文は配列の各要素を変数として直接参照します。インデックスが不要でコードがシンプルになります。ただし、For Each文では配列要素への代入はできない(読み取り専用の参照になる)点に注意が必要です。
' For Each文で配列の全要素を処理
Dim fruits(2) As String
fruits(0) = "りんご"
fruits(1) = "みかん"
fruits(2) = "バナナ"
Dim item As Variant
Dim output As String
For Each item In fruits
output = output & item & ", "
Next item
MsgBox output ' りんご, みかん, バナナ, と表示
| ループの種類 | インデックス取得 | 逆順処理 | 要素への代入 | 向いているケース |
|---|---|---|---|---|
| For i = 0 To UBound(arr) | ✅ 可能 | ✅ 可能(Step -1) | ✅ 可能 | インデックスが必要・逆順処理・代入が必要 |
| For Each item In arr | ❌ 不要(取得できない) | ❌ 不可能 | ❌ 不可能 | 全要素を読み取るだけのシンプルな処理 |
Dim arr(n) or
動的配列+ReDim
arr(0) = value
またはセルから読込
For i = 0 To UBound(arr)
各要素を処理
セルに書き出し
または別の処理
配列のメモリ解放
大きな配列の場合
05 ARRAY CELLS セルの値を配列に読み込む・配列をセルに書き出す 大量データ処理を高速化する配列⇔セル変換の実践テクニック
VBA配列の最も重要な活用方法がセルの値を一括で配列に読み込んで処理し、結果を一括でセルに書き出すテクニックです。このパターンで大量データ処理が劇的に速くなります。
📚 用語解説
配列の一括読み込み・書き出し:VBAでRange(セル範囲)をVariant型の変数に代入すると、その範囲のデータが2次元配列として格納される。逆に、同じサイズのRange変数に配列を代入することで、全データを一括でセルに書き出せる。個別のCells(i,j)アクセスを繰り返すより何十〜何百倍もの速度差が出ることがある。大量データ処理の必須テクニック。
' セル範囲を配列に一括読み込み
Dim dataArr As Variant
' A1:D1000の範囲を一括読み込み(2次元配列になる)
dataArr = Range("A1:D1000").Value
' 配列の要素数を確認
Dim rowCount As Long
Dim colCount As Long
rowCount = UBound(dataArr, 1) ' 行数(1次元目の上限)
colCount = UBound(dataArr, 2) ' 列数(2次元目の上限)
' 配列をメモリ内で処理(セルアクセスなし=高速)
Dim i As Long
For i = 1 To rowCount
If dataArr(i, 3) < 100 Then ' 3列目が100未満の場合
dataArr(i, 4) = "要確認" ' 4列目にフラグを立てる
End If
Next i
' 処理済み配列をセルに一括書き出し
Range("A1:D1000").Value = dataArr
MsgBox "処理完了"
| 処理方法 | 1万行処理の速度 | 特徴 |
|---|---|---|
| セルを1行ずつ処理(Cells(i,j)) | 遅い(数十秒〜数分) | シンプルだが、大量データには向かない |
| 配列に一括読み込み→処理→一括書き出し | 速い(数秒以内) | 行数が多いほど速度差が大きくなる |
06 ARRAY OPS 配列のコピー・ソート・Filter関数での検索 配列を操作する3つの重要な機能を実例付きで解説
6-1. 配列のコピー
VBAで配列をコピーするにはVariant型変数に代入する方法が最もシンプルです。通常の型の配列の場合は、代入するだけではコピーにならない点に注意が必要です。
' Variant型を使った配列コピー Dim original As Variant original = Array(10, 20, 30, 40, 50) ' Variant型変数に代入してコピー Dim copied As Variant copied = original ' コピーを変更しても元の配列には影響しない copied(0) = 999 MsgBox "元の配列(0): " & original(0) ' 10と表示(変更されていない) MsgBox "コピー配列(0): " & copied(0) ' 999と表示
6-2. Filter関数で配列を絞り込む
Filter関数は文字列型の配列に対してパターンマッチングを行い、一致する要素だけを含む新しい配列を返す関数です。
' Filter関数で配列を絞り込む
Dim names As Variant
names = Array("山田太郎", "鈴木花子", "山田花", "田中一郎", "山本次郎")
' 「山田」を含む名前だけ抽出
Dim filtered As Variant
filtered = Filter(names, "山田")
' 結果を表示
Dim i As Integer
For i = 0 To UBound(filtered)
Debug.Print filtered(i)
Next i
' 出力: 山田太郎、山田花
6-3. Join・Split関数で配列と文字列を変換する
Join関数は配列の全要素を指定した区切り文字で結合した文字列を返します。Split関数は逆に区切り文字で分割した文字列を配列に変換します。CSVデータの処理や、複数の値をまとめて処理したい場合に便利です。
' Join: 配列 → 区切り文字付き文字列
Dim fruits As Variant
fruits = Array("りんご", "みかん", "バナナ")
Dim joined As String
joined = Join(fruits, ", ")
MsgBox joined ' りんご, みかん, バナナ と表示
' Split: 区切り文字付き文字列 → 配列
Dim csv As String
csv = "東京,大阪,名古屋,福岡"
Dim cities As Variant
cities = Split(csv, ",")
MsgBox cities(0) ' 東京 と表示
MsgBox UBound(cities) ' 3と表示(0〜3の4要素)
07 2D ARRAY 2次元配列・多次元配列の使い方 シートのデータを行×列の2次元配列として扱う実践的な方法
VBAの配列は2次元・3次元など多次元の配列を扱えます。特に「2次元配列(行×列)」はExcelシートのデータ構造と対応しており、シートデータを配列に読み込んで処理する際に自然に使われます。
📚 用語解説
2次元配列:VBAで行と列の2方向にインデックスを持つ配列。「Dim arr(9, 3) As Integer」と書くと10行×4列の配列が作られる。Excelのセル範囲をVariant型変数に代入した場合も2次元配列になる(1次元目が行、2次元目が列に対応)。2次元配列の要素は「arr(行インデックス, 列インデックス)」でアクセスする。
' 2次元配列の宣言と初期化
Dim matrix(2, 2) As Integer ' 3行×3列の2次元配列
' 値を代入(行, 列)
matrix(0, 0) = 1
matrix(0, 1) = 2
matrix(0, 2) = 3
matrix(1, 0) = 4
matrix(1, 1) = 5
matrix(1, 2) = 6
matrix(2, 0) = 7
matrix(2, 1) = 8
matrix(2, 2) = 9
' 2重ループで全要素を処理
Dim r As Integer, c As Integer
For r = 0 To 2
For c = 0 To 2
Cells(r + 1, c + 1).Value = matrix(r, c)
Next c
Next r
Range(「A1:D100」).Valueをvariant型変数に代入すると、行×列の2次元配列として格納されます。この時、1次元目(arr(i, ?))が行インデックス、2次元目(arr(?, j))が列インデックスになります。また、セル範囲から読み込んだ配列は添字が「1始まり」になる(0ではなく1から)点に注意が必要です。
Range("A1:D1000")
処理対象を決める
Dim arr As Variant
arr = Range.Value
For r, For c
メモリ内で高速処理
Range.Value = arr
1回のセルアクセス
08 CLAUDE CODE ARRAY Claude CodeでVBA配列コードを自動生成する 複雑な配列処理のVBAコードをAIで生成・デバッグする実践例
配列処理のVBAコードは仕組みを理解してもゼロから書くのに時間がかかります。2026年現在、Claude Codeに配列処理の要件を日本語で説明するだけで、高品質なVBAコードが生成できます。
| あなたの指示 | Claude Codeが生成するもの |
|---|---|
| 「A列〜D列の1〜1000行のデータを配列に読み込んで、C列が100未満の行のD列に"要確認"を入力してシートに書き戻すVBA」 | 一括読込→処理→一括書出のパターンを使った最適なVBAコード |
| 「名前の配列から"山田"を含む要素だけを抽出して別シートのA列に書き出すVBA」 | Filter関数 + 書き出し処理のVBAコード |
| 「以下のVBAコードがエラーになります。原因と修正方法を教えてください(コードを貼り付け)」 | エラーの原因分析と修正済みコード |
| 「この配列処理が遅いです。速くする方法を教えてください(コードを貼り付け)」 | セル一括読込パターンへのリファクタリング提案 |
VBAの配列処理もClaude Codeで自動化できます
「大量データを高速に処理するVBAマクロを作りたい」「配列処理でエラーが起きて解決できない」——こうしたExcel VBAの課題はClaude Codeで解決できます。処理の要件を日本語で説明するだけで、最適な配列処理パターンを使ったVBAコードが生成されます。
まずは無料相談で、Excelでの業務自動化の課題をヒアリングさせてください。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
よくある質問
Q. VBAで配列を宣言する方法を教えてください。
A. 固定長配列は「Dim arr(4) As Integer」のように要素数を宣言時に指定します(この例では0〜4の5要素)。動的配列は「Dim arr() As String」と要素数を空欄にして宣言し、後で「ReDim arr(n)」でサイズを決定します。データを保持したままサイズを変更したい場合は「ReDim Preserve arr(n)」を使います。
Q. VBAのUBound関数の使い方を教えてください。
A. UBound(配列名)で配列の最大添字(上限インデックス)を返します。1次元配列のループは「For i = 0 To UBound(arr)」と書くのが安全です(ハードコードした数値より保守しやすい)。2次元配列の場合は「UBound(arr, 1)」で1次元目の上限(行数-1)、「UBound(arr, 2)」で2次元目の上限(列数-1)が取得できます。
Q. VBAの配列で大量データの処理を高速化するには?
A. 「Range("A1:D1000").Valueをvariant型変数に代入して配列に一括読み込み→メモリ内で処理→同じサイズのRangeに配列を代入して一括書き出し」というパターンが最も効果的です。セルを1行ずつ処理するより何十倍〜何百倍も速くなります。データ件数が多いほど速度差が大きくなります。
Q. VBAのFilter関数の使い方を教えてください。
A. Filter(配列, 検索文字列)は文字列型配列の中から検索文字列を含む要素だけを新しい配列として返します。例:「Filter(names, "山田")」は配列namesの中に"山田"を含む要素だけの新しい配列を返します。第3引数にFalseを指定すると「含まない要素」を取得できます(Filter(names, "山田", False))。
Q. VBAで配列のコピーをする方法は?
A. Variant型変数への代入でコピーできます。「Dim copied As Variant: copied = original」と書くことで、originalの内容がcopiedにコピーされます。Variant型以外の通常の型宣言をした配列の場合は、ループでElement-by-elementにコピーする必要があります。
Q. VBAで2次元配列を宣言する方法を教えてください。
A. 「Dim arr(9, 3) As Integer」のようにカンマで次元を区切って宣言します(この例では10行×4列)。Excelのセル範囲をVariant型変数に代入した場合も自動的に2次元配列になります(1次元目が行、2次元目が列)。セルから読み込んだ配列は添字が1始まりになる点に注意が必要です。
Q. Claude CodeでVBAの配列処理コードを生成できますか?
A. できます。「A列〜D列の1000行データを配列に読み込んで、C列が100未満の行のD列に"要確認"を入れてシートに書き戻すVBAを書いて」のように処理内容を日本語で説明するだけで、配列の一括読み込み・処理・書き出しのパターンを使った最適なVBAコードが生成されます。エラーの原因解明や遅いコードの高速化もClaude Codeに相談できます。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
AI鬼管理/AI社員AIKATAへのお問い合わせ
この記事を読んで気になった方へ。
専門スタッフが、御社に最適な
業務自動化・業務代行プランを無料でご提案します。




