【2026年7月最新】VBA Dictionaryオブジェクト完全ガイド|連想配列の使い方・活用パターン・Claude Code活用

【2026年7月最新】VBA Dictionaryオブジェクト完全ガイド|連想配列の使い方・活用パターン・Claude Code活用

VBAで「特定のキーに対応する値を素早く検索したい」「データの重複を除去したい」「カテゴリ別に集計したい」という処理を書くとき、通常の配列やCollectionよりも遥かに効率的に書けるのがDictionaryオブジェクトです。

DictionaryはKey(キー)とItem(値)のペアでデータを管理する連想配列で、キーによる高速な検索・追加・削除が可能です。この記事では、VBA Dictionaryの基本から全メソッドの使い方・実務での活用パターン・よくある落とし穴・Claude Codeでの自動コード生成まで解説します。

代表菅澤 代表菅澤
Dictionaryはエクセルの「VLOOKUP的な処理」をVBAで高速に実装したいときに真価を発揮します。大量データの集計・重複除去・マスタデータとの照合など、「キーと値のペア」で管理したいデータが来たらDictionaryの出番です。
✔️DictionaryがCollection・配列と何が違うか
✔️Add・Exists・Remove・Keys・Items・Count・Clear全メソッドの使い方
✔️Existsで存在確認してから操作するエラー防止パターン
✔️Keys()・Items()で全要素をループ処理する方法
✔️カウント集計・重複除去・逆引き検索の実務活用パターン
✔️ネストDictionaryで2次元データを扱う方法
✔️エラー「キーが既に存在します」の原因と防止策
✔️Claude CodeでDictionary処理を含むVBAコードを自動生成する方法
📌 この記事の結論
【2026年7月最新】VBA Dictionaryオブジェクト完全ガイド|連想配列の使い方・活用パターン・Claude Code活用
VBAのDictionaryオブジェクト(連想配列)を完全解説。基本的な使い方から、Add/Exists/Remove/Keys/Itemsの全メソッド、集計処理・重複除去・逆引き検索・ネストDictionary・Claude Codeでの自動コード生成まで、実務コード付きで網羅。

01 Dictionaryとは何か|配列との違い 連想配列の概念と配列・Collectionとの使い分け

VBAのDictionaryはMicrosoft Scripting Runtimeが提供する連想配列オブジェクトです。通常の配列が「番号(インデックス)」でデータを管理するのに対し、Dictionaryは「名前(キー)」でデータを管理します。これにより「社員コード→名前」「商品コード→価格」のようなキーと値の関連を直接保持できます。

📚 用語解説

連想配列(Associative Array):キーと値のペアでデータを管理するデータ構造。通常の配列がインデックス(0, 1, 2...)でアクセスするのに対し、連想配列はキー(文字列や数値)でアクセスできる。キーによる検索がO(1)(一定時間)で完了するため、大量データの中から特定のキーを持つ値を検索する処理が高速。VBAではDictionaryオブジェクトが連想配列に相当する。PythonではDict、JavaScriptではObject/Map、JavaではHashMapに相当する。

比較軸配列(Array)CollectionDictionary
アクセス方法インデックス番号インデックスまたはキーキー(文字列/数値)
キーの存在確認なし(自分で実装)なし(エラーで確認)Exists()メソッドあり
削除難しいRemove()可能Remove()可能
重複キー制限なしキーは一意キーは一意
検索速度遅い(線形探索)普通高速(ハッシュ探索)
使い分け順序が必要な単純データ追加・削除が多い場合キーでの高速検索・集計

02 Dictionaryの宣言・作成・基本操作 CreateObjectとMicrosoft Scripting Runtimeの参照設定の2通り

DictionaryはVBA標準機能ではなく、外部ライブラリ(Microsoft Scripting Runtime)のオブジェクトです。使い方は2通りあります。

💡 参照設定なしのCreateObject方式が推奨

参照設定(Tools → References → Microsoft Scripting Runtime)を追加するとEarlyBinding(早期バインディング)になりコード補完が効きますが、他PCで実行すると参照が切れることがあります。CreateObject("Scripting.Dictionary")でLateBinding(遅延バインディング)にするとマクロを別PCに配布しても動きます。本番用マクロはCreateObject方式が安全です。

