【2026年8月最新】VBA Collectionオブジェクトの使い方完全ガイド|宣言・Add・Item・Remove・存在チェックまで実務コードで解説

【2026年7月最新】VBA Collectionオブジェクトの使い方完全ガイド|宣言・Add・Item・Remove・存在チェックまで実務コードで解説

Excelマクロを組んでいて、「同じ種類のデータを複数まとめて持っておきたいけど、配列だと要素数が変わるたびにReDimするのが面倒…」と感じたことはありませんか。

その悩みを解決してくれるのがCollection(コレクション)オブジェクトです。VBA標準の機能でありながら、配列よりも柔軟にデータをまとめて管理でき、「名前(キー)で要素を呼び出す」という配列にはできない芸当も可能にします。

この記事では、Collectionオブジェクトの宣言・Add・Item・Count・For Each・存在チェック・Removeという一連の操作を、実務でそのまま使えるコード付きで解説します。さらに、似た機能を持つScripting.Dictionaryとの使い分け、そして弊社(株式会社GENAI)の実運用データをもとにした「VBAを書かずに済ませる」という選択肢まで、非エンジニアの方にも分かりやすく整理しました。

AI鬼管理山崎 AI鬼管理山崎
Collectionは「配列とDictionaryの中間」のような存在です。まずは配列との違いを明確にしてから、Add・Item・Removeという基本操作を一つずつ押さえていきましょう。
代表菅澤 代表菅澤
私自身、最初にCollectionを触ったときは「配列でよくない?」と思っていました。でも、キーで要素を呼び出せる便利さと、要素数を気にせずAddし続けられる気楽さを知ってからは、リストを扱う場面で真っ先に候補に挙がるようになりました。

この記事を最後まで読むと、次の7つが明確になります。

✔️Collectionオブジェクトの基本構文(宣言・New・Add・Item・Count)
✔️For Each文でCollectionの全要素を処理する方法
✔️存在チェック(Collectionには専用メソッドがない点への対処)
✔️Removeで要素を削除するときのインデックスのズレという落とし穴
✔️Scripting.Dictionaryとの違いと使い分けの判断基準
✔️弊社GENAIの実運用データから見る「VBA業務」のAI化の現在地
✔️Claude Codeを使えば、VBAの文法を覚えなくても同じ処理を実現できるという選択肢
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理
📌 この記事の結論
【2026年8月最新】VBA Collectionオブジェクトの使い方完全ガイド|宣言・Add・Item・Remove・存在チェックまで実務コードで解説
VBAのCollectionオブジェクトの使い方を、宣言・Add・Item・Remove・For Each・存在チェックまでコード付きで解説。配列やDictionaryとの違い、実務でハマりやすい落とし穴、Claude Codeでの自動化まで整理しました。

01 Collectionオブジェクトとは?配列との違い 「複数のデータをまとめて持つ」ための2つの選択肢を比較する

Collectionオブジェクトは、VBAに標準搭載されているオブジェクトで、複数のデータをひとまとめにして管理するための入れ物です。参照設定なども不要で、いつでもDimとNewの2行で使い始められます。

📚 用語解説

Collectionオブジェクト:複数の値やオブジェクトをひとまとめに格納できるVBA標準のデータ構造。配列と違い、要素数をあらかじめ決める必要がなく、Addで追加、Removeで削除、Itemで取得、Countで件数取得ができる。要素ごとに「キー(名前)」を付けて名前で呼び出すこともできる。

「複数のデータをまとめて扱う」という目的だけを見ると配列(Array)と似ていますが、性質はかなり違います。まずは代表的な違いを表で整理します。

比較項目配列(Array)Collectionオブジェクト
要素数の変更固定長は不可。可変長でもReDim(Preserveで保持)が必要Add / Removeでいつでも自由に増減できる
格納できる型基本は同じ型で統一(Variant型なら混在可)型を問わず混在可能(文字列・数値・オブジェクトを同じCollectionに入れられる)
インデックスの起点既定は0始まり(Option Baseで変更可)常に1始まり
名前(キー)でのアクセス不可Addの際にKeyを指定すれば、Item("キー名")で取得できる
要素数の取得UBound関数で計算(LBoundとの差分に注意が必要)Countプロパティで直接取得できる
存在チェック該当なし(ループで探すしかない)専用メソッドはない(後述する代用パターンが必要)

