Excel VBAで複数のデータを扱うときに便利なのが、
- 配列(Array)
- Collection
- Dictionary
の3つです。
しかし、それぞれ似ているようで特徴が異なるため、
「どれを使えばいいのか分からない」
「配列とCollectionの違いが曖昧」
「Dictionaryはどんな場面で使うの?」
と迷う方も多いのではないでしょうか。
この記事では、配列・Collection・Dictionaryの特徴や違い、使い分けを、実務で使えるコード例とともに分かりやすく解説します。
結論から言うと、次のように使い分けるのがおすすめです。
- 大量データの高速処理 → 配列
- データを追加・削除しながら管理 → Collection
- 検索・集計・重複判定 → Dictionary
この使い分けを理解すると、VBAの処理速度だけでなく、コードの可読性や保守性も向上します。
1. 配列・Collection・Dictionaryの違い
まずは、それぞれの特徴を比較してみましょう。
| 項目 | 配列 | Collection | Dictionary |
|---|---|---|---|
| 大量データ処理 | ◎ | ○ | ○ |
| データ追加 | △ | ◎ | ◎ |
| データ削除 | △ | ◎ | ◎ |
| Excelとの相性 | ◎ | ○ | ○ |
| キー検索 | × | ○ | ◎ |
| 存在確認 | × | △ | ◎ |
| 集計 | ○ | ○ | ◎ |
| オブジェクト管理 | ○ | ◎ | ◎ |
重要なのは、
「どれが優れているか」ではなく、目的に合ったものを選ぶこと
です。
例えば、Excelの大量データを処理するなら配列が向いています。
一方で、データを自由に追加・削除したい場合はCollection、キーを使って検索や集計を行いたい場合はDictionaryが便利です。
2. 配列とは
配列とは、複数のデータを1つの変数でまとめて管理する仕組みです。
通常の変数では、
Dim name1 As String
Dim name2 As String
Dim name3 As String
のように複数の変数が必要です。
しかし、配列を使えばまとめて管理できます。
Dim names(0 To 2) As String
names(0) = "田中"
names(1) = "佐藤"
names(2) = "鈴木"
配列はループ処理との相性も良く、
Dim i As Long
For i = LBound(names) To UBound(names)
Debug.Print names(i)
Next i
のように、複数のデータをまとめて処理できます。
LBound / UBoundを使う理由
配列をループするときは、LBoundとUBoundを使用するのがおすすめです。
LBound:配列の最小番号UBound:配列の最大番号
配列のサイズが変更されてもコードを修正する必要がないため、汎用性の高いコードになります。
3. 動的配列とReDim
データ数が事前に分からない場合は、動的配列を使用できます。
Dim arr() As String
ReDim arr(1 To 100)
このように、必要なタイミングで配列のサイズを決定できます。
既存のデータを残したままサイズを変更したい場合は、ReDim Preserveを使用します。
ReDim Preserve arr(1 To 200)
ただし、ReDim Preserveを何度も繰り返すと処理速度が低下する可能性があります。
大量データを扱う場合は、あらかじめ必要なサイズを確保するか、Collectionを利用することも検討しましょう。
4. Excel VBAでは多次元配列が便利
Excelの表は、
行 × 列
という2次元構造になっています。
そのため、Excel VBAでは2次元配列が非常に便利です。
例えば、
Dim arr As Variant
arr = Range("A1:D100").Value
と書くだけで、A1からD100までのデータを一括で配列へ読み込めます。
取得したデータは、
arr(1, 1) ' A1の値
arr(1, 2) ' B1の値
のようにアクセスできます。
配列を使うとExcel処理が高速化する
大量データを扱う場合、セルを1つずつ操作すると処理が遅くなります。
そこで、
Excel
↓
配列へ一括読み込み
↓
VBAで処理
↓
Excelへ一括書き込み
という流れがおすすめです。
例えば、
Dim arr As Variant
Dim i As Long
arr = Range("A1:B10000").Value
For i = 1 To UBound(arr, 1)
arr(i, 2) = arr(i, 1) * 2
Next i
Range("A1:B10000").Value = arr
Excelとのアクセス回数を減らすことで、大量データでも効率的に処理できます。
5. Collectionとは
Collectionは、データ数を事前に決めず、柔軟にデータを管理できるオブジェクトです。
Dim col As Collection
Set col = New Collection
col.Add "田中"
col.Add "佐藤"
col.Add "鈴木"
配列との大きな違いは、
最初にデータ数を決める必要がなく、
データを登録した順番に、1から連番のインデックスが振られる
ことです。
そのため、
「条件に一致したデータだけ追加する」
といった処理に向いています。
データを取得する
Collectionのデータは、番号を指定して取得できます。
Debug.Print col(1)
また、すべてのデータを処理する場合はFor Eachが便利です。
Dim item As Variant
For Each item In col
Debug.Print item
Next item
データを削除する
データを削除する場合は、
col.Remove 2
とします。
ループ中に複数のデータを削除する場合は、後ろから処理するのが安全です。
※前から削除すると、削除した時点で後ろの要素の番号が1つずつ繰り上がり、次のデータを飛ばしてしまう可能性があります。
後ろから削除すれば、まだ処理していない前側の要素の番号は変わらないため、安全に削除できます。
For i = col.Count To 1 Step -1
If 条件 Then
col.Remove i
End If
Next i
6. Dictionaryとは
Dictionaryは、
「キー」と「値」
を組み合わせてデータを管理する仕組みです。
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
dic.Add "A001", "田中"
dic.Add "A002", "佐藤"
登録したデータは、キーを指定して取得できます。
Debug.Print dic("A001")
Dictionaryの最大の特徴:Exists
Dictionaryには、キーが存在するか確認できるExistsがあります。
If dic.Exists("A001") Then
MsgBox "登録されています"
End If
そのため、
- 商品コード検索
- 社員番号検索
- マスタ照合
- 重複チェック
といった処理を簡単に実装できます。
7. Dictionaryを使った集計
Dictionaryは、データの集計にも非常に便利です。
例えば、商品ごとの売上を集計する場合は次のように書けます。
Dim arr As Variant
Dim dic As Object
Dim i As Long
Dim key As String
Set dic = CreateObject("Scripting.Dictionary")
arr = Range("A2:B100").Value
For i = 1 To UBound(arr, 1)
key = arr(i, 1)
If dic.Exists(key) Then
dic(key) = dic(key) + arr(i, 2)
Else
dic.Add key, arr(i, 2)
End If
Next i
このようにすることで、商品ごとの売上や部署ごとの人数などを簡単に集計できます。
8. 配列・Collection・Dictionaryの使い分け
ここまでの内容を整理すると、次のように使い分けるのがおすすめです。
配列が向いているケース
- Excel表の大量データ処理
- 数千〜数万行の高速処理
- 行と列の構造を扱う場合
- Excelとのデータのやり取りを減らしたい場合
特に、
arr = Range("A1:D10000").Value
のような使い方は、Excel VBAで非常に便利です。
Collectionが向いているケース
- データ数が事前に分からない
- データを追加・削除したい
- 順番にデータを管理したい
- オブジェクトを複数管理したい
例えば、
- 条件に一致したデータの一覧
- 処理対象のWorksheet一覧
- クラスオブジェクトの管理
などに向いています。
Dictionaryが向いているケース
- キーによる検索
- 重複チェック
- データの集計
- マスタ照合
- キーの存在確認
例えば、
社員番号 → 社員情報
商品コード → 商品名
商品名 → 売上
部署名 → 人数
といった管理に最適です。
9. 実務では組み合わせて使うのがおすすめ
実務では、配列・Collection・Dictionaryのどれか1つだけを使うのではなく、それぞれの特徴を活かして組み合わせるケースも多くあります。
特にExcel VBAでは、次のような流れがおすすめです。
Excel
↓
配列で一括取得
↓
DictionaryやCollectionで処理
↓
配列へまとめる
↓
Excelへ一括出力
例えば、
- Excelから大量データを配列へ読み込む
- Dictionaryで検索や集計を行う
- 必要に応じてCollectionでデータを管理する
- 最後に結果を配列へまとめる
- Excelへ一括で書き込む
という流れです。
このように役割を分けることで、
- 処理速度を向上させやすい
- コードを整理しやすい
- 大量データにも対応しやすい
- 後から修正・拡張しやすい
といったメリットがあります。
10. まとめ
Excel VBAで複数のデータを扱う場合は、配列・Collection・Dictionaryの特徴を理解して使い分けることが重要です。
最後に、それぞれの特徴を簡単にまとめます。
配列
大量のデータを高速に処理したい場合
Collection
データを柔軟に追加・削除しながら管理したい場合
Dictionary
キーによる検索・集計・重複判定を行いたい場合
迷ったときは、
大量データなら配列
可変データならCollection
検索や集計ならDictionary
と覚えておくと分かりやすいでしょう。
特にExcel VBAでは、
Excel
↓
配列で一括取得
↓
Collection / Dictionaryで処理
↓
配列へまとめる
↓
Excelへ一括出力
という流れを意識することで、処理速度だけでなく、コードの可読性や保守性も向上します。
それぞれの特徴を理解し、処理内容に合ったデータ構造を選択して、より効率的なVBAプログラムを作ってみてください。
コメント