' 方法1: CreateObject(遅延バインディング・参照設定不要・配布向き)
Sub DictionaryBasicLate()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    ' データを追加
    dict.Add "東京", 1393
    dict.Add "大阪", 884
    dict.Add "名古屋", 231

    ' キーで値を取得
    Debug.Print dict("東京")   ' → 1393
    Debug.Print dict.Item("大阪")  ' → 884

    ' 要素数を確認
    Debug.Print "件数: " & dict.Count   ' → 3
End Sub

' 方法2: 参照設定あり(早期バインディング・コード補完が効く)
' ※ Tools → References → Microsoft Scripting Runtime をチェックする必要あり
Sub DictionaryBasicEarly()
    Dim dict As Scripting.Dictionary
    Set dict = New Scripting.Dictionary

    dict.Add "Key1", "Value1"
    Debug.Print dict("Key1")  ' → Value1
End Sub
' Dictionaryの基本操作まとめ
Sub DictionaryAllBasicOps()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    ' 1. 追加(Add)
    dict.Add "A001", "田中太郎"
    dict.Add "A002", "山田花子"
    dict.Add "A003", "佐藤次郎"

    ' 2. 値の取得
    Dim name As String
    name = dict("A001")        ' → "田中太郎"
    name = dict.Item("A002")   ' → "山田花子"(Itemプロパティ経由)

    ' 3. 値の更新(Itemに代入)
    dict("A001") = "田中一郎"  ' Addではなく代入で上書き

    ' 4. 削除(Remove)
    dict.Remove "A003"
    Debug.Print dict.Count  ' → 2

    ' 5. 全削除(RemoveAll)
    dict.RemoveAll
    Debug.Print dict.Count  ' → 0

    Set dict = Nothing  ' オブジェクトを解放
End Sub
AI鬼管理山崎 AI鬼管理山崎
dict("A001") = "田中一郎"のように代入で上書きできますが、これはキーが存在しない場合は自動追加になります。意図しない追加を防ぐため、更新前にExists()でキーの存在確認をする習慣をつけると安全です。

03 全メソッド・プロパティ一覧と使い方 Add/Remove/RemoveAll/Exists/Keys/Items/Count/CompareMode

Dictionaryオブジェクトのすべてのメソッドとプロパティをまとめます。

名前種類説明使い方例
Addメソッドキーと値のペアを追加dict.Add "key", "value"
Removeメソッド指定キーを削除dict.Remove "key"
RemoveAllメソッドすべてのキーを削除dict.RemoveAll
Existsメソッドキーが存在すればTruedict.Exists("key")
Keysメソッド全キーの配列を返すdict.Keys()
Itemsメソッド全値の配列を返すdict.Items()
Countプロパティ要素数を返すdict.Count
CompareModeプロパティキーの大文字小文字区別dict.CompareMode = vbTextCompare
' CompareMode(大文字小文字の区別)
' ※ Addする前に設定する必要あり
Sub CompareModeExample()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    ' vbTextCompare: 大文字小文字を無視("abc"と"ABC"を同一キーとして扱う)
    dict.CompareMode = 1  ' vbTextCompare = 1

    dict.Add "apple", "リンゴ"

    Debug.Print dict.Exists("apple")  ' → True
    Debug.Print dict.Exists("APPLE")  ' → True(大文字小文字無視)
    Debug.Print dict.Exists("Apple")  ' → True(大文字小文字無視)

    ' vbBinaryCompare(デフォルト=0): 大文字小文字を区別
    ' ※ Addした後にCompareModeを変えることはできない(エラーになる)
End Sub

04 Existsでキーの存在確認・条件分岐 存在しないキーへのアクセスとAddによる「キー重複エラー」を防ぐ

⚠️ 存在しないキーへのアクセスに注意