1-1. Collectionが向いている場面

Collectionは、次のような場面で配列よりも書きやすくなります。

✔️処理する前に要素数が分からない(Addで増やしながら組み立てたい)
✔️要素を名前(キー)で呼び出したい(例:顧客コードで顧客名を引きたい)
✔️種類の違うデータ(文字列とオブジェクトなど)を1つの入れ物にまとめたい
✔️途中で特定の要素だけ削除したい(配列は要素の削除が苦手)
💡 迷ったらこの基準で選ぶ

「要素数が事前に分かっていて、とにかく高速に大量データを処理したい」なら配列。「要素数が読めない・キーで呼び出したい・途中で追加削除したい」ならCollection、というのが実務での基本的な判断基準です。数万行単位の高速処理が必要な場面では、配列に一括読み込みしてから処理するほうが速いケースが多い点も覚えておくと安心です。

代表菅澤 代表菅澤
配列は「サイズの決まった箱」、Collectionは「いくらでも中身を増やせる袋」というイメージを持つと理解しやすいです。袋は名前を付けて中身を取り出せる分、少しだけ処理のオーバーヘッドがある、というトレードオフです。

02 宣言とAddメソッドの基本構文 Dim → New → Addという3ステップを実例で押さえる

Collectionを使うときの基本の流れは、「宣言する(Dim)」→「実体を作る(New)」→「要素を追加する(Add)」の3ステップです。まずは顧客リストを例に、コードを見てみましょう。

VBA
Sub AddCustomers()
    Dim custList As Collection
    Set custList = New Collection

    custList.Add "田中商事", "C001"
    custList.Add "佐藤物産", "C002"
    custList.Add "鈴木工業", "C003"

    MsgBox "登録件数: " & custList.Count   '  3 と表示される
End Sub

Dim custList As Collectionで変数を宣言し、Set custList = New Collectionで実体(インスタンス)を作成します。この「New」を書き忘れると、Addを呼んだ瞬間に実行時エラーになるので注意してください(詳しくは第9章で解説します)。

📚 用語解説

オブジェクト変数とNewキーワード:Collectionのようなオブジェクト型の変数は、Dimで「宣言」しただけでは中身が空(Nothing)の状態です。New(またはCreateObject)で実体を作り、Setでその実体を変数に代入して初めて使えるようになる。「Dim custList As Collection」だけではまだ使えず、「Set custList = New Collection」まで書いて初めて機能する点が、文字列や数値の変数との大きな違い。

2-1. Addメソッドの引数:Item・Key・Before・After

AddメソッドはAdd(Item, Key, Before, After)という4つの引数を持ちます。Itemだけは必須で、残りの3つは省略可能です。

引数役割省略した場合
Item追加する値やオブジェクト(必須)(省略不可)
Key要素に付ける一意の名前(文字列)キーなしの要素になり、インデックスでしか取得できない
Before指定した位置(インデックス or キー)の直前に挿入末尾に追加される
After指定した位置(インデックス or キー)の直後に挿入末尾に追加される
VBA
Sub AddWithPosition()
    Dim custList As Collection
    Set custList = New Collection

    custList.Add "田中商事", "C001"
    custList.Add "佐藤物産", "C002"

    ' "C002"の直前に"山田商会"を挿入する
    custList.Add "山田商会", "C004", Before:="C002"

    Dim c As Variant
    For Each c In custList
        Debug.Print c   '  田中商事 → 山田商会 → 佐藤物産 の順で出力
    Next c
End Sub
⚠️ Keyは文字列限定・重複不可

Addの第2引数Keyには文字列(String)しか指定できません。また、同じKeyを持つ要素を2回Addしようとすると実行時エラー457「このキーは既にこのコレクションの要素と関連付けられています」が発生します。同じ顧客コードで2回登録しようとする、といった業務データではよくあるミスなので、事前の重複チェック(第5章)を組み合わせるのが安全です。

AI鬼管理山崎 AI鬼管理山崎
Before・Afterは同時に指定できません。「途中に挿入したい」場面自体があまり多くないので、実務では基本的に末尾へのAddだけで十分なケースがほとんどです。

