【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で簡単に繰り返し処理したい | コレクション、辞書、配列 | 
| 軽量で高速な処理が求められる | 配列 | 
| 二次元以上のデータを扱いたい | 配列 | 
| 外部参照を使いたくない | コレクション、配列 | 
| 要素をキーとペアで管理しつつ順序も保持したい | 辞書 + 補助的に配列やコレクション | 
関連記事リンク
この記事を書いた人
- ソフトデザイン工房|日々の業務にちょうどいい自動化を
 - ■人生を追求する凡人 ■日本一安全で、気の向くままに自分の時間を過ごせる、こだわりのキャンプ場を作るのが夢 ■ソフトデザイン工房運営(個人事業者) - 業務改善アプリケーションをご提供 ■人生は時間そのもの。ひとりでも多くの人が「より良い人生にするために時間を使って欲しい」と願い、仕事のスキルの向上、余暇の充実、資産形成にチャレンジ。
 