dict("存在しないキー")にアクセスすると、エラーではなく空の値("")が返されてそのキーが自動的に追加されます。これは意図しない空エントリを作る原因になります。また、すでに存在するキーにAddしようとすると「このキーはすでに割り当てられています(エラー457)」が発生します。どちらも Exists() で事前確認することで防げます。

' Existsを使った安全な操作パターン
Sub SafeDictionaryOps()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    dict.Add "A001", "田中太郎"
    dict.Add "A002", "山田花子"

    ' パターン1: 存在するキーを取得(存在確認あり)
    Dim key As String
    key = "A001"
    If dict.Exists(key) Then
        Debug.Print dict(key)  ' → 田中太郎
    Else
        Debug.Print key & " は存在しません"
    End If

    ' パターン2: 存在しなければ追加・あれば更新(UPSERTパターン)
    Dim newKey As String
    Dim newVal As String
    newKey = "A001"
    newVal = "田中一郎"

    If dict.Exists(newKey) Then
        dict(newKey) = newVal  ' 上書き
    Else
        dict.Add newKey, newVal  ' 新規追加
    End If

    ' パターン3: 存在するなら削除
    Dim removeKey As String
    removeKey = "A002"
    If dict.Exists(removeKey) Then
        dict.Remove removeKey
    End If

    Debug.Print dict.Count  ' → 1 (A001のみ)
End Sub

📚 用語解説

UPSERTパターン:UPDATE + INSERT を組み合わせた操作。キーが存在すれば更新(Update)、存在しなければ追加(Insert)する処理。DictionaryのExistsを使って「If dict.Exists(key) Then dict(key) = val Else dict.Add key, val」と実装する。カウント集計(1回目はAdd、2回目以降は+1)でよく使う基本パターン。

05 Keys・Itemsで全データをループ処理 For EachとインデックスループでDictionaryの全要素を処理する

' Keys()・Items()でループ処理する
Sub DictionaryLoopPatterns()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    dict.Add "東京", 1393
    dict.Add "大阪", 884
    dict.Add "名古屋", 231
    dict.Add "福岡", 156

    ' パターン1: For Eachでキーをループ
    Dim k As Variant
    For Each k In dict.Keys
        Debug.Print k & " : " & dict(k)
    Next k
    ' 東京 : 1393 / 大阪 : 884 / 名古屋 : 231 / 福岡 : 156

    ' パターン2: Keys()配列でインデックスループ
    Dim keys As Variant
    keys = dict.Keys   ' 全キーを配列として取得
    Dim i As Long
    For i = 0 To UBound(keys)
        Debug.Print i & ": " & keys(i) & " = " & dict(keys(i))
    Next i

    ' パターン3: Items()で値だけをループ
    Dim items As Variant
    items = dict.Items  ' 全値を配列として取得
    Dim total As Long
    For i = 0 To UBound(items)
        total = total + items(i)
    Next i
    Debug.Print "合計: " & total  ' → 2664

    ' パターン4: セルに書き出す
    Dim allKeys As Variant
    allKeys = dict.Keys
    For i = 0 To UBound(allKeys)
        Cells(i + 1, 1).Value = allKeys(i)  ' A列にキー
        Cells(i + 1, 2).Value = dict(allKeys(i))  ' B列に値
    Next i
End Sub
dict.Keys()で全キー取得
Variant型の配列が返る
For i = 0 To UBound(keys)
インデックスループ
dict(keys(i))で値取得
キーに対応する値
セルに書き出し等の処理
Cells(i+1, col).Value

06 実務活用パターン:カウント集計・重複除去・逆引き 最もよく使う3大パターンの実装コード

6-1. カテゴリ別カウント集計