03 Item・Countで要素を取得する方法 インデックス指定とキー指定、2通りのアクセス方法を使い分ける

Collectionから値を取り出すにはItemメソッドを使います。Itemには「インデックス(何番目か)」と「キー(登録時に付けた名前)」の2種類の指定方法があります。

VBA
Sub GetCustomer()
    Dim custList As Collection
    Set custList = New Collection
    custList.Add "田中商事", "C001"
    custList.Add "佐藤物産", "C002"

    MsgBox custList.Item(1)       '  田中商事(インデックス指定・1始まり)
    MsgBox custList.Item("C002")  '  佐藤物産(キー指定)
    MsgBox custList(1)            '  田中商事(Itemは既定メンバーなので省略できる)
End Sub

📚 用語解説

既定メンバー(デフォルトプロパティ):オブジェクトの中で「呼び出し名を省略しても呼ばれるメンバー」のこと。CollectionではItemが既定メンバーに設定されているため、「custList.Item(1)」と「custList(1)」はまったく同じ結果になる。コードの可読性を重視する現場では、あえてItemを省略せずに書くスタイルもよく使われる。

要素数を数えたいときはCountプロパティを使います。配列のようにUBoundとLBoundを引き算する必要がなく、そのまま件数が返ってくるのがCollectionの分かりやすい点です。

VBA
Sub ShowCount()
    Dim custList As Collection
    Set custList = New Collection
    custList.Add "田中商事", "C001"
    custList.Add "佐藤物産", "C002"
    custList.Add "鈴木工業", "C003"

    MsgBox "登録件数: " & custList.Count   '  3
End Sub
✔️Item(数値) ── 1番目から数えたインデックスで取得(配列と違い1始まり)
✔️Item("キー名") ── Add時に付けたキーで取得
✔️Count ── 現在の要素数をそのまま取得(UBound-LBound+1のような計算は不要)
✔️Itemは既定メンバーなのでcustList(1)のように省略して書ける
代表菅澤 代表菅澤
Countプロパティは地味に見えて便利です。配列だとUBoundを使って「配列の最後の添字」しか取れず、要素数を出すにはLBoundとの引き算が必要になりますが、Collectionなら.Countと書くだけで済みます。
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

04 For Each文でCollectionをループ処理する 登録した順番に全要素を処理する、もっとも実務で使う書き方

Collectionの全要素を順番に処理したいときはFor Each文を使うのが定番です。インデックスを意識せずに書けるので、配列よりもシンプルなコードになります。

VBA
Sub ListAllCustomers()
    Dim custList As Collection
    Dim c As Variant
    Set custList = New Collection
    custList.Add "田中商事", "C001"
    custList.Add "佐藤物産", "C002"
    custList.Add "鈴木工業", "C003"

    For Each c In custList
        Debug.Print c
    Next c
    '  出力順: 田中商事 → 佐藤物産 → 鈴木工業(Addした順)
End Sub

For Each文はAddした順番で要素を取り出します。Collectionは常に1始まりのインデックスを内部で保持しているため、順序が入れ替わることはありません(Before/Afterで挿入位置を指定した場合はその位置が反映されます)。

Step 1
宣言
Dim col As Collection
Step 2
初期化
Set col = New Collection
Step 3
追加
col.Add 値, キー
Step 4
取得・処理
Item / For Each
Step 5
削除
col.Remove

この「宣言→初期化→追加→取得・処理→削除」という5ステップが、Collectionを使うマクロの基本骨格になります。まずはこの流れを型として覚えてしまうと、応用が効きやすくなります。

💡 For Each中は要素を書き換えられない点に注意

For Each文で取り出した変数(上の例ではc)に値を代入しても、元のCollectionの中身は変わりません。Collectionの中身自体を書き換えたい場合は、いったんRemoveしてから新しい値でAddし直す必要があります。

AI鬼管理山崎 AI鬼管理山崎
「順番通りに全部処理したいだけ」ならFor Each、「何番目の要素かを使って何か処理したい」「逆順に処理したい」場合はFor i = 1 To col.Countのように書く、という使い分けを意識すると迷いません。

05 要素の存在チェックをする方法 Collectionには「Exists」がない。On Error Resume Nextで代用する

