<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>連想配列 &#8211; biz-tactics</title>
	<atom:link href="https://mashukabu.com/tag/%e9%80%a3%e6%83%b3%e9%85%8d%e5%88%97/feed/" rel="self" type="application/rss+xml" />
	<link>https://mashukabu.com</link>
	<description></description>
	<lastBuildDate>Tue, 09 Jun 2026 01:45:42 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://mashukabu.com/wp-content/uploads/2022/04/cropped-site-icon-32x32.png</url>
	<title>連想配列 &#8211; biz-tactics</title>
	<link>https://mashukabu.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>VBA Dictionary（連想配列）の使い方｜重複削除・高速集計を実務コードで解説</title>
		<link>https://mashukabu.com/excel-vba-howto-use-dictionary/</link>
					<comments>https://mashukabu.com/excel-vba-howto-use-dictionary/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Tue, 09 Jun 2026 01:45:42 +0000</pubDate>
				<category><![CDATA[VBA・マクロ]]></category>
		<category><![CDATA[Dictionary]]></category>
		<category><![CDATA[Scripting.Dictionary]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[マクロ]]></category>
		<category><![CDATA[連想配列]]></category>
		<category><![CDATA[重複削除]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=7882</guid>

					<description><![CDATA[VBA Dictionary（連想配列）の使い方を基本構文から実務コードまで解説。Add・Exists・Keys・Itemsの基本メソッド、なぜ配列の二重ループより速いのか、重複削除・グループ集計・別シート転記の実務3パターンを完結したコード付きで紹介。コピペで使えるサンプル付き。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">「For EachもDo Loopも書けるようになったのに、データが数千行になると急に遅くなる&#8230;&#8230;」</p>



<p class="wp-block-paragraph">VBAをある程度書けるようになると、こんな壁にぶつかりますよね。特に「重複をチェックしながらループする」処理は、データが増えるほど一気に重くなります。Excelがフリーズして、保存もできずにヒヤッとした経験がある方も多いはずです。</p>



<p class="wp-block-paragraph">この遅さを根本から解決してくれるのが <strong>VBA Dictionary（連想配列）</strong> です。この記事では、基本メソッドの使い方から「なぜ配列より速いのか」、そして重複削除・グループ集計・別シート転記の実務コードまで解説していきますね。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-1" checked><label class="toc-title" for="toc-checkbox-1">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">VBA Dictionary（連想配列）とは？</a></li><li><a href="#toc2" tabindex="0">Dictionaryを使う準備（参照設定とCreateObject）</a><ol><li><a href="#toc3" tabindex="0">方法1: 参照設定する（事前バインディング）</a></li><li><a href="#toc4" tabindex="0">方法2: CreateObjectで生成する（実行時バインディング）</a></li></ol></li><li><a href="#toc5" tabindex="0">Dictionaryの基本メソッド</a><ol><li><a href="#toc6" tabindex="0">Add：キーと値を追加する</a></li><li><a href="#toc7" tabindex="0">Exists：キーがあるか調べる</a></li><li><a href="#toc8" tabindex="0">Item：値を取り出す・書き換える</a></li><li><a href="#toc9" tabindex="0">Keys・Items：全キー・全値を取り出す</a></li><li><a href="#toc10" tabindex="0">Count・Remove：件数取得と削除</a></li><li><a href="#toc11" tabindex="0">基本メソッド早見表</a></li></ol></li><li><a href="#toc12" tabindex="0">なぜDictionaryは配列より速いのか</a><ol><li><a href="#toc13" tabindex="0">配列の重複チェックは「総当たり」になる</a></li><li><a href="#toc14" tabindex="0">Dictionaryは「ラベルから直接たどる」</a></li><li><a href="#toc15" tabindex="0">件数が増えるほど差は爆発する</a></li></ol></li><li><a href="#toc16" tabindex="0">【実務】Dictionaryの活用コード3選</a><ol><li><a href="#toc17" tabindex="0">パターン1: 重複を削除して一意リストを作る</a></li><li><a href="#toc18" tabindex="0">パターン2: 部門別の売上を集計する</a></li><li><a href="#toc19" tabindex="0">パターン3: コード→名前の対応表で別シートに転記する</a></li></ol></li><li><a href="#toc20" tabindex="0">Dictionaryでよくあるエラーと対処法</a></li><li><a href="#toc21" tabindex="0">配列・コレクションとの使い分け</a></li><li><a href="#toc22" tabindex="0">まとめ</a><ol><li><a href="#toc23" tabindex="0">関連記事</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">VBA Dictionary（連想配列）とは？</span></h2>



<p class="wp-block-paragraph">Dictionaryは、<strong>キー（Key）と値（Item）をペアで保管する</strong>オブジェクトです。連想配列やハッシュマップとも呼ばれます。</p>



<p class="wp-block-paragraph">イメージは「ラベル付きの引き出し」です。引き出しにラベル（キー）を貼っておけば、中身（値）を探すときにラベルを見るだけで一発で取り出せます。これがDictionaryの本質です。</p>



<p class="wp-block-paragraph">ふつうの配列が「1番目・2番目」と番号で管理するのに対して、Dictionaryは「商品コード」「部門名」のような<strong>意味のある名前で管理</strong>できます。</p>



<figure class="wp-block-table"><table><thead><tr><th>比較項目</th><th>配列（Array）</th><th>Dictionary</th></tr></thead><tbody><tr><td>要素の指定方法</td><td>番号（インデックス）</td><td>キー（任意の文字列・数値）</td></tr><tr><td>キーの重複</td><td>概念がない</td><td>不可（一意）</td></tr><tr><td>「この値は既出か」の判定</td><td>全要素を順に照合</td><td>Existsで一発判定</td></tr><tr><td>主な用途</td><td>連番管理、行データの一時保持</td><td>重複削除、グループ集計、対応表</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">つまりDictionaryは「<strong>名前で出し入れできて、しかも検索が速い</strong>」入れ物だと覚えてください。この2つの特徴が、大量データ処理の遅さを解決してくれます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>VBE（Visual Basic Editor）は <code>Alt</code> + <code>F11</code> で起動します。リボンから開く場合は「開発」タブ →「Visual Basic」を選びます。「開発」タブが表示されていないときは、「ファイル」→「オプション」→「リボンのユーザー設定」で「開発」にチェックを入れてください。VBEが開いたら「挿入」→「標準モジュール」でコードを書く場所を作ります。画面構成がわからない方は、<a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBE画面の見方</a>の記事も参考にしてみてください。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc2">Dictionaryを使う準備（参照設定とCreateObject）</span></h2>



<p class="wp-block-paragraph">Dictionaryを使うには、最初にオブジェクトを生成する必要があります。生成方法は2通りあります。</p>



<h3 class="wp-block-heading"><span id="toc3">方法1: 参照設定する（事前バインディング）</span></h3>



<p class="wp-block-paragraph">VBEのメニューから「ツール」→「参照設定」を開きます。一覧から <strong>Microsoft Scripting Runtime</strong> にチェックを入れます。これで準備完了です。</p>



<pre class="wp-block-code"><code>Sub UseEarlyBinding()
    Dim dic As Scripting.Dictionary '辞書オブジェクト
    Set dic = New Scripting.Dictionary

    dic.Add &quot;りんご&quot;, 100
    MsgBox dic(&quot;りんご&quot;) &amp; &quot;円&quot;
End Sub</code></pre>



<p class="wp-block-paragraph">参照設定すると、入力中に候補が出る入力補完（IntelliSense）が効きます。コードが書きやすくなるので、自分のPCで使う場合はこちらがおすすめです。</p>



<h3 class="wp-block-heading"><span id="toc4">方法2: CreateObjectで生成する（実行時バインディング）</span></h3>



<p class="wp-block-paragraph">参照設定をせずに、コード内でオブジェクトを直接生成する方法です。</p>



<pre class="wp-block-code"><code>Sub UseLateBinding()
    Dim dic As Object '辞書オブジェクト
    Set dic = CreateObject(&quot;Scripting.Dictionary&quot;)

    dic.Add &quot;りんご&quot;, 100
    MsgBox dic(&quot;りんご&quot;) &amp; &quot;円&quot;
End Sub</code></pre>



<p class="wp-block-paragraph">CreateObjectは参照設定が不要です。そのため、ファイルを他の人に配布する場合に向いています。環境による設定の違いを気にしなくて済むからです。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>迷ったら <strong>CreateObject</strong> を選んでおくと安全です。参照設定はファイルごとに必要で、配布先で外れていると動かなくなります。本記事のコードはすべてCreateObjectで統一しています。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc5">Dictionaryの基本メソッド</span></h2>



<p class="wp-block-paragraph">Dictionaryの基本操作を1つずつ見ていきましょう。どれもシンプルなので、すぐに使えるようになりますよ。</p>



<h3 class="wp-block-heading"><span id="toc6">Add：キーと値を追加する</span></h3>



<p class="wp-block-paragraph"><code>Add</code> はキーと値のペアを登録するメソッドです。</p>



<pre class="wp-block-code"><code>Dim dic As Object '辞書オブジェクト
Set dic = CreateObject(&quot;Scripting.Dictionary&quot;)

dic.Add &quot;A001&quot;, &quot;りんご&quot; 'キー&quot;A001&quot;に値&quot;りんご&quot;を登録
dic.Add &quot;A002&quot;, &quot;みかん&quot;</code></pre>



<p class="wp-block-paragraph">同じキーをもう一度Addするとエラーになります。キーは重複できないルールだからです。</p>



<h3 class="wp-block-heading"><span id="toc7">Exists：キーがあるか調べる</span></h3>



<p class="wp-block-paragraph"><code>Exists</code> は、指定したキーが登録済みかどうかを True / False で返します。</p>



<pre class="wp-block-code"><code>If dic.Exists(&quot;A001&quot;) Then
    MsgBox &quot;登録済みです&quot;
Else
    MsgBox &quot;未登録です&quot;
End If</code></pre>



<p class="wp-block-paragraph">重複チェックの主役になるメソッドです。後ほどの実務コードで大活躍します。</p>



<h3 class="wp-block-heading"><span id="toc8">Item：値を取り出す・書き換える</span></h3>



<p class="wp-block-paragraph"><code>Item</code> はキーに対応する値を取り出すプロパティです。既定プロパティなので、<code>dic("キー")</code> と短く書けます。</p>



<pre class="wp-block-code"><code>MsgBox dic(&quot;A001&quot;) '&quot;りんご&quot;が表示される

dic(&quot;A001&quot;) = &quot;青りんご&quot; '値を上書き</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p><code>Item</code> には注意点があります。存在しないキーを <code>dic("未登録キー")</code> で参照すると、エラーにならず、そのキーが空の値で勝手に追加されてしまいます。<strong>存在確認には必ず <code>Exists</code> を使ってください</strong>。<code>Item</code> での判定は誤動作のもとになります。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc9">Keys・Items：全キー・全値を取り出す</span></h3>



<p class="wp-block-paragraph"><code>Keys</code> は全キーを、<code>Items</code> は全値を、それぞれ配列で返します。</p>



<pre class="wp-block-code"><code>Dim k As Variant '取り出すキー
For Each k In dic.Keys
    Debug.Print k &amp; &quot; → &quot; &amp; dic(k) 'キーと値をセットで出力
Next k</code></pre>



<p class="wp-block-paragraph"><code>For Each</code> でキーを1つずつ取り出し、<code>dic(k)</code> で対応する値を引いています。<a href="https://mashukabu.com/vba-howto-use-for-each-next/">For Eachの使い方</a>との組み合わせはDictionaryの定番パターンです。</p>



<h3 class="wp-block-heading"><span id="toc10">Count・Remove：件数取得と削除</span></h3>



<p class="wp-block-paragraph"><code>Count</code> は登録ペア数を返すプロパティです。<code>Remove</code> は指定したキーのペアを削除します。</p>



<pre class="wp-block-code"><code>MsgBox &quot;登録数: &quot; &amp; dic.Count &amp; &quot;件&quot;

dic.Remove &quot;A002&quot; '&quot;A002&quot;のペアを削除
dic.RemoveAll '全ペアを削除</code></pre>



<h3 class="wp-block-heading"><span id="toc11">基本メソッド早見表</span></h3>



<figure class="wp-block-table"><table><thead><tr><th>要素</th><th>種別</th><th>役割</th></tr></thead><tbody><tr><td>Add(キー, 値)</td><td>メソッド</td><td>ペアを追加（既存キーはエラー）</td></tr><tr><td>Exists(キー)</td><td>メソッド</td><td>キーの有無を True / False で返す</td></tr><tr><td>Item(キー) / dic(キー)</td><td>プロパティ</td><td>値を取得・上書き</td></tr><tr><td>Keys</td><td>メソッド</td><td>全キーを配列で返す</td></tr><tr><td>Items</td><td>メソッド</td><td>全値を配列で返す</td></tr><tr><td>Count</td><td>プロパティ</td><td>登録ペア数を返す</td></tr><tr><td>Remove(キー)</td><td>メソッド</td><td>指定キーのペアを削除</td></tr><tr><td>RemoveAll</td><td>メソッド</td><td>全ペアを削除</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><span id="toc12">なぜDictionaryは配列より速いのか</span></h2>



<p class="wp-block-paragraph">ここがこの記事のいちばん大事なところです。「なぜ速いのか」を理解すると、Dictionaryを使うべき場面が自分で判断できるようになります。</p>



<h3 class="wp-block-heading"><span id="toc13">配列の重複チェックは「総当たり」になる</span></h3>



<p class="wp-block-paragraph">配列で「この値はもう登場したか」を調べるには、先頭から順に1つずつ照合するしかありません。これを<strong>線形探索</strong>と呼びます。</p>



<p class="wp-block-paragraph">たとえば1,000件のデータから重複を除こうとすると、1件ごとに既存リストを全部チェックします。結果として、最悪で約100万回（1,000×1,000）の照合が必要です。データが10,000件なら約1億回に膨れ上がります。</p>



<p class="wp-block-paragraph">これが<strong>二重ループ（O(n^2)）</strong>の正体です。件数が10倍になると、処理時間は100倍になります。</p>



<h3 class="wp-block-heading"><span id="toc14">Dictionaryは「ラベルから直接たどる」</span></h3>



<p class="wp-block-paragraph">一方、Dictionaryは内部で<strong>ハッシュテーブル</strong>という仕組みを使っています。キーを計算式（ハッシュ関数）にかけて、値を置く場所を直接割り出します。</p>



<p class="wp-block-paragraph">引き出しのラベルを見て、いきなり目的の引き出しを開けるイメージです。他の引き出しを順番に開けて確認する必要がありません。</p>



<p class="wp-block-paragraph">そのため、<code>Exists</code> や <code>dic(キー)</code> での検索は、データ件数に関係なくほぼ一定時間（<strong>O(1)</strong>）で終わります。重複チェックを伴うループ全体で見ても、Dictionaryなら<strong>O(n)</strong>で済みます。</p>



<h3 class="wp-block-heading"><span id="toc15">件数が増えるほど差は爆発する</span></h3>



<p class="wp-block-paragraph">両者の照合回数を比べてみましょう。</p>



<figure class="wp-block-table"><table><thead><tr><th>データ件数</th><th>配列の二重ループ（O(n^2)）</th><th>Dictionary（O(n)）</th></tr></thead><tbody><tr><td>100件</td><td>約1万回</td><td>100回</td></tr><tr><td>1,000件</td><td>約100万回</td><td>1,000回</td></tr><tr><td>10,000件</td><td>約1億回</td><td>1万回</td></tr><tr><td>100,000件</td><td>約100億回</td><td>10万回</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">100件程度なら配列でも一瞬です。しかし数千〜数万件になると、配列は数十秒〜数分かかる一方、Dictionaryは一瞬で終わります。この差が、冒頭の「急に遅くなる」問題の答えです。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>配列が遅いのは「値で探す」ときだけです。番号（インデックス）で直接取り出す処理は配列も高速です。「名前や値で検索したい」ときがDictionaryの出番だと覚えておきましょう。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc16">【実務】Dictionaryの活用コード3選</span></h2>



<p class="wp-block-paragraph">ここからは、実務でそのまま使えるパターンを3つ紹介します。どれもデータの準備から出力まで通しで動くコードです。</p>



<h3 class="wp-block-heading"><span id="toc17">パターン1: 重複を削除して一意リストを作る</span></h3>



<p class="wp-block-paragraph">A列の商品コードから重複を除き、C列に一意のリストを書き出すコードです。</p>



<pre class="wp-block-code"><code>Sub RemoveDuplicates()
    Dim ws As Worksheet '対象シート
    Dim dic As Object '重複判定用の辞書
    Dim lastRow As Long '最終行
    Dim i As Long '行カウンター
    Dim key As String '判定するキー
    Dim outRow As Long '出力先の行

    Set ws = ActiveSheet
    Set dic = CreateObject(&quot;Scripting.Dictionary&quot;)
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    outRow = 2

    '--- A列を1行ずつ読み、未登録のものだけC列に書き出す ---
    For i = 2 To lastRow
        key = ws.Cells(i, 1).Value
        If Not dic.Exists(key) Then
            dic.Add key, True '登録済みとして記録
            ws.Cells(outRow, 3).Value = key
            outRow = outRow + 1
        End If
    Next i

    MsgBox &quot;重複を除いて &quot; &amp; dic.Count &amp; &quot; 件を書き出しました&quot;
End Sub</code></pre>



<p class="wp-block-paragraph">ポイントは <code>If Not dic.Exists(key) Then</code> です。まだ登録されていないキーだけをC列に書き出しています。最終行は <code>End(xlUp)</code> で取得しています。詳しくは<a href="https://mashukabu.com/excel-vba-howto-get-lastrow/">最終行を取得する方法</a>をご覧ください。</p>



<h3 class="wp-block-heading"><span id="toc18">パターン2: 部門別の売上を集計する</span></h3>



<p class="wp-block-paragraph">A列に部門名、B列に売上金額が入ったデータを、部門ごとに合計するコードです。</p>



<pre class="wp-block-code"><code>Sub GroupSum()
    Dim ws As Worksheet '対象シート
    Dim dic As Object '部門別集計用の辞書
    Dim lastRow As Long '最終行
    Dim i As Long '行カウンター
    Dim dept As String '部門名（キー）
    Dim amount As Double '売上金額
    Dim k As Variant '出力時のキー
    Dim outRow As Long '出力先の行

    Set ws = ActiveSheet
    Set dic = CreateObject(&quot;Scripting.Dictionary&quot;)
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    '--- 部門名をキーにして売上を加算していく ---
    For i = 2 To lastRow
        dept = ws.Cells(i, 1).Value
        amount = ws.Cells(i, 2).Value
        If dic.Exists(dept) Then
            dic(dept) = dic(dept) + amount '既存部門に加算
        Else
            dic.Add dept, amount '新しい部門を登録
        End If
    Next i

    '--- 集計結果をD・E列に書き出す ---
    outRow = 2
    For Each k In dic.Keys
        ws.Cells(outRow, 4).Value = k
        ws.Cells(outRow, 5).Value = dic(k)
        outRow = outRow + 1
    Next k

    MsgBox dic.Count &amp; &quot; 部門を集計しました&quot;
End Sub</code></pre>



<p class="wp-block-paragraph"><code>dic(dept) = dic(dept) + amount</code> が集計の心臓部です。既に登録済みの部門なら現在の合計に加算し、初登場の部門なら新規登録しています。ピボットテーブルのグループ集計をコードで実現するイメージです。条件分岐は<a href="https://mashukabu.com/excel-vba-conditional-branch-explanation/">If文の使い方</a>で行っています。</p>



<h3 class="wp-block-heading"><span id="toc19">パターン3: コード→名前の対応表で別シートに転記する</span></h3>



<p class="wp-block-paragraph">「商品マスタ」シートの対応表をDictionaryに読み込み、「売上」シートの商品コードを商品名に変換しながら転記するコードです。VLOOKUPをメモリ上で高速実行するイメージです。</p>



<pre class="wp-block-code"><code>Sub MappingTransfer()
    Dim wsM As Worksheet '商品マスタシート
    Dim wsS As Worksheet '売上シート
    Dim dic As Object '対応表の辞書
    Dim lastRowM As Long 'マスタの最終行
    Dim lastRowS As Long '売上の最終行
    Dim i As Long '行カウンター
    Dim code As String '商品コード（キー）

    Set wsM = Worksheets(&quot;商品マスタ&quot;)
    Set wsS = Worksheets(&quot;売上&quot;)
    Set dic = CreateObject(&quot;Scripting.Dictionary&quot;)

    '--- マスタのコードと名前を対応表として読み込む ---
    lastRowM = wsM.Cells(wsM.Rows.Count, 1).End(xlUp).Row
    For i = 2 To lastRowM
        dic(wsM.Cells(i, 1).Value) = wsM.Cells(i, 2).Value
    Next i

    '--- 売上シートのコードを名前に変換してC列に書き出す ---
    lastRowS = wsS.Cells(wsS.Rows.Count, 1).End(xlUp).Row
    For i = 2 To lastRowS
        code = wsS.Cells(i, 1).Value
        If dic.Exists(code) Then
            wsS.Cells(i, 3).Value = dic(code) '対応する名前を転記
        Else
            wsS.Cells(i, 3).Value = &quot;該当なし&quot;
        End If
    Next i

    MsgBox &quot;転記が完了しました&quot;
End Sub</code></pre>



<p class="wp-block-paragraph">対応表を一度Dictionaryに読み込んでしまえば、あとは <code>dic(code)</code> で一発参照できます。売上データが何万行あっても高速です。VLOOKUPの数式を大量に貼るより軽く、確実に動きます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>マスタの読み込みで <code>dic(キー) = 値</code> を使っているのは、マスタ側に重複コードがあっても後の行で上書きされるだけでエラーにならないからです。<code>Add</code> だと重複コードでエラーになるので、対応表の読み込みではこの書き方が安全です。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc20">Dictionaryでよくあるエラーと対処法</span></h2>



<figure class="wp-block-table"><table><thead><tr><th>エラー</th><th>原因</th><th>対処法</th></tr></thead><tbody><tr><td>実行時エラー &#8216;457&#8217;：キーが重複</td><td>同じキーを <code>Add</code> した</td><td><code>Exists</code> で事前チェックする。または <code>dic(キー) = 値</code> で上書きする</td></tr><tr><td>「ユーザー定義型は定義されていません」</td><td>参照設定なしで <code>As Scripting.Dictionary</code> と書いた</td><td>参照設定を追加する。または <code>CreateObject</code> と <code>As Object</code> に変える</td></tr><tr><td>実行時エラー &#8216;5&#8217;：引数が不正</td><td>存在しないキーを <code>Remove</code> した</td><td><code>Remove</code> の前に <code>Exists</code> でキーの有無を確認する</td></tr><tr><td>意図しない空キーが増える</td><td>存在しないキーを <code>Item</code> で参照した</td><td>存在確認は必ず <code>Exists</code> で行う。<code>Item</code> で判定しない</td></tr><tr><td>実行時エラー &#8216;429&#8217;：オブジェクトを作成できません</td><td>まれに環境にコンポーネントがない</td><td>Windowsには標準搭載。エラー時はOSやOfficeの状態を確認する</td></tr></tbody></table></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>Dictionaryを使うマクロは、必ず <strong>マクロ有効ブック（.xlsm）</strong> で保存してください。通常の .xlsx で保存すると、マクロが消えてしまいます。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc21">配列・コレクションとの使い分け</span></h2>



<p class="wp-block-paragraph">VBAでデータをまとめて扱う方法には、配列・Collection・Dictionaryの3つがあります。場面に合わせて選びましょう。</p>



<figure class="wp-block-table"><table><thead><tr><th>比較項目</th><th>配列（Array）</th><th>Collection</th><th>Dictionary</th></tr></thead><tbody><tr><td>参照設定</td><td>不要</td><td>不要</td><td>CreateObjectなら不要</td></tr><tr><td>キーでの管理</td><td>できない</td><td>追加時のみ</td><td>できる</td></tr><tr><td>キーの存在確認</td><td>自前で実装</td><td>メソッドなし</td><td>Exists</td></tr><tr><td>キー一覧の取得</td><td>できない</td><td>できない</td><td>Keys</td></tr><tr><td>値で探す速さ</td><td>遅い（線形探索）</td><td>遅い</td><td>速い（ハッシュ）</td></tr><tr><td>主な用途</td><td>連番・行データの保持</td><td>単純な要素の束</td><td>重複削除・集計・対応表</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>使い分けの目安</strong></p>



<ul class="wp-block-list"><li><strong>番号で順番に処理する</strong> → 配列</li><li><strong>単純に要素を束ねたいだけ</strong> → Collection</li><li><strong>キーで検索・重複判定・集計したい</strong> → Dictionary</li></ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>「重複を除きたい」「○○ごとに合計したい」「コードから名前を引きたい」という処理が出てきたら、Dictionaryを思い出してください。二重ループで書きかけていたコードが、半分以下の行数で、しかも何倍も速くなります。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc22">まとめ</span></h2>



<p class="wp-block-paragraph">VBA Dictionaryは「<strong>キーと値をペアで保管し、高速に出し入れできる</strong>」オブジェクトです。</p>



<ul class="wp-block-list"><li><strong>Add</strong> でペアを追加し、<strong>Exists</strong> でキーの有無を判定する</li><li>値の取得・上書きは <strong>dic(キー)</strong> で書ける（存在しないキーの参照は厳禁）</li><li><strong>Keys / Items</strong> で全要素を取り出し、<strong>For Each</strong> でループする</li><li>速い理由は<strong>ハッシュテーブル</strong>。値で探す処理が配列より圧倒的に速い</li><li>重複削除・グループ集計・別シート転記の3パターンが実務の定番</li></ul>



<p class="wp-block-paragraph">データが数千行を超えて「急に遅くなった」と感じたら、Dictionaryの出番です。まずは重複削除のコードをVBEに貼り付けて、二重ループとの速度差を体感してみてくださいね。</p>



<p class="wp-block-paragraph">Dictionaryを使いこなせたら、次は<a href="https://mashukabu.com/excel-vba-learning-roadmap/">VBA学習ロードマップ</a>で全体の学習ステップを確認してみましょう。</p>



<h3 class="wp-block-heading"><span id="toc23">関連記事</span></h3>



<ul class="wp-block-list"><li><a href="https://mashukabu.com/vba-howto-use-for-each-next/">For Eachの使い方｜セル・シート・配列を一括処理</a></li><li><a href="https://mashukabu.com/how-to-use-do-loop/">Do Loopの使い方｜Do While・Do Untilを4パターンで解説</a></li><li><a href="https://mashukabu.com/excel-vba-howto-use-range/">Rangeの使い方｜セルの指定・範囲操作を基本から解説</a></li><li><a href="https://mashukabu.com/excel-vba-howto-get-lastrow/">最終行を取得する方法｜End(xlUp)とCells.Countの使い方</a></li><li><a href="https://mashukabu.com/excel-vba-conditional-branch-explanation/">If文の使い方｜条件分岐を基本から実務まで解説</a></li><li><a href="https://mashukabu.com/excel-vba-variable-explanation/">VBA変数の使い方</a></li><li><a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBE画面の見方｜ウィンドウの名前と役割を整理</a></li><li><a href="https://mashukabu.com/excel-vba-learning-roadmap/">VBA学習ロードマップ</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/excel-vba-howto-use-dictionary/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