' カテゴリ別カウント集計(最頻出パターン)
Sub CountByCategory()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    ' A列のカテゴリデータを集計(B列は売上金額)
    Dim lastRow As Long
    Dim ws As Worksheet
    Set ws = ActiveSheet
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    Dim i As Long
    Dim category As String
    For i = 2 To lastRow  ' 1行目はヘッダー
        category = CStr(ws.Cells(i, 1).Value)
        If category <> "" Then
            If dict.Exists(category) Then
                dict(category) = dict(category) + 1  ' 件数+1
            Else
                dict.Add category, 1  ' 初出は1から開始
            End If
        End If
    Next i

    ' 結果をSheet2に書き出す
    Dim resultWs As Worksheet
    Set resultWs = Sheets("Sheet2")
    resultWs.Cells.Clear

    Dim allKeys As Variant
    allKeys = dict.Keys
    For i = 0 To UBound(allKeys)
        resultWs.Cells(i + 1, 1).Value = allKeys(i)
        resultWs.Cells(i + 1, 2).Value = dict(allKeys(i))
    Next i

    MsgBox "集計完了: " & dict.Count & "カテゴリ"
End Sub

6-2. 重複除去

' A列の重複データを除去してユニーク値のみをB列に出力
Sub RemoveDuplicates()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    Dim ws As Worksheet
    Set ws = ActiveSheet
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    ' A列を読み込んでDictionaryのキーとして登録(値は不要なので1を入れる)
    Dim i As Long
    For i = 1 To lastRow
        Dim val As String
        val = CStr(ws.Cells(i, 1).Value)
        If val <> "" And Not dict.Exists(val) Then
            dict.Add val, 1
        End If
    Next i

    ' ユニーク値をB列に書き出す
    Dim allKeys As Variant
    allKeys = dict.Keys
    For i = 0 To UBound(allKeys)
        ws.Cells(i + 1, 2).Value = allKeys(i)
    Next i

    Debug.Print "元: " & lastRow & "件 → ユニーク: " & dict.Count & "件"
End Sub

6-3. 逆引き検索(値からキーを探す)

' 値からキーを逆引きするパターン
Sub ReverseSearch()
    ' 正引き: コード→名前
    Dim codeToName As Object
    Set codeToName = CreateObject("Scripting.Dictionary")
    codeToName.Add "A001", "田中太郎"
    codeToName.Add "A002", "山田花子"
    codeToName.Add "A003", "佐藤次郎"

    ' 逆引き用Dictionary(名前→コード)を作成
    Dim nameToCode As Object
    Set nameToCode = CreateObject("Scripting.Dictionary")

    Dim k As Variant
    For Each k In codeToName.Keys
        nameToCode.Add codeToName(k), k  ' 値をキー、キーを値に
    Next k

    ' 名前からコードを取得
    Debug.Print nameToCode("山田花子")  ' → "A002"
    Debug.Print nameToCode("佐藤次郎")  ' → "A003"

    ' 検索結果が存在するか確認してから使う
    Dim searchName As String
    searchName = "鈴木一郎"
    If nameToCode.Exists(searchName) Then
        Debug.Print nameToCode(searchName)
    Else
        Debug.Print searchName & " は見つかりません"
    End If
End Sub
💡 逆引き辞書を使う際の注意点

逆引き辞書は値(Item)が一意でないと成立しません。複数のキーが同じ値を持つ場合、後から追加したキーが上書きされます(またはAddでエラー)。逆引きを使う前に、元のDictionaryの値がユニークかどうかを確認してください。値が重複する可能性がある場合は、逆引き辞書の値をコレクションにして複数キーを保持する実装が必要です。

07 ネストDictionaryと2次元データ Dictionaryの値にDictionaryを入れる2階層データ構造

📚 用語解説

ネストDictionary(入れ子の連想配列):DictionaryのItemにさらにDictionaryオブジェクトを格納すること。これにより「部署→{社員名, 年齢, 役職}」のように1つのキーに複数の属性(フィールド)を持つ2次元データを扱える。JSONのネストした構造に相当する。注意点: 各内部DictionaryもCreateObjectで別途作成する必要がある。Nothingで解放するときは内部Dictionaryも解放する。

