【VBA関係】VBAの「コレクション」、「配列」、「辞書」は何がちがう?|ポテの学習メモ #005
アフィリエイト広告を利用しています。

VBAには、複数のデータを扱うデータ構造に「コレクション」「配列」「辞書」がある。似ているが、それぞれにちょっと違う。
それぞれのデータ構造の違い
コレクション
VBAの標準のデータ構造で、複数の要素を保持可能。サイズ変更が自由にでき(動的に追加・削除可能)、順序を保持することができる。キーを指定することで、要素に名前を付けることも出来る。
主な用途
- 小規模なデータ管理
利点
- 手軽に使える
- For Each ステートメントで繰り返し処理が可能
- 要素に名前(キー)を付けて管理できる
欠点
- キーの存在確認ができない
- パフォーマンス的に大量データには向かない
- キーや要素の一括取得が難しい
配列
同じ型の複数のデータを格納するVBA標準のデータ構造。宣言時にサイズを固定する静的配列と、後からサイズを変更する動的配列がある。
主な用途
- 大量のデータを一時的に格納
- シンプルなインデックス操作でのデータの管理
利点
- 高速でメモリ効率が良い(データのアクセス速度が速い)
- 大量のデータの処理に適している(速い)
欠点
- サイズ変更にちょっと手間がかかる(Redim、Redim Preserve)
- キーではなく、インデックスでしたアクセスできない
- For Each が使いづらい(Variant型の動的配列でしか使えない)
辞書
Microsoft Scripting Runtime ライブラリを参照設定が必要。キーと値のペアでデータを管理する。動的にサイズを変更可能。
主な用途
- キーを使って高速にデータを検索・管理できる
- 大量のデータを扱う場合や、キーの存在確認が実用な場合の処理
利点
- キーの存在確認が可能(
Exists
メソッド) - すべてのキーや値を一括取得できる(
Dictionary.Keys
、Dictionary.Items
) - 大量のデータ処理に適している(速い)
欠点
- 外部ライブラリの参照設定がちょっと手間(初回だけだけどね)
- 順序が保証されない(データ追加順に並ばない)
- VBA標準ではないため環境によっては利用が制限される(たとえばMac版Excelでは使えない)
比較表
特徴 | コレクション | 配列 | 辞書 |
---|---|---|---|
サイズ変更 | 自由 | できるがちょっと手間 | 自由 |
データアクセス | インデックス、キー | インデックス | キー |
順序保持 | 追加順を保持 | 追加順を保持 | 保持しない(保証されない) |
キーの存在確認 | 不可 | 不可 | 可能(Exists メソッド) |
繰り返し処理(For Each) | 可能 | Variant型動的配列で可能 | 可能 |
メモリ効率 | 普通 | 高い | 高い |
参照設定の必要性 | 不要 | 不要 | 必要(Scripting Runtime) |
大量データの管理 | 不向き | 向いている | 向いている |
使い分けの例
シナリオ | 推奨データ構造 |
---|---|
要素の順序を保持しながら管理したい | コレクション、配列 |
動的なサイズ変更が必要 | コレクション、辞書、配列 |
固定サイズまたは大量データを効率的に処理したい | 配列 |
キーでデータを検索・操作したい | 辞書 |
キーの存在確認が必要 | 辞書 |
全てのキーや値を一括取得したい | 辞書 |
For Eachで簡単に繰り返し処理したい | コレクション、辞書、配列 |
軽量で高速な処理が求められる | 配列 |
二次元以上のデータを扱いたい | 配列 |
外部参照を使いたくない | コレクション、配列 |
要素をキーとペアで管理しつつ順序も保持したい | 辞書 + 補助的に配列やコレクション |