ここがCollectionを使う上で最初につまずきやすいポイントです。Collectionには「このキーは存在するか」を判定する専用メソッドがありません。後述するScripting.DictionaryにはExistsメソッドがあるため混同しがちですが、Collectionでは別の方法で代用する必要があります。

📚 用語解説

On Error Resume Next:VBAのエラー処理構文の1つ。この行以降、エラーが発生してもプログラムを止めずに次の行へ処理を進める。エラーの有無は「Err.Number」(エラーが起きていなければ0)で判定できる。エラーを握りつぶして無視するために使うと不具合の温床になるため、「意図的にエラーを検知したい1行だけ」に限定して使うのが安全な作法。

存在しないキーをItemで指定すると実行時エラー5「プロシージャの呼び出しまたは引数が不正です」が発生します。このエラーを逆手にとって、「エラーが起きなければ存在する、起きれば存在しない」と判定するのが定番の代用パターンです。

VBA
Function KeyExists(col As Collection, ByVal key As String) As Boolean
    Dim tmp As Variant
    On Error Resume Next
    Err.Clear
    tmp = col.Item(key)
    On Error GoTo 0
    KeyExists = (Err.Number = 0)
End Function

Sub CheckExample()
    Dim custList As Collection
    Set custList = New Collection
    custList.Add "田中商事", "C001"

    MsgBox KeyExists(custList, "C001")   '  True
    MsgBox KeyExists(custList, "C999")   '  False
End Sub
⚠️ Err.Clearを忘れると誤判定する

On Error Resume Nextを書いた直後にErr.Clearを呼ばずにItemを実行すると、直前の別の処理で起きた古いエラー番号が残っていて、実際には存在するキーなのに「存在しない」と誤判定することがあります。存在チェックの関数は必ずErr.Clear→実行→判定、の順番で書いてください。

✔️存在しないキーをItemで取得すると実行時エラー5が発生する
✔️On Error Resume Next + Err.Clearで意図的にエラーを検知する
✔️チェック後はOn Error GoTo 0で通常のエラー処理に戻す
✔️存在チェックを多用するなら、後述するScripting.Dictionary(Existsメソッド)の採用も検討する
代表菅澤 代表菅澤
「存在しないかもしれないキーをいきなりItemで取りに行く」設計は事故のもとです。追加前の重複チェック、削除前の存在チェックなど、KeyExistsのような自作関数を1つ用意しておくと、Collectionまわりのバグがかなり減ります。

06 Removeで要素を削除する(インデックスのズレに注意) 削除後は後ろの要素のインデックスが1つずつ詰まる

要素を削除するにはRemoveメソッドを使います。Itemと同じく、インデックス指定・キー指定の両方に対応しています。

VBA
Sub RemoveCustomer()
    Dim custList As Collection
    Set custList = New Collection
    custList.Add "田中商事", "C001"
    custList.Add "佐藤物産", "C002"
    custList.Add "鈴木工業", "C003"

    custList.Remove "C002"          ' キー指定で削除

    MsgBox custList.Count           '  2
    MsgBox custList.Item(2)         '  鈴木工業(削除後にインデックスが1つ詰まる)
End Sub

削除前は「田中商事(1)・佐藤物産(2)・鈴木工業(3)」という並びでしたが、佐藤物産(キーC002)を削除すると、鈴木工業のインデックスは3から2に繰り上がります。これがCollectionの落とし穴で、ループしながら削除する処理を書くと、意図せず要素を読み飛ばすバグを生みやすい部分です。

⚠️ For文でループしながらRemoveすると要素が飛ぶ

「For i = 1 To col.Count」で回しながらcol.Remove(i)を呼ぶと、削除のたびに後続の要素のインデックスが詰まり、次のiで本来処理すべき要素をスキップしてしまいます。安全に書くには後ろのインデックスから逆順に削除する(For i = col.Count To 1 Step -1)か、削除対象のキーを別のCollectionや配列にいったん貯めてから、最後にまとめて削除する方法をおすすめします。

VBA
' 安全な書き方:逆順に削除する
Sub RemoveOldRecords()
    Dim custList As Collection
    Dim i As Long
    Set custList = New Collection
    custList.Add "田中商事", "C001"
    custList.Add "(退会)佐藤物産", "C002"
    custList.Add "(退会)鈴木工業", "C003"

    For i = custList.Count To 1 Step -1
        If InStr(custList.Item(i), "(退会)") > 0 Then
            custList.Remove i
        End If
    Next i

    MsgBox custList.Count   '  1(田中商事だけが残る)