' ネストDictionary(2階層のデータ管理)
Sub NestedDictionaryExample()
    Dim employees As Object
    Set employees = CreateObject("Scripting.Dictionary")

    ' 社員ID → {名前, 部署, 年齢} のネスト構造
    Dim emp1 As Object, emp2 As Object, emp3 As Object
    Set emp1 = CreateObject("Scripting.Dictionary")
    emp1.Add "name", "田中太郎"
    emp1.Add "dept", "営業部"
    emp1.Add "age", 32
    employees.Add "A001", emp1

    Set emp2 = CreateObject("Scripting.Dictionary")
    emp2.Add "name", "山田花子"
    emp2.Add "dept", "開発部"
    emp2.Add "age", 28
    employees.Add "A002", emp2

    ' 特定の社員の属性にアクセス
    Debug.Print employees("A001")("name")  ' → 田中太郎
    Debug.Print employees("A001")("dept")  ' → 営業部
    Debug.Print employees("A002")("age")   ' → 28

    ' 全社員をループして情報を表示
    Dim empId As Variant
    For Each empId In employees.Keys
        Dim empInfo As Object
        Set empInfo = employees(empId)
        Debug.Print empId & ": " & empInfo("name") & " (" & empInfo("dept") & ")"
    Next empId

    ' 部署別に集計
    Dim deptCount As Object
    Set deptCount = CreateObject("Scripting.Dictionary")
    For Each empId In employees.Keys
        Dim dept As String
        dept = employees(empId)("dept")
        If deptCount.Exists(dept) Then
            deptCount(dept) = deptCount(dept) + 1
        Else
            deptCount.Add dept, 1
        End If
    Next empId

    For Each dept In deptCount.Keys
        Debug.Print dept & ": " & deptCount(dept) & "人"
    Next dept
End Sub

08 Dictionaryの落とし穴とエラー対策 キー重複・型ミス・Nothing解放の3大注意点

⚠️ エラー457: このキーはすでに割り当てられています

同じキーにもう一度dict.Add()しようとすると「エラー457: このキーはすでに割り当てられています」が発生します。防止策は①Addの前にExists()でキーの存在確認をする、②Addを使わずdict(key) = value(代入)で上書きする(存在しない場合は自動追加)のどちらかです。集計処理では「1回目はAdd、2回目以降は代入」というUPSERTパターンが安全です。

' よくあるエラーと防止コード

' エラー1: キー重複エラー(エラー457)
Sub AvoidDuplicateKeyError()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")
    dict.Add "key1", "value1"

    ' NG: 同じキーにAddするとエラー
    ' dict.Add "key1", "value2"  ← エラー457

    ' OK: Existsで確認してから操作
    If Not dict.Exists("key1") Then
        dict.Add "key1", "value2"
    Else
        dict("key1") = "value2"  ' 上書き
    End If

    ' または代入で常に上書き(存在しなければ自動追加)
    dict("key1") = "value2"  ' Existsなしで安全に上書き/追加
End Sub

' エラー2: 存在しないキーへのアクセスで空エントリが作られる
Sub AvoidEmptyEntryCreation()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    dict.Add "A001", "田中"

    ' NG: 存在しないキーにアクセスすると空エントリが作られる
    Dim val As String
    val = dict("A999")  ' エラーではなく空文字が返り"A999"が追加される
    Debug.Print dict.Count  ' → 2(A999が追加されている!)

    ' OK: 事前にExistsで確認
    Dim dict2 As Object
    Set dict2 = CreateObject("Scripting.Dictionary")
    dict2.Add "A001", "田中"

    If dict2.Exists("A999") Then
        val = dict2("A999")
    Else
        val = ""  ' デフォルト値
    End If
    Debug.Print dict2.Count  ' → 1(余計なエントリなし)
End Sub

' エラー3: CompareMode変更タイミングのエラー
Sub CompareModeError()
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    ' 正しい: Addの前にCompareMode設定
    dict.CompareMode = 1  ' vbTextCompare
    dict.Add "Apple", 1

    ' NG: Addの後にCompareModeを変えるとエラー(実行時エラー5)
    ' dict.Add "Apple", 1
    ' dict.CompareMode = 1  ← エラー!

    Set dict = Nothing  ' 最後はNothingで解放
End Sub
Addの前にExists()確認
キー重複エラーを防ぐ
CompareMode設定は最初に
Addの前に設定する
取得前にExists()確認
空エントリ生成を防ぐ
最後にSet dict = Nothing
メモリを明示的に解放

09 Claude CodeでDictionary処理を自動生成する データ構造の仕様を伝えるだけでDict処理コードが即生成

Claude Codeを使えば、「どんなデータを」「何をキーに」「どう集計・検索するか」を日本語で伝えるだけで、DictionaryのVBAコードが即座に生成されます。Exists確認・ループ処理・エラー対策も自動で入ります。

ユースケースClaude Codeへの指示例
カテゴリ別集計「A列にカテゴリ名、B列に売上金額があります。DictionaryでカテゴリごとにB列を合計してSheet2に出力するマクロを書いて。」
重複除去「A列に重複を含むコードリストがあります。Dictionaryを使ってユニークなコードだけをB列に出力するマクロを書いて。Exists確認を入れて。」
マスタ参照「Sheet1のA列に社員コード、Sheet2のA-B列にコード→名前のマスタがあります。Dictionaryでマスタを辞書化してSheet1のB列に名前を書き込むマクロを書いて。」
ネスト集計「A列に部署名、B列に社員名、C列に売上がある。部署別に{件数, 合計売上}を辞書で集計してデバッグ出力するVBAを書いて。」
代表菅澤 代表菅澤
Claude Codeへの指示で特に効果的なのは「入力のシート/列の形式」「出力先」「Existsやエラー対策が必要か」の3点を明示することです。「VBAのDictionaryで○○する」という冒頭の一言でどのオブジェクトを使うべきかが伝わり、より精度の高いコードが返ってきます。
処理の仕様を整理する
入力形式・キー・値・出力先
Claude Codeに日本語で指示
「Dictionaryで○○する
マクロを書いて」
生成コードをVBEに貼る
Alt+F11でVBE起動
テストデータで動作確認
小さいデータで
期待通りか確認

📚 用語解説

LateBinding(遅延バインディング):CreateObject()やDim変数 As Objectを使ってオブジェクトを参照する方法。実行時にオブジェクトの型が決定される。参照設定(References)が不要なため、他のPCにマクロを配布してもライブラリが見つからないエラーが発生しにくい。コード補完(IntelliSense)は効かない。EarlyBinding(早期バインディング)はDim dict As Scripting.Dictionaryと型を明示する方法で補完は効くが、参照設定を追加する必要がある。

📚 用語解説

ハッシュテーブル:Dictionaryが内部で使うデータ構造。キーをハッシュ関数で変換して格納位置を決めるため、要素数が増えても検索時間がほぼ一定(O(1))。これに対して配列の線形探索はO(n)で要素数に比例して時間がかかる。10,000件のデータからキーで1件を検索する場合、配列は最大10,000回の比較が必要だがDictionaryはほぼ1回。大量データの集計・検索でDictionaryが速い理由はこのハッシュテーブル方式による。

10 まとめ:VBA Dictionary完全チェックリスト 宣言から実務パターンまでの総まとめ

✔️DictionaryはCreateObject("Scripting.Dictionary")で作成(参照設定なしでも動く)
✔️Add(key, value)でデータ追加。同じキーに再度Addするとエラー457
✔️Exists(key)は操作前の必須チェック。未確認アクセスは空エントリを生む
✔️dict(key) = valueの代入は存在しなければ自動追加・あれば上書き(UPSERT)
✔️Keys()/Items()で全キー/値の配列を取得→For Eachまたはインデックスループ
✔️CompareMode設定はAddの前に行う(後から変えるとエラー)
✔️カウント集計・重複除去・逆引きの3パターンを押さえれば実務の大半をカバー
✔️最後にSet dict = Nothingでオブジェクトを解放する習慣をつける
✔️Claude Codeに「DictionaryでX列をキーにY列を集計するマクロ」と指示すれば即生成

ExcelVBAの集計・データ処理をAIで自動化したい方へ

Dictionaryを活用したカウント集計・重複除去・マスタ参照など、VBAのデータ処理はClaude Codeとの組み合わせで大幅に効率化できます。
AI鬼管理では、Excel/VBA業務の自動化設計・実装支援を行っています。