End Sub
AI鬼管理山崎 AI鬼管理山崎
ループ中の削除で要素が飛ぶバグは、VBAに限らずどの言語でもよく起きる典型的なミスです。「削除は逆順で」というルールを型として覚えてしまえば防げます。
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

07 【独自】CollectionとDictionaryの使い分け 「名前で呼び出したい」が本格化したらDictionaryも検討する

ここからは競合記事にはない独自の切り口として、Collectionとよく比較されるScripting.Dictionary(連想配列)との使い分けを整理します。「存在チェックができない」という第5章の弱点は、実はDictionaryなら標準機能で解決できます。

📚 用語解説

Scripting.Dictionary:Microsoft Scripting Runtimeが提供する連想配列(キーと値のペアを管理するオブジェクト)。CreateObject("Scripting.Dictionary")で参照設定なしに使える(遅延バインディング)。Existsメソッドで存在チェックができる、Keysメソッドで全キーを一括取得できるなど、Collectionにない機能を多く備えるが、VBA標準機能ではなく外部ライブラリ(Windows標準搭載のscrrun.dll)に依存する点がCollectionとの違い。

📚 用語解説

ハッシュテーブル:キーから値を高速に探し出すためのデータ構造。Dictionaryの内部実装に使われているとされ、データ件数が増えてもキー検索の速度が大きく落ちにくいという特性を持つ。Collectionはこの仕組みを持たないため、キーで探す処理を大量に繰り返す場面ではDictionaryの方が有利になりやすい。

比較項目CollectionScripting.Dictionary
参照設定・生成方法VBA標準機能、参照設定不要CreateObject("Scripting.Dictionary")の遅延バインディングか、「Microsoft Scripting Runtime」の参照設定が必要
存在チェック標準メソッドなし(On Error等で代用が必要)Existsメソッドで一発判定できる
キーの型文字列のみ数値・文字列など柔軟に指定できる
キーの変更不可(削除して再Addするしかない).Key(旧キー) = 新キー で変更できる
全キーの一括取得ループで1件ずつ確認するしかないKeysメソッドで配列として一括取得できる
インデックス指定でのアクセスItem(数値)で可能原則不可(キー指定が基本)

7-1. どちらを選ぶべきか:3つの判断軸

✔️存在チェックを多用するならDictionary(Existsメソッドが強力)
✔️インデックス(何番目か)でもアクセスしたいならCollection(Dictionaryは基本キーのみ)
✔️他の担当者に読みやすさを優先したいならCollection(VBA標準機能で、参照設定の説明が不要)
💡 迷ったら「まずCollectionで書き、存在チェックが増えてきたらDictionaryに切り替える」

最初の設計段階で完璧に選び分ける必要はありません。実務では「Collectionで書き始めたが、If文での存在チェックがどんどん増えてコードが読みにくくなってきた」タイミングでDictionaryに書き換える、という進め方が現実的です。

代表菅澤 代表菅澤
個人的な感覚では、「単純にリストを持ちたいだけ」ならCollection、「キーで頻繁に検索する集計処理」ならDictionary、という住み分けをしています。どちらが正解というより、処理の中心が「順番に処理」なのか「検索」なのかで決めるとブレません。

08 【独自】GENAI実運用データで見るVBA業務のAI化 VBAで自動化するか、Claude Codeにそもそも任せるか

ここまでCollectionオブジェクトの文法を細かく解説してきましたが、視点を少し引いて考えてみます。VBAマクロを組むこと自体、すでに「業務効率化」の一種です。では、その効率化をさらに一段引き上げる手段はあるのでしょうか。

弊社(株式会社GENAI)では、Claude Max 20xプラン(月額$200・約30,000円)を契約し、経営・営業・広告・開発・経理・秘書業務まで全社的にClaude Codeを活用しています。VBAコードの作成・修正はもちろん、そもそもExcelマクロを介さずに業務を自動化できるケースも増えています。

業務領域主な用途削減時間(概算・肌感ベース)
営業提案書・見積・顧客別資料の自動生成週20h → 週2h
広告運用週次レポート・CPA分析・配信内容調整週10h → 週1h
経理請求書チェック・経費仕訳・Freee連携月40h → 月5h
秘書業務日報生成・議事録・スケジュール調整日2h → 日15分
開発Excel VBAマクロ・スクリプトの書き捨て生成都度数時間削減
⚠️ 数値の注意書き

上記は弊社の肌感ベースの数値であり、業種・業態・担当者のスキルによって削減時間は変動します。「Claude Codeを業務に組み込むとどの程度まで使い倒せるか」の参考情報としてご覧ください。

注目したいのは「開発」領域です。Collectionを使ったVBAマクロのような、要素の追加・削除・存在チェックを組み合わせる処理は、条件が複雑になるほど手で書く時間がかかります。この記事の第5章・第6章で扱った「存在チェックの代用パターン」「削除時のインデックスのズレ」のような落とし穴も、Claude Codeに要件を伝えれば、あらかじめ対策済みのコードとして生成されます。

課題を洗い出す
「顧客リストを重複なく
管理したい」など
Claude Codeに
自然言語で指示

「VBAで書いて」と
話しかけるだけ
コードをレビュー
して実行

生成されたマクロを
試しに動かす
効果検証・
横展開

問題なければ
他業務にも適用

この4ステップを回すことで、VBAの文法を1行1行暗記していなくても、「何をしたいか」を言葉で伝えるだけで実務レベルのマクロが手に入ります。もちろん、生成されたコードをそのまま鵜呑みにせず、動作確認とレビューを挟むことは必須です。

AI鬼管理山崎 AI鬼管理山崎
Collectionのような「型」の話は理解しておいて損はありませんが、業務で成果を出す上で本当に必要なのは「正しいコードを書けること」よりも「正しい要件をAIに伝えられること」だと感じています。VBAの文法に時間を使うより、Claude Codeへの指示の出し方に時間を使うほうが、費用対効果が高い時代になってきました。
代表菅澤 代表菅澤
弊社では新しいマクロが必要になったとき、まずClaude Codeに要件を投げて、生成されたコードをレビューする、という流れがすでに標準になっています。VBAが書ける・書けないに関係なく、経営者自身が「業務の自動化案」を思いついた瞬間に試せるのが一番の価値だと感じています。

09 よくあるエラーと対処法5選 Collectionを使う中で実際によく遭遇するつまずきポイント

最後に、Collectionを使う中で実際によく遭遇するエラーと、そのつまずきポイントを一覧で整理します。エラー番号を知っておくと、次に同じエラーに遭遇したときの原因特定が速くなります。

エラー番号エラー内容典型的な原因対処法
実行時エラー91オブジェクト変数With ブロック変数が設定されていませんDim col As Collectionの後にSet col = New Collectionを書き忘れているNewで必ず初期化してから使う。宣言と初期化はセットで書く習慣をつける
実行時エラー457このキーは既にこのコレクションの要素と関連付けられています同じKeyでAddを2回呼んでいる(Keyは一意である必要がある)第5章のKeyExists関数などでAdd前に重複チェックを行う
実行時エラー438オブジェクトはこのプロパティまたはメソッドをサポートしていませんcol.Exists()のように、Dictionary専用のメソッドをCollectionに対して呼んでいる存在チェックが必要ならOn Error Resume Nextで代用するか、最初からScripting.Dictionaryを使う
実行時エラー5プロシージャの呼び出しまたは引数が不正です存在しないキーや範囲外のインデックスをItemで指定している事前に存在チェックを行うか、On Error Resume Nextでエラーを捕捉する
VBA
' 実行時エラー91の例(New忘れ)
Sub ObjectNotSetExample()
    Dim col As Collection
    col.Add "サンプル"   ' ← 実行時エラー91が発生する(Set col = New Collectionがない)
End Sub

5つ目の「エラー」は、正確には実行時エラーではなくロジックバグです。第6章で解説した、ループしながらRemoveすると要素の読み飛ばしが起きる問題です。エラーメッセージが出ないぶん発見が遅れやすく、実務では最も見つけにくい不具合の1つと言えます。