代表菅澤 代表菅澤
「毎月カテゴリ別に集計する作業を自動化したい」「VLOOKUPが遅くてVBA化したい」という相談を多くいただきます。まずは無料相談でどんな処理を自動化したいかをお聞かせください。

NEXT STEP

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

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

AI鬼管理

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

よくある質問

Q. VBA DictionaryとCollectionの違いは何ですか?

A. CollectionはVBA標準のオブジェクトで参照設定不要ですが、Existsメソッドがなく(エラーで代替)、キーによる削除はCollection.Remove "key"で可能ですが、大文字小文字を常に無視します。DictionaryはMicrosoft Scripting RuntimeのオブジェクトでCreateObjectが必要ですが、Existsメソッドがある・CompareMode設定可能・Keys()/Items()で全データを配列として取得できるなど機能が豊富です。集計・検索・重複除去などデータ処理に使うならDictionary、単純な追加・削除ならCollectionという使い分けが一般的です。

Q. Dictionaryに同じキーを追加しようとするとエラーが出ます。どうすればいいですか?

A. エラー457「このキーはすでに割り当てられています」が出ています。解決策は2つです。①Addの前にExists()でキーの存在確認をする: If Not dict.Exists(key) Then dict.Add key, value End If。②Addを使わずに代入を使う: dict(key) = value。この代入方式はキーが存在しなければ自動追加、存在すれば上書きになります(UPSERTパターン)。集計処理では「1回目はAdd、2回目以降はdict(key)+1」というパターンも多いですが、毎回Existsで確認するのが最も安全です。

Q. DictionaryのKeys()とItems()はどう使うのですか?

A. どちらもVariant型の配列を返します。dict.Keys()は全キーの配列、dict.Items()は全値の配列を返します。For Each k In dict.Keys()でループするか、Dim arr As Variant: arr = dict.Keys(): For i = 0 To UBound(arr)でインデックスループできます。キーと値を同時に使う場合はKeys()でキーの配列を取得し、dict(arr(i))で値にアクセスするパターンが一般的です。

Q. DictionaryでVLOOKUPのような検索をしたい場合はどうしますか?

A. マスタデータ(コード→名前など)を最初にDictionaryに読み込んでおき、その後For Eachループでデータ行を処理します。マスタ読み込み: For i = 2 To lastRow: dict.Add Cells(i,1).Value, Cells(i,2).Value: Next i。検索: If dict.Exists(searchKey) Then result = dict(searchKey) End If。VLOOKUPは行ごとにシート全体を再検索するため大量データで遅くなりますが、Dictionaryはハッシュテーブルを使うため高速です。10,000行以上のVLOOKUP処理はDictionaryに変えると大幅に速くなることがあります。

Q. DictionaryのCompareMode(大文字小文字の区別)はいつ設定すればいいですか?

A. CompareModeはAddでデータを追加する前に設定する必要があります。Add後にCompareMode を変えようとすると実行時エラー5「プロシージャの呼び出し、または引数が不正です」が発生します。設定方法: Set dict = CreateObject("Scripting.Dictionary"): dict.CompareMode = 1(1=vbTextCompare: 大文字小文字無視、0=vbBinaryCompare: 区別)。その後dict.Addでデータを追加します。

Q. Claude CodeにVBA Dictionaryのコードを書いてもらうときのコツは?

A. 「入力データの場所(シート名・列番号)」「Dictionaryのキーに何を使うか」「Itemに何を格納するか」「出力先(デバッグ出力かシートへの書き込みか)」の4点を明確に伝えるのが効果的です。例: 「Sheet1のA列に商品コード(A001等)、B列に売上金額があります。Dictionaryで商品コードをキーに売上合計を集計し、Sheet2のA-B列に出力するマクロを書いて。空セル・Null対応とExists確認を入れて。」このように具体的に伝えると完成度の高いコードが返ってきます。

AIAI鬼管理

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

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

会社名を入力してください
業種を選択してください
お名前を入力してください
正しいメールアドレスを入力してください

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

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

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

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

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