✔️実行時エラー91:New忘れ。宣言と初期化を必ずセットで書く
✔️実行時エラー457:キー重複。Add前に存在チェックを行う
✔️実行時エラー438:CollectionにないDictionary専用メソッドの呼び出し
✔️実行時エラー5:存在しないキー・範囲外インデックスの指定
✔️ロジックバグ:ループ中のRemoveによる要素の読み飛ばし(逆順削除で回避)
代表菅澤 代表菅澤
この5つは、Collectionを使うマクロで実際に何度も踏んだ経験のあるパターンです。特に91番と457番は初心者が最初にぶつかりやすいので、覚えておくだけでデバッグ時間がかなり短縮されます。
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

10 まとめ ── Collectionを使いこなす・使わずに済ませる VBAの文法を覚える道と、AIに任せる道の両方を知っておく

この記事では、VBA Collectionオブジェクトの基本構文から、配列・Dictionaryとの違い、実務で踏みやすいエラーまでを整理しました。最後にポイントを振り返ります。

✔️Collectionは要素数を気にせず追加・削除できる柔軟なデータ構造で、配列とは使いどころが異なる
✔️Add(Item, Key, Before, After)のKeyは文字列限定・重複不可(重複時は実行時エラー457)
✔️Item・Countで取得、For Eachでループ、いずれも1始まりのインデックスで動作する
✔️Collectionには存在チェック専用メソッドがないため、On Error Resume Next + Err.Clearで代用する
✔️Removeで削除すると後続要素のインデックスが詰まるため、ループ削除は逆順が鉄則
✔️存在チェックを多用するならScripting.Dictionaryへの切り替えも検討する
✔️弊社GENAIではClaude Codeを全社導入し、VBAコード生成そのものをAIに任せる選択肢も併用している

Collectionオブジェクトは、覚えてしまえば非常に扱いやすいVBAの武器です。一方で、この記事で紹介した「存在チェックの代用」「削除時のインデックスのズレ」のような細かい落とし穴は、VBA初学者が独力でハマりやすいポイントでもあります。

文法を1つずつ覚えて自分で書けるようになる道もあれば、要件を言葉で伝えてAIにコードを生成させる道もあります。どちらが正しいということはなく、状況に応じて使い分けるのが現実的です。

AI鬼管理山崎 AI鬼管理山崎
VBAの文法は「読めれば十分」で、「書く」部分はClaude Codeに任せる、という分業も現実的な選択肢です。生成されたコードをレビューできる程度の知識があれば、開発スピードは大きく変わります。

VBAマクロの作成・改修も、Claude Codeで自動化できます

「Collectionを使った顧客リスト管理マクロを作りたい」「既存のVBAコードでエラーが出て解決できない」——こうしたExcel VBAの課題は、Claude Codeに要件を日本語で伝えるだけで解決できます。

まずは無料相談で、貴社のExcel業務のどこにAIを組み込めるか、具体的にお答えします。

NEXT STEP

この記事の内容を、あなたのビジネスで
実践してみませんか?

AI鬼管理 — Claude Code導入支援トレーニング

AI活用を自社で回せるようになりたい方へ

AI鬼管理

Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。

AIBPO by AI鬼管理 — 定型業務の丸ごと代行

業務を丸ごと任せたい方へ

AIBPO by AI鬼管理

請求処理・データ入力・問い合わせ対応などの定型業務を、AI×人の品質管理体制で丸ごと代行。いまのコストの75%目安で、日々は成果物を承認するだけ。

よくある質問

Q. VBAのCollectionと配列(Array)、結局どちらを使えばいいですか?

A. 要素数が事前に分かっていて大量データを高速処理したいなら配列、要素数が読めない・キーで呼び出したい・途中で追加削除したいならCollectionが向いています。数万行規模のセル処理は配列に一括読み込みしてから処理する方が速いケースが多く、少量のリストを柔軟に管理したい場合はCollectionが書きやすい、というのが実務での基本的な使い分けです。

Q. Collectionで要素の存在チェックをする一番簡単な方法は?

A. CollectionにはExistsのような専用メソッドがないため、On Error Resume Next + Err.Clearを使い、存在しないキーをItemで取得したときに発生する実行時エラー5を検知する方法が定番です。記事内で紹介したKeyExists関数のように、汎用の判定関数を1つ用意しておくと、Add前の重複チェックや削除前の存在確認に使い回せます。

Q. Collectionのキーは数値でも指定できますか?

A. できません。Addメソッドの第2引数Keyには文字列(String型)しか指定できない仕様です。数値をキーにしたい場合は「CStr(番号)」のように文字列へ変換してから渡す必要があります。数値のままキーに指定しようとするとコンパイルエラーまたは実行時エラーになるため注意してください。

Q. Removeで要素を削除した後、インデックス番号はどうなりますか?

A. 削除した要素より後ろにあった要素は、インデックスが1つずつ繰り上がります。例えば3件のうち2番目を削除すると、元3番目だった要素が2番目になります。ループしながらRemoveする処理を書く場合、この繰り上がりによって要素を読み飛ばすバグが起きやすいため、後ろのインデックスから逆順に削除するのが安全です。

Q. Scripting.Dictionaryを使うには参照設定が必要ですか?

A. 必須ではありません。「CreateObject("Scripting.Dictionary")」と書けば、参照設定なし(遅延バインディング)でも利用できます。コード補完(入力候補)を効かせたい場合は「Microsoft Scripting Runtime」への参照設定(早期バインディング)を行う方法もありますが、他の担当者のPCで参照設定が外れていると動かなくなるリスクがあるため、配布するマクロでは遅延バインディングを使うケースが多いです。

Q. For Each文でCollectionをループ処理しながら要素を削除しても安全ですか?

A. 安全ではありません。For Each中に要素を削除すると、内部のインデックスがずれて意図しない要素がスキップされることがあります。安全に削除したい場合は、For Each ではなく「For i = col.Count To 1 Step -1」のように、後ろから前へ向かってインデックスでループしながらRemoveする書き方に変更してください。

Q. VBAが苦手でも、Collectionを使うような処理を自動化できますか?

A. できます。Claude CodeのようなAIエージェントに「顧客コードをキーにして重複なく登録・検索できるリストをVBAで作って」のように要件を日本語で伝えるだけで、Collection(またはDictionary)を使った実務レベルのコードが生成されます。弊社GENAIでもClaude Max 20xプラン(月額約30,000円)を契約し、VBAコードの生成やデバッグに日常的に活用しています。文法を覚える前に、まず生成されたコードを動かしてみるという学び方も有効です。

AIAI鬼管理

AI鬼管理へのお問い合わせ

この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。

会社名を入力してください
業種を選択してください
お名前を入力してください
※法人・事業用のメールアドレスでお願いします(Gmail等の個人用フリーメールは受付できません)
正しいメールアドレスを入力してください

1つ以上選択してください
1つ以上選択してください
月額コストを選択してください

約1時間のオンライン面談(Google Meet)です

空き枠を取得中...
面談日時を選択してください

予約確定後、Google Calendarの招待メールをお届けします。
しつこい営業は一切ございません。

監修 最終更新日: 2026年8月8日
菅澤孝平
菅澤 孝平 株式会社GENAI 代表取締役
  • AI業務自動化サービス「AI鬼管理」を運営 — Claude Code を活用し、経営者の業務を「AIエージェントに任せる仕組み」へ転換するパーソナルトレーニングを 伴走構築 で提供。日報・採用・問い合わせ対応・経費精算・議事録・データ集計・営業リスト等の定型業務を、AIに代行させる体制を経営者と一緒に作り込む
  • Claude Code 実装ノウハウを 経営者・法人クライアント に直接指導。生成AIを「便利ツール」ではなく 「業務を任せる存在」 として運用する手法を体系化
  • 「やらせ切る管理」メソッドの開発者。シンゲキ株式会社(2021年設立・鬼管理専門塾運営)にて累計3,000名以上の学習者を志望校合格に導いた管理メソッドを、AI × 経営者支援 に転用
  • 著書『3カ月で志望大学に合格できる鬼管理』(幻冬舎)、『親の過干渉こそ、最強の大学受験対策である。』(講談社)
  • メディア出演: REAL VALUE / カンニング竹山のイチバン研究所 / ええじゃないかBiz 他
  • 明治大学政治経済学部卒
現在は AI鬼管理(Claude Code活用の伴走型パーソナルトレーニング)を主事業とし、経営者と二人三脚で「AIに業務を任せる仕組み」を実装。「実行を強制する環境」を AI で構築する手法を、自社の実運用知見をもとに発信している。