<?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%87%8D%E8%A4%87%E5%89%8A%E9%99%A4/feed/" rel="self" type="application/rss+xml" />
	<link>https://mashukabu.com</link>
	<description></description>
	<lastBuildDate>Sat, 01 Aug 2026 05:23:32 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</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」を選びます。</p><p>「開発」タブが表示されていないときは、「ファイル」→「オプション」→「リボンのユーザー設定」で「開発」にチェックを入れてください。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> で参照すると、エラーにならず、そのキーが空の値で勝手に追加されてしまいます。</p><p><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列に書き出しています。</p>



<p class="wp-block-paragraph">最終行は <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> が集計の心臓部です。既に登録済みの部門なら現在の合計に加算し、初登場の部門なら新規登録しています。</p>



<p class="wp-block-paragraph">ピボットテーブルのグループ集計をコードで実現するイメージ。条件分岐は<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>
		<item>
		<title>スプレッドシートのUNIQUE関数の使い方｜重複を瞬時に除去</title>
		<link>https://mashukabu.com/spreadsheet-unique-function/</link>
					<comments>https://mashukabu.com/spreadsheet-unique-function/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Sat, 21 Mar 2026 11:29:21 +0000</pubDate>
				<category><![CDATA[Googleスプレッドシート]]></category>
		<category><![CDATA[UNIQUE]]></category>
		<category><![CDATA[スプレッドシート]]></category>
		<category><![CDATA[データ整理]]></category>
		<category><![CDATA[配列関数]]></category>
		<category><![CDATA[重複削除]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=4737</guid>

					<description><![CDATA[GoogleスプレッドシートのUNIQUE関数を使えば、リストの重複を一瞬で削除できます。基本的な使い方から、SORT・FILTER・COUNTIFとの組み合わせ、エラー対処まで実例つきでわかりやすく解説します。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">「リストから重複を取り除いて、一覧を整理したい」。データ整理をしていると、こんな場面がよくありますよね。</p>



<p class="wp-block-paragraph">手作業で1行ずつ確認して削除するのは、件数が多いと現実的ではありません。しかも、元データを壊してしまうリスクもあります。</p>



<p class="wp-block-paragraph">そんなときに便利なのが <strong>UNIQUE関数</strong> です。範囲を指定するだけで、重複のないリストを自動で作成してくれます。</p>



<p class="wp-block-paragraph">この記事では、UNIQUE関数の基本から、SORT・FILTER・COUNTIFとの組み合わせまで実例つきで紹介します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">UNIQUE関数とは？</a></li><li><a href="#toc2" tabindex="0">UNIQUE関数の書き方</a><ol><li><a href="#toc3" tabindex="0">構文</a></li><li><a href="#toc4" tabindex="0">引数「列方向」と「1回のみ」の意味</a></li></ol></li><li><a href="#toc5" tabindex="0">UNIQUE関数の基本的な使い方</a><ol><li><a href="#toc6" tabindex="0">1列の重複を削除する</a></li><li><a href="#toc7" tabindex="0">複数列の組み合わせで重複削除する</a></li></ol></li><li><a href="#toc8" tabindex="0">UNIQUE関数の実践的な使い方・応用例</a><ol><li><a href="#toc9" tabindex="0">パターン1：SORT+UNIQUEで五十音順のリストを作る</a></li><li><a href="#toc10" tabindex="0">パターン2：FILTER+UNIQUEで条件付きの一意リストを作る</a></li><li><a href="#toc11" tabindex="0">パターン3：COUNTIF+UNIQUEで重複チェック表を作る</a></li><li><a href="#toc12" tabindex="0">パターン4：プルダウンの選択肢を自動更新する</a></li><li><a href="#toc13" tabindex="0">パターン5：ユニーク件数をカウントする</a></li></ol></li><li><a href="#toc14" tabindex="0">よくあるエラーと対処法</a></li><li><a href="#toc15" tabindex="0">ExcelのUNIQUE関数との違い</a></li><li><a href="#toc16" tabindex="0">まとめ</a><ol><li><a href="#toc17" tabindex="0">この記事を書いた人</a></li><li><a href="#toc18" tabindex="0">関連記事</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">UNIQUE関数とは？</span></h2>



<p class="wp-block-paragraph">UNIQUE関数は、指定した範囲から <strong>重複する値を取り除いて、一意のリストを返す</strong> 関数です。<br>読み方は「ユニーク関数」です。</p>



<p class="wp-block-paragraph">たとえば、売上データの「商品名」列にノートPCが5回出てきたとします。UNIQUE関数を使えば1回だけ表示されます。<br>元データはそのまま残るので安心です。</p>



<p class="wp-block-paragraph">結果は数式を入力したセルから自動で展開（スピル）されます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>UNIQUE関数はGoogleスプレッドシート独自の関数です。ExcelにもUNIQUE関数がありますが、引数名が異なります（後述）。また、Excelでは Microsoft 365 または Excel 2021 以降でしか使えません。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc2">UNIQUE関数の書き方</span></h2>



<h3 class="wp-block-heading"><span id="toc3">構文</span></h3>



<pre class="wp-block-code"><code>=UNIQUE(範囲, [列方向], [1回のみ])</code></pre>



<figure class="wp-block-table"><table><thead><tr><th>引数</th><th>必須/任意</th><th>説明</th></tr></thead><tbody><tr><td>範囲</td><td>必須</td><td>重複を除去したいセル範囲（例: <code>A2:A100</code>）</td></tr><tr><td>列方向</td><td>任意</td><td><code>TRUE</code> = 列単位で重複除去 / <code>FALSE</code> = 行単位（デフォルト）</td></tr><tr><td>1回のみ</td><td>任意</td><td><code>TRUE</code> = 1回だけ出現する値のみ返す / <code>FALSE</code> = 通常の重複除去（デフォルト）</td></tr></tbody></table></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>引数が3つありますが、ほとんどの場面では <strong>範囲だけ指定すればOK</strong> です。<code>=UNIQUE(A2:A100)</code> のように使います。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc4">引数「列方向」と「1回のみ」の意味</span></h3>



<p class="wp-block-paragraph"><strong>列方向（第2引数）</strong> は、データの並び方に合わせて切り替えます。</p>



<ul class="wp-block-list"><li><code>FALSE</code>（デフォルト）: データが縦に並んでいる場合。行単位で重複を判定します</li><li><code>TRUE</code>: データが横に並んでいる場合。列単位で重複を判定します</li></ul>



<p class="wp-block-paragraph">通常のスプレッドシートではデータは縦に並んでいるので、この引数は省略して大丈夫です。</p>



<p class="wp-block-paragraph"><strong>1回のみ（第3引数）</strong> は、少し特殊な使い方です。</p>



<ul class="wp-block-list"><li><code>FALSE</code>（デフォルト）: 重複している値も、最初の1つだけ残します</li><li><code>TRUE</code>: 元データで <strong>ちょうど1回しか出現しない値だけ</strong> を返します。2回以上出現する値はすべて除外されます</li></ul>



<p class="wp-block-paragraph">「重複していないデータだけ見たい」という場面で <code>TRUE</code> が役立ちます。</p>



<h2 class="wp-block-heading"><span id="toc5">UNIQUE関数の基本的な使い方</span></h2>



<h3 class="wp-block-heading"><span id="toc6">1列の重複を削除する</span></h3>



<p class="wp-block-paragraph">次のような売上データで説明します。</p>



<figure class="wp-block-table"><table><thead><tr><th>&nbsp;</th><th>A列（商品名）</th><th>B列（金額）</th></tr></thead><tbody><tr><td>2行目</td><td>ノートPC</td><td>150000</td></tr><tr><td>3行目</td><td>モニター</td><td>45000</td></tr><tr><td>4行目</td><td>ノートPC</td><td>140000</td></tr><tr><td>5行目</td><td>キーボード</td><td>8000</td></tr><tr><td>6行目</td><td>モニター</td><td>32000</td></tr><tr><td>7行目</td><td>マウス</td><td>3000</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">A列の商品名から重複のないリストを作るには、空いているセル（たとえばD2）に次の数式を入力します。</p>



<pre class="wp-block-code"><code>=UNIQUE(A2:A7)</code></pre>



<p class="wp-block-paragraph">結果はこうなります。</p>



<figure class="wp-block-table"><table><thead><tr><th>D列</th></tr></thead><tbody><tr><td>ノートPC</td></tr><tr><td>モニター</td></tr><tr><td>キーボード</td></tr><tr><td>マウス</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">「ノートPC」と「モニター」がそれぞれ2回ずつ出てきていますが、UNIQUE関数が1つにまとめてくれました。</p>



<h3 class="wp-block-heading"><span id="toc7">複数列の組み合わせで重複削除する</span></h3>



<p class="wp-block-paragraph">範囲に複数列を指定すると、<strong>すべての列が完全に一致する行</strong> を重複と判定します。</p>



<p class="wp-block-paragraph">たとえば「担当者 + 商品名」の組み合わせで重複を除去する場合です。</p>



<figure class="wp-block-table"><table><thead><tr><th>&nbsp;</th><th>A列（担当者）</th><th>B列（商品名）</th></tr></thead><tbody><tr><td>2行目</td><td>田中</td><td>ノートPC</td></tr><tr><td>3行目</td><td>佐藤</td><td>モニター</td></tr><tr><td>4行目</td><td>田中</td><td>ノートPC</td></tr><tr><td>5行目</td><td>田中</td><td>キーボード</td></tr></tbody></table></figure>



<pre class="wp-block-code"><code>=UNIQUE(A2:B5)</code></pre>



<figure class="wp-block-table"><table><thead><tr><th>D列</th><th>E列</th></tr></thead><tbody><tr><td>田中</td><td>ノートPC</td></tr><tr><td>佐藤</td><td>モニター</td></tr><tr><td>田中</td><td>キーボード</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">3行目の「田中 + ノートPC」は2行目と完全一致するため除外されました。<br>一方、「田中 + キーボード」は商品名が異なるので残っています。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>UNIQUE関数は <strong>大文字と小文字を区別しません</strong>。「Apple」と「apple」は同じ値として扱われます。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc8">UNIQUE関数の実践的な使い方・応用例</span></h2>



<h3 class="wp-block-heading"><span id="toc9">パターン1：SORT+UNIQUEで五十音順のリストを作る</span></h3>



<p class="wp-block-paragraph">UNIQUE関数の結果は元データの並び順のままです。<br>五十音順やアルファベット順に並べたいときは、<a href="https://mashukabu.com/spreadsheet-sort-sortn-sortby/">SORT関数</a>と組み合わせましょう。</p>



<pre class="wp-block-code"><code>=SORT(UNIQUE(A2:A100))</code></pre>



<p class="wp-block-paragraph">UNIQUE関数で重複を取り除き、SORT関数で昇順に並べ替えます。プルダウンの選択肢リストを作るときに便利です。</p>



<h3 class="wp-block-heading"><span id="toc10">パターン2：FILTER+UNIQUEで条件付きの一意リストを作る</span></h3>



<p class="wp-block-paragraph">「東京支店の商品名だけのユニークリスト」のように、条件を付けたい場合です。<br><a href="https://mashukabu.com/spreadsheet-filter-function/">FILTER関数</a>で先に絞り込んでからUNIQUEに渡します。</p>



<pre class="wp-block-code"><code>=UNIQUE(FILTER(C2:C100, B2:B100=&quot;東京&quot;))</code></pre>



<p class="wp-block-paragraph">FILTER関数でB列が「東京」の行だけを抽出します。そのC列（商品名）の重複を除去する流れです。<br>FILTER → UNIQUE の順番がポイントです。</p>



<h3 class="wp-block-heading"><span id="toc11">パターン3：COUNTIF+UNIQUEで重複チェック表を作る</span></h3>



<p class="wp-block-paragraph">各値が元データに何回出現するかを一覧表にできます。<a href="https://mashukabu.com/spreadsheet-countif-function/">COUNTIF関数</a>と組み合わせます。</p>



<p class="wp-block-paragraph">D2に次の数式を入力して、ユニークリストを作ります。</p>



<pre class="wp-block-code"><code>=UNIQUE(A2:A100)</code></pre>



<p class="wp-block-paragraph">E2に、そのユニーク値ごとの出現回数を表示します。</p>



<pre class="wp-block-code"><code>=COUNTIF(A$2:A$100, D2)</code></pre>



<p class="wp-block-paragraph">E2を下方向にコピーすれば、各値の件数が一覧で確認できます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>もっとスマートに書くなら、1つの数式でまとめる方法もあります。<code>=COUNTIF(A2:A100, UNIQUE(A2:A100))</code> とすると、UNIQUEの結果に対応するカウントが自動でスピルします。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc12">パターン4：プルダウンの選択肢を自動更新する</span></h3>



<p class="wp-block-paragraph">UNIQUE関数を使えば、データの入力状況に応じて <strong>プルダウンの選択肢を自動更新</strong> できます。</p>



<ol class="wp-block-list"><li>空いているセル（例: Z2）に <code>=SORT(UNIQUE(A2:A100))</code> と入力</li><li>データの入力規則を設定するセルを選択</li><li>メニューから「データ」→「データの入力規則」を開く</li><li>条件を「プルダウン（範囲内）」にして、Z2から始まる範囲を指定</li></ol>



<p class="wp-block-paragraph">商品名や担当者名が増えても、プルダウンの選択肢が自動で更新されます。</p>



<h3 class="wp-block-heading"><span id="toc13">パターン5：ユニーク件数をカウントする</span></h3>



<p class="wp-block-paragraph">重複を除いた件数（種類数）だけを知りたい場合は、COUNTA関数やROWS関数を使います。</p>



<pre class="wp-block-code"><code>=COUNTA(UNIQUE(A2:A100))</code></pre>



<p class="wp-block-paragraph">たとえば商品名が100行あっても、種類が5つなら「5」が返ります。</p>



<p class="wp-block-paragraph">空白セルが混ざっている可能性がある場合は、先にFILTERで除外しておきましょう。</p>



<pre class="wp-block-code"><code>=COUNTA(UNIQUE(FILTER(A2:A100, A2:A100&lt;&gt;&quot;&quot;)))</code></pre>



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



<figure class="wp-block-table"><table><thead><tr><th>エラー / 症状</th><th>原因</th><th>対処法</th></tr></thead><tbody><tr><td><code>#REF!</code></td><td>結果を展開するセルにデータがある</td><td>スピル先のセルをクリアするか、数式を空き領域に移動する</td></tr><tr><td>空白行が結果に含まれる</td><td>元の範囲に空白セルがある</td><td><code>=UNIQUE(FILTER(A2:A100, A2:A100<>""))</code> で空白を除外する</td></tr><tr><td>「Apple」と「apple」が1つになる</td><td>大文字小文字を区別しない仕様</td><td>区別が必要な場合はEXACT関数で個別に判定する</td></tr><tr><td>期待より多くの値が除外される</td><td>第3引数が <code>TRUE</code> になっている</td><td>引数を <code>FALSE</code> に戻すか省略する</td></tr></tbody></table></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p><code>#REF!</code> エラーはスピル関数で最もよくあるエラーです。UNIQUE関数の結果が展開される先にデータがあると発生します。出力先の下方向に十分な空きを確保してください。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc15">ExcelのUNIQUE関数との違い</span></h2>



<p class="wp-block-paragraph">スプレッドシートとExcelのUNIQUE関数は、基本的な動作は同じですが引数名が異なります。</p>



<figure class="wp-block-table"><table><thead><tr><th>比較項目</th><th>Googleスプレッドシート</th><th>Excel（Microsoft 365）</th></tr></thead><tbody><tr><td>構文</td><td><code>=UNIQUE(範囲, 列方向, 1回のみ)</code></td><td><code>=UNIQUE(配列, 列の比較, 回数指定)</code></td></tr><tr><td>引数名</td><td><code>by_column</code></td><td><code>by_col</code></td></tr><tr><td>利用可能な環境</td><td>全ユーザーで利用可能</td><td>Microsoft 365 / Excel 2021 以降のみ</td></tr><tr><td>大文字小文字</td><td>区別しない</td><td>区別しない</td></tr><tr><td>スピル動作</td><td>すべての関数でスピル可能</td><td>動的配列対応版（365〜）のみ</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">最大の違いは <strong>利用できる環境</strong> です。スプレッドシートではすべてのユーザーが使えます。<br>一方、Excelでは永続ライセンス版（Excel 2019以前）では使えません。</p>



<p class="wp-block-paragraph">機能面ではほぼ同じなので、スプレッドシートでUNIQUE関数に慣れておけば、Excelでもそのまま使えます。</p>



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



<p class="wp-block-paragraph">この記事では、GoogleスプレッドシートのUNIQUE関数の使い方を解説しました。</p>



<ul class="wp-block-list"><li><strong>UNIQUE関数</strong>: 範囲から重複を除去して一意のリストを返す</li><li><strong>基本の使い方</strong>: <code>=UNIQUE(A2:A100)</code> で範囲を指定するだけ</li><li><strong>SORT連携</strong>: <code>=SORT(UNIQUE(...))</code> で五十音順のリストを作成</li><li><strong>FILTER連携</strong>: <code>=UNIQUE(FILTER(...))</code> で条件付きの一意リスト</li><li><strong>COUNTIF連携</strong>: 各値の出現回数を一覧表にできる</li><li><strong>プルダウン</strong>: UNIQUE+SORTで選択肢を自動更新</li></ul>



<p class="wp-block-paragraph">まずは <code>=UNIQUE(A2:A100)</code> から試してみてください。1列の重複除去ができれば、SORT・FILTERとの組み合わせもすぐに使いこなせます。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc17">この記事を書いた人</span></h3>



<p class="wp-block-paragraph">biz-tactics編集部。事務職の現場で本当に使えるExcel・スプレッドシート・AIの技を発信しています。</p>



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



<ul class="wp-block-list"><li><a href="https://mashukabu.com/spreadsheet-sort-sortn-sortby/">スプレッドシートのSORT・SORTN・SORTBY関数の使い方｜データを自動で並べ替える</a></li><li><a href="https://mashukabu.com/spreadsheet-filter-function/">スプレッドシートのFILTER関数の使い方｜条件抽出を自動化する方法</a></li><li><a href="https://mashukabu.com/spreadsheet-countif-function/">スプレッドシートのCOUNTIF関数の使い方｜条件に合うセルを数える</a></li><li><a href="https://mashukabu.com/spreadsheet-arrayformula-function/">スプレッドシートのARRAYFORMULA関数の使い方｜範囲に一括適用</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/spreadsheet-unique-function/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ExcelのUNIQUE関数の使い方｜重複削除・複数列・エラー対処まで網羅</title>
		<link>https://mashukabu.com/excel-function-howto-use-unique/</link>
					<comments>https://mashukabu.com/excel-function-howto-use-unique/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Sun, 09 Mar 2025 00:06:16 +0000</pubDate>
				<category><![CDATA[Excel関数]]></category>
		<category><![CDATA[COUNTIF]]></category>
		<category><![CDATA[Microsoft 365]]></category>
		<category><![CDATA[UNIQUE関数]]></category>
		<category><![CDATA[スピル]]></category>
		<category><![CDATA[動的配列関数]]></category>
		<category><![CDATA[重複削除]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=1872</guid>

					<description><![CDATA[ExcelのUNIQUE関数の使い方を徹底解説。重複の削除機能・COUNTIF関数との違い、複数列でのユニーク判定、0や#SPILL!エラーの対処法、Excel 2019で使えない場合の対応バージョンまで、実務で役立つ使い方を網羅的にまとめました。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Excelで「このリストから重複を除いた一覧だけほしい」と思ったこと、ありませんか。</p>



<p class="wp-block-paragraph">取引先名や商品コードをコピペして、目視で重複を消していく。データが増えるたびに同じ作業をやり直す。そんな手作業に時間を取られている方は多いはずです。</p>



<p class="wp-block-paragraph">データタブの「重複の削除」を使う手もあります。ただしこの機能は、元の表そのものを書き換えてしまうんですよね。あとから「やっぱり元に戻したい」と思っても、消えた行は返ってきません。</p>



<p class="wp-block-paragraph">そこで登場するのがUNIQUE関数。数式を1つ書くだけで、重複を除いた一覧が別の場所に自動で作られます。</p>



<p class="wp-block-paragraph">元データには一切手を触れません。しかも元の表を更新すれば、一覧のほうも勝手に付いてきてくれますよ。</p>



<p class="wp-block-paragraph">この記事では、ExcelのUNIQUE関数の使い方を基本から解説します。複数列でのユニーク判定、「重複の削除」機能やCOUNTIF関数との使い分けも扱います。「0が出る」「#SPILL!」といったエラー対処まで、まとめて押さえていきましょう。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-3" checked><label class="toc-title" for="toc-checkbox-3">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">UNIQUE関数とは？Excelで重複を除いた一覧を作る関数</a><ol><li><a href="#toc2" tabindex="0">UNIQUE関数の読み方とできること</a></li><li><a href="#toc3" tabindex="0">UNIQUE関数が使えるExcelのバージョン</a></li><li><a href="#toc4" tabindex="0">基本構文と3つの引数</a></li></ol></li><li><a href="#toc5" tabindex="0">UNIQUE関数の使い方｜基本・複数列・組み合わせまで</a><ol><li><a href="#toc6" tabindex="0">重複を除いたリストを作る（もっとも基本の形）</a></li><li><a href="#toc7" tabindex="0">複数列でユニーク判定する｜同姓同名を1件にまとめないために</a></li><li><a href="#toc8" tabindex="0">1回だけ出現する値を抽出する（第3引数）</a></li><li><a href="#toc9" tabindex="0">横並びのリストは第2引数をTRUEにする</a></li><li><a href="#toc10" tabindex="0">SORT関数で並べ替える</a></li><li><a href="#toc11" tabindex="0">FILTER関数で絞り込んでから重複を除く</a></li><li><a href="#toc12" tabindex="0">件数を数える・1セルにまとめる</a></li><li><a href="#toc13" tabindex="0">出現回数もあわせて表示する（COUNTIF・COUNTIFS）</a></li></ol></li><li><a href="#toc14" tabindex="0">「重複の削除」機能・COUNTIF関数との違い｜どれを使うべき？</a><ol><li><a href="#toc15" tabindex="0">3ウェイ比較表（UNIQUE関数／重複の削除／COUNTIF関数）</a></li><li><a href="#toc16" tabindex="0">COUNTIF関数で重複をチェックする書き方</a></li><li><a href="#toc17" tabindex="0">場面別の使い分け基準</a></li></ol></li><li><a href="#toc18" tabindex="0">UNIQUE関数のよくあるエラーと注意点</a><ol><li><a href="#toc19" tabindex="0">結果に「0」が表示される</a></li><li><a href="#toc20" tabindex="0">#CALC!エラー</a></li><li><a href="#toc21" tabindex="0">#SPILL!エラー</a></li><li><a href="#toc22" tabindex="0">#NAME?エラー</a></li><li><a href="#toc23" tabindex="0">全角・半角や表記ゆれは「別の値」として残る</a></li><li><a href="#toc24" tabindex="0">データを追加しても一覧が増えない</a></li></ol></li><li><a href="#toc25" tabindex="0">よくある質問（FAQ）</a><ol><li><a href="#toc26" tabindex="0">Excel 2019でUNIQUE関数は使えますか？</a></li><li><a href="#toc27" tabindex="0">なぜ結果に「0」が表示されるのですか？</a></li><li><a href="#toc28" tabindex="0">全角・半角が混在するデータは重複と判定されますか？</a></li><li><a href="#toc29" tabindex="0">複数列を指定するときの注意点は？</a></li><li><a href="#toc30" tabindex="0">UNIQUE関数とCOUNTIF関数はどちらを使うべきですか？</a></li></ol></li><li><a href="#toc31" tabindex="0">まとめ</a><ol><li><a href="#toc32" tabindex="0">この記事で紹介した関数・関連記事</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">UNIQUE関数とは？Excelで重複を除いた一覧を作る関数</span></h2>



<h3 class="wp-block-heading"><span id="toc2">UNIQUE関数の読み方とできること</span></h3>



<p class="wp-block-paragraph">UNIQUE関数（読み方：ユニーク関数）は、指定した範囲から重複を取り除いた一覧を返す関数です。英語の「unique」は「唯一の・重複のない」という意味。名前のとおりの働きをしてくれます。</p>



<p class="wp-block-paragraph">たとえば、こんな場面で使えます。</p>



<ul class="wp-block-list"><li>顧客名簿から重複なしの顧客一覧を作る</li><li>商品コードの入力履歴から取扱商品のマスタを起こす</li><li>入力規則（プルダウン）の選択肢を自動で用意する</li></ul>



<p class="wp-block-paragraph">こうした作業が、数式1本で終わります。</p>



<p class="wp-block-paragraph">大事なのは、UNIQUE関数が「動的配列関数」だという点。動的配列関数とは、1つのセルに数式を入れるだけで、結果が必要な広さまで自動で広がるタイプの関数のことです。この自動的に広がる動きを「スピル」と呼びます。</p>



<p class="wp-block-paragraph">つまり4件の一覧が返るなら、数式を入れたセルから下に4行ぶんが勝手に埋まるわけですね。1行ずつコピーする必要はありません。</p>



<p class="wp-block-paragraph">スピルの仕組みそのものを知りたい方は、<a href="https://mashukabu.com/excel-unique-filter-sort-sequence-spill/">スピルで集計・抽出を自動化する方法</a>もあわせてどうぞ。</p>



<h3 class="wp-block-heading"><span id="toc3">UNIQUE関数が使えるExcelのバージョン</span></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>対応バージョン</strong>: UNIQUE関数はMicrosoft 365とExcel 2021以降で使えます。<strong>Excel 2019以前は非対応</strong>です。2019以前で入力すると、関数名が認識されず <code>#NAME?</code> エラーになります。</p></blockquote>



<p class="wp-block-paragraph">対応している環境を具体的に挙げると、次のとおりです。</p>



<ul class="wp-block-list"><li>Microsoft 365（Windows / Mac）</li><li>Excel 2024（Windows / Mac）</li><li>Excel 2021（Windows / Mac）</li><li>Excel for the web（ブラウザ版）</li><li>iPad / iPhone / Android版Excel</li></ul>



<p class="wp-block-paragraph">ブラウザ版のExcelでも問題なく動きます。会社のPCが2019のままでも、Web版が使える環境ならそちらで試せますよ。</p>



<p class="wp-block-paragraph">なお、UNIQUE関数を含むブックを非対応のバージョンで開いた場合は、少し話が変わります。Microsoftの説明では、動的配列数式は互換性チェッカーで検知されます。そのうえでCSE配列数式として表示される、とされています。</p>



<p class="wp-block-paragraph">CSE配列数式とは、Ctrl+Shift+Enterで確定する従来型の配列数式のこと。新規に入力したときの<code>#NAME?</code>とは別の挙動なので、混同しないようにしましょう。</p>



<p class="wp-block-paragraph">バージョン違いによる<code>#NAME?</code>は、<a href="https://mashukabu.com/excel-xlookup-filter-name-error-version/">XLOOKUP・FILTERが使えない原因と対処</a>で詳しく解説しています。9関数×5バージョンの対応表つきです。</p>



<h3 class="wp-block-heading"><span id="toc4">基本構文と3つの引数</span></h3>



<p class="wp-block-paragraph">UNIQUE関数の構文はこちらです。</p>



<pre class="wp-block-code"><code>=UNIQUE(配列, [列の比較], [回数指定])</code></pre>



<p class="wp-block-paragraph">英語表記では <code>=UNIQUE(array, [by_col], [exactly_once])</code> となります。角かっこ [ ] で囲まれた引数は、省略できるという意味です。</p>



<figure class="wp-block-table"><table><thead><tr><th>引数</th><th>必須/省略可</th><th>内容</th><th>既定値</th></tr></thead><tbody><tr><td>配列（array）</td><td>必須</td><td>重複を取り除く元のセル範囲や配列</td><td>&#8211;</td></tr><tr><td>列の比較（by_col）</td><td>省略可</td><td>FALSE＝行同士を比較して一意の行を返す／TRUE＝列同士を比較して一意の列を返す</td><td>FALSE</td></tr><tr><td>回数指定（exactly_once）</td><td>省略可</td><td>FALSE＝重複を1件にまとめた全ユニーク値／TRUE＝1回だけ出現した値のみ</td><td>FALSE</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">必須の引数は第1引数だけ。縦に並んだふつうのリストなら <code>=UNIQUE(A2:A8)</code> と書くだけで動きます。</p>



<p class="wp-block-paragraph">第2引数「列の比較」は、縦長のリストなら省略でOK。横方向に並んだデータを扱うときだけTRUEにする、と覚えておきましょう。</p>



<p class="wp-block-paragraph">第3引数「回数指定」はTRUEにすると意味がガラッと変わります。「重複を1件にまとめる」のではなく、「そもそも1回しか出てこない値だけ」を抜き出す動きになるんです。ここは取り違えやすいポイント。</p>



<h2 class="wp-block-heading"><span id="toc5">UNIQUE関数の使い方｜基本・複数列・組み合わせまで</span></h2>



<p class="wp-block-paragraph">ここからは実際のデータで見ていきます。以下の受注データ（A1:D8）を使って解説しますね。</p>



<figure class="wp-block-table"><table><thead><tr><th>担当者</th><th>部署</th><th>商品名</th><th>金額</th></tr></thead><tbody><tr><td>田中</td><td>営業部</td><td>ノートPC</td><td>128,000</td></tr><tr><td>鈴木</td><td>総務部</td><td>モニター</td><td>32,000</td></tr><tr><td>田中</td><td>経理部</td><td>ノートPC</td><td>128,000</td></tr><tr><td>佐藤</td><td>営業部</td><td>プリンター</td><td>45,000</td></tr><tr><td>鈴木</td><td>総務部</td><td>モニター</td><td>32,000</td></tr><tr><td>佐藤</td><td>営業部</td><td>ノートPC</td><td>128,000</td></tr><tr><td>山田</td><td>開発部</td><td>タブレット</td><td>68,000</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">1行目が見出しで、データは2行目から8行目までの7行です。営業部の「田中」さんと経理部の「田中」さんは別人（同姓同名）という設定にしています。</p>



<h3 class="wp-block-heading"><span id="toc6">重複を除いたリストを作る（もっとも基本の形）</span></h3>



<p class="wp-block-paragraph">まずは担当者の一覧を、重複なしで取り出してみます。</p>



<pre class="wp-block-code"><code>=UNIQUE(A2:A8)</code></pre>



<p class="wp-block-paragraph">結果は4件です。上から「田中」「鈴木」「佐藤」「山田」の順に並びます。</p>



<figure class="wp-block-table"><table><thead><tr><th>担当者</th></tr></thead><tbody><tr><td>田中</td></tr><tr><td>鈴木</td></tr><tr><td>佐藤</td></tr><tr><td>山田</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">数式を入れたのは1セルだけ。それなのに結果は4行ぶんに広がります。これがスピルの働きですね。</p>



<p class="wp-block-paragraph">並び順にも注目してください。UNIQUE関数は元データに登場した順（初出順）で値を返します。あいうえお順や数値の昇順に並べ替えてはくれません。</p>



<p class="wp-block-paragraph">並び順を変えたいときは、後述のSORT関数と組み合わせます。</p>



<p class="wp-block-paragraph">商品名でも書き方は同じ。</p>



<pre class="wp-block-code"><code>=UNIQUE(C2:C8)</code></pre>



<p class="wp-block-paragraph">こちらは「ノートPC」「モニター」「プリンター」「タブレット」の4件が返ります。</p>



<h3 class="wp-block-heading"><span id="toc7">複数列でユニーク判定する｜同姓同名を1件にまとめないために</span></h3>



<p class="wp-block-paragraph">さきほどの <code>=UNIQUE(A2:A8)</code> の結果、実は少し危ういんです。「田中」は1件にまとまっていますが、営業部の田中さんと経理部の田中さんは別人でした。氏名だけで比べると、別人が同一人物として消えてしまいます。</p>



<p class="wp-block-paragraph">こういうときは、範囲を複数列にします。</p>



<pre class="wp-block-code"><code>=UNIQUE(A2:B8)</code></pre>



<p class="wp-block-paragraph">結果は5行2列。担当者と部署のペアで判定されます。</p>



<figure class="wp-block-table"><table><thead><tr><th>担当者</th><th>部署</th></tr></thead><tbody><tr><td>田中</td><td>営業部</td></tr><tr><td>鈴木</td><td>総務部</td></tr><tr><td>田中</td><td>経理部</td></tr><tr><td>佐藤</td><td>営業部</td></tr><tr><td>山田</td><td>開発部</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">UNIQUE関数は既定で「行同士」を比べます。<code>A2:B8</code> を渡すと、氏名と部署の組み合わせがそっくり同じ行だけが重複とみなされるわけです。営業部の田中さんと経理部の田中さんは、別の行としてきちんと残ります。</p>



<p class="wp-block-paragraph">実務では、社員番号や取引先コードを一緒に渡すのが安全策。氏名や商品名のような「人が手入力する文字列」だけで判定すると、思わぬ取りこぼしが起きますよ。</p>



<h3 class="wp-block-heading"><span id="toc8">1回だけ出現する値を抽出する（第3引数）</span></h3>



<p class="wp-block-paragraph">第3引数「回数指定」をTRUEにしてみましょう。</p>



<pre class="wp-block-code"><code>=UNIQUE(A2:A8,FALSE,TRUE)</code></pre>



<p class="wp-block-paragraph">返ってくるのは「山田」だけです。田中・鈴木・佐藤はいずれも2回登場しているため、対象から外れます。</p>



<p class="wp-block-paragraph">第2引数を省略して、カンマだけを置く書き方もできます。</p>



<pre class="wp-block-code"><code>=UNIQUE(A2:A8,,TRUE)</code></pre>



<p class="wp-block-paragraph">商品名で試すとどうなるでしょうか。<code>=UNIQUE(C2:C8,,TRUE)</code> の結果は「プリンター」「タブレット」の2件。ノートPC（3回）とモニター（2回）は除かれます。</p>



<p class="wp-block-paragraph">第3引数の違いは、次のように整理しておくと迷いません。</p>



<ul class="wp-block-list"><li><strong>FALSE（既定）</strong>: 2回以上出た値も1件にまとめ、すべてのユニーク値を返す</li><li><strong>TRUE</strong>: ちょうど1回だけ出た値のみを返す</li></ul>



<p class="wp-block-paragraph">「一度しか取引のない顧客を洗い出す」「1回しか出てこない伝票番号を探す」といった場面で活躍します。</p>



<h3 class="wp-block-heading"><span id="toc9">横並びのリストは第2引数をTRUEにする</span></h3>



<p class="wp-block-paragraph">データが横方向に並んでいるケースも見ておきましょう。別のシートのA1:F1に「田中／鈴木／田中／佐藤／鈴木／山田」と入力されているとします。</p>



<pre class="wp-block-code"><code>=UNIQUE(A1:F1,TRUE)</code></pre>



<p class="wp-block-paragraph">第2引数にTRUEを指定すると、UNIQUE関数は列同士を比較します。結果は「田中」「鈴木」「佐藤」「山田」の1行4列。今度は横方向にスピルします。</p>



<p class="wp-block-paragraph">では、ここで第2引数を省略するとどうなるか。行同士の比較になりますが、対象は1行しかありません。重複は何も除かれず、A1:F1がそのまま6列返ってくるだけです。</p>



<p class="wp-block-paragraph">横並びのデータで「重複が消えない」と感じたら、まず第2引数を疑ってみてください。</p>



<h3 class="wp-block-heading"><span id="toc10">SORT関数で並べ替える</span></h3>



<p class="wp-block-paragraph">UNIQUE関数の結果は初出順でした。見やすく並べ替えたいときは<a href="https://mashukabu.com/excel-function-howto-use-sort/">SORT関数</a>で包みます。</p>



<pre class="wp-block-code"><code>=SORT(UNIQUE(C2:C8))</code></pre>



<p class="wp-block-paragraph">商品名の一覧が昇順で返り、「タブレット」「ノートPC」「プリンター」「モニター」の順に並びます。降順にしたいなら、並べ替えの基準列と順序を指定してください。</p>



<pre class="wp-block-code"><code>=SORT(UNIQUE(C2:C8),1,-1)</code></pre>



<p class="wp-block-paragraph">ひとつ注意があります。漢字を含む文字列は、ふりがな通りの五十音順にはならないことがあります（文字コード順に近い並びになるとされていますが、Microsoft公式のSORT関数ページに明記された仕様ではありません）。確実に五十音順で並べたいときは、<a href="https://mashukabu.com/excel-function-howto-use-sortby/">SORTBY関数</a>とPHONETIC関数の組み合わせを検討しましょう。</p>



<h3 class="wp-block-heading"><span id="toc11">FILTER関数で絞り込んでから重複を除く</span></h3>



<p class="wp-block-paragraph">条件で絞ったうえで重複を除きたい。そんなときは<a href="https://mashukabu.com/excel-function-howto-use-filter/">FILTER関数</a>を内側に入れます。</p>



<pre class="wp-block-code"><code>=UNIQUE(FILTER(C2:C8,B2:B8=&quot;営業部&quot;))</code></pre>



<p class="wp-block-paragraph">ちょっと複雑に見えますが、やっていることはシンプルです。まずFILTER関数が営業部の行だけを抜き出します。次にUNIQUE関数が、その中の重複を取り除きます。</p>



<p class="wp-block-paragraph">営業部の行は3行（ノートPC・プリンター・ノートPC）。ノートPCが1件にまとまり、結果は「ノートPC」「プリンター」の2件になります。</p>



<p class="wp-block-paragraph">なお、内側と外側を逆にした書き方は動きません。</p>



<pre class="wp-block-code"><code>=FILTER(UNIQUE(C2:C8),B2:B8=&quot;営業部&quot;)</code></pre>



<p class="wp-block-paragraph">抽出結果の行数と、条件の行数が食い違うためです。「絞ってから重複除去」の順で覚えておきましょう。</p>



<h3 class="wp-block-heading"><span id="toc12">件数を数える・1セルにまとめる</span></h3>



<p class="wp-block-paragraph">一意な値が何件あるかだけ知りたい。そんなときは<a href="https://mashukabu.com/excel-function-howto-use-counta/">COUNTA関数</a>で囲みます。</p>



<pre class="wp-block-code"><code>=COUNTA(UNIQUE(A2:A8))</code></pre>



<p class="wp-block-paragraph">結果は4。担当者が実質4人いる、とひと目で分かります。</p>



<p class="wp-block-paragraph">ここで気をつけたいのが<a href="https://mashukabu.com/excel-function-howto-use-count/">COUNT関数</a>との違いです。COUNT関数は数値だけを数えるため、担当者名のような文字列の一覧に使うと0が返ってしまいます。文字列を含む一覧を数えるなら、COUNTA関数を選んでください。</p>



<p class="wp-block-paragraph">一意な値をカンマ区切りで1セルにまとめたいときは、<a href="https://mashukabu.com/excel-function-howto-use-textjoin/">TEXTJOIN関数</a>の出番。</p>



<pre class="wp-block-code"><code>=TEXTJOIN(&quot;、&quot;,TRUE,UNIQUE(A2:A8))</code></pre>



<p class="wp-block-paragraph">結果は「田中、鈴木、佐藤、山田」という1つの文字列です。第2引数のTRUEは「空欄を無視する」という指定。メール本文や報告書に貼り付けたいときに重宝します。</p>



<h3 class="wp-block-heading"><span id="toc13">出現回数もあわせて表示する（COUNTIF・COUNTIFS）</span></h3>



<p class="wp-block-paragraph">一意な一覧に「それぞれ何件あるか」を添えると、そのまま簡易集計表になります。</p>



<p class="wp-block-paragraph">まずF2に <code>=UNIQUE(A2:A8)</code> を入力してください。F2:F5に4件の担当者名が展開されます。続いてG2に、次の数式を入力しましょう。</p>



<pre class="wp-block-code"><code>=COUNTIF($A$2:$A$8,F2#)</code></pre>



<p class="wp-block-paragraph"><code>F2#</code> の「#」はスピル範囲演算子と呼ばれる記号です。「F2から広がった結果の全体」をまとめて指します。</p>



<p class="wp-block-paragraph"><a href="https://mashukabu.com/excel-function-howto-use-countif/">COUNTIF関数</a>の数式はG2の1か所だけ。それでも田中2・鈴木2・佐藤2・山田1という件数が、縦に並んで出てきます。</p>



<p class="wp-block-paragraph">複数列の組み合わせで数えるなら、<a href="https://mashukabu.com/excel-function-howto-use-countifs/">COUNTIFS関数</a>の出番。さきほどのF列・G列とぶつからないよう、今度はJ2に <code>=UNIQUE(A2:B8)</code> を入力します。J2:K6に5行2列で展開されますよ。</p>



<p class="wp-block-paragraph">L2に次の数式を入力し、L6までコピーしてください。</p>



<pre class="wp-block-code"><code>=COUNTIFS($A$2:$A$8,J2,$B$2:$B$8,K2)</code></pre>



<p class="wp-block-paragraph">結果は上から1・2・1・2・1。営業部の田中さんは1件、総務部の鈴木さんは2件、という具合に件数が出せます。ピボットテーブルを作るほどでもない集計に便利ですよ。</p>



<h2 class="wp-block-heading"><span id="toc14">「重複の削除」機能・COUNTIF関数との違い｜どれを使うべき？</span></h2>



<p class="wp-block-paragraph">Excelで重複を扱う方法は、UNIQUE関数だけではありません。データタブの「重複の削除」機能、そしてCOUNTIF関数による重複チェック。この3つの違いを押さえておくと、場面に応じて迷わず選べます。</p>



<h3 class="wp-block-heading"><span id="toc15">3ウェイ比較表（UNIQUE関数／重複の削除／COUNTIF関数）</span></h3>



<figure class="wp-block-table"><table><thead><tr><th>比較軸</th><th>UNIQUE関数</th><th>「重複の削除」機能</th><th>COUNTIF関数</th></tr></thead><tbody><tr><td>やること</td><td>重複を除いた一覧を別の場所に作る</td><td>元の表から重複行を消す</td><td>重複しているかを判定する</td></tr><tr><td>元データへの影響</td><td>変更しない（非破壊）</td><td>上書きして削除する（破壊的）</td><td>変更しない（非破壊）</td></tr><tr><td>元データを直したとき</td><td>自動で再計算される</td><td>反映されない（実行し直し）</td><td>自動で再計算される</td></tr><tr><td>一覧づくり</td><td>数式1つで完結</td><td>手作業で都度実行</td><td>単体では作れない</td></tr><tr><td>使えるバージョン</td><td>Microsoft 365 / Excel 2021以降</td><td>ほぼすべてのバージョン</td><td>ほぼすべてのバージョン</td></tr><tr><td>向いている場面</td><td>集計表・プルダウンの元リスト</td><td>一度きりのデータ整理</td><td>入力ミスの発見・重複箇所の可視化</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">いちばん大きな違いは「元データを壊すかどうか」です。Microsoftの公式ページも注意を促しています。「重複する値を削除すると、重複する値が完全に削除されます」という説明です。</p>



<p class="wp-block-paragraph">実行前に別シートや別ブックへコピーしておくことが推奨されているほど。一方のUNIQUE関数は、結果を別のセルに書き出すだけです。気に入らなければ数式を消せば済みます。</p>



<p class="wp-block-paragraph">この気軽さが、日常的に使ううえでは大きな差になりますよ。</p>



<h3 class="wp-block-heading"><span id="toc16">COUNTIF関数で重複をチェックする書き方</span></h3>



<p class="wp-block-paragraph">COUNTIF関数は一覧を作る関数ではありません。「この行は重複か？」を教えてくれる関数です。E2に次の数式を入れて、下方向にコピーします。</p>



<pre class="wp-block-code"><code>=COUNTIF($A$2:$A2,A2)&gt;1</code></pre>



<p class="wp-block-paragraph">範囲の始点だけを絶対参照（$A$2）にして、終点は相対参照（A2）にするのがポイント。こうすると「自分より上に同じ値があるか」を数えられます。</p>



<p class="wp-block-paragraph">サンプルデータでは、4行目の田中・6行目の鈴木・7行目の佐藤がTRUEになります。いずれも2回目に登場した行ですね。条件付き書式と組み合わせれば、重複セルに色を付けることもできます。</p>



<p class="wp-block-paragraph">ただしCOUNTIF関数だけでは、重複を除いた一覧までは作れません。一覧がほしいならUNIQUE、チェックだけならCOUNTIF。この線引きで考えると分かりやすいですよ。</p>



<h3 class="wp-block-heading"><span id="toc17">場面別の使い分け基準</span></h3>



<ul class="wp-block-list"><li><strong>集計表やダッシュボードの元リストを作る</strong> → UNIQUE関数。データが増えても自動で追随します</li><li><strong>入力規則（プルダウン）の選択肢を自動更新したい</strong> → UNIQUE関数</li><li><strong>配布用のファイルから重複行を物理的に消したい</strong> → 「重複の削除」機能</li><li><strong>Excel 2019以前で作業している</strong> → 「重複の削除」機能かCOUNTIF関数（UNIQUEは使えません）</li><li><strong>どこが重複しているかを目で確認したい</strong> → COUNTIF関数＋条件付き書式</li><li><strong>重複は消さずに件数だけ把握したい</strong> → COUNTIF関数 / COUNTIFS関数</li></ul>



<p class="wp-block-paragraph">迷ったら、まずUNIQUE関数を試してみてください。元データを壊さないので、失敗しても数式を消せば元通りです。</p>



<h2 class="wp-block-heading"><span id="toc18">UNIQUE関数のよくあるエラーと注意点</span></h2>



<h3 class="wp-block-heading"><span id="toc19">結果に「0」が表示される</span></h3>



<p class="wp-block-paragraph">元の範囲に空白セルが混じっていると、その空白が「0」として返ることがあります。名前の一覧を作ったはずなのに、末尾にぽつんと0が並ぶ。ありがちなトラブルですよね。</p>



<p class="wp-block-paragraph">理由はシンプルです。Excelでは空のセルを参照すると0として扱われるため、その0がユニークな値の1つとして返ってきます。</p>



<p class="wp-block-paragraph">ちなみに空白セルが何個あっても、出てくる0は1件だけ。重複としてまとめられるからです。</p>



<p class="wp-block-paragraph">対処法は3つあります。1つ目は<a href="https://mashukabu.com/excel-function-howto-use-filter/">FILTER関数</a>で空白を除いてから渡す方法。</p>



<pre class="wp-block-code"><code>=UNIQUE(FILTER(A2:A20,A2:A20&lt;&gt;&quot;&quot;))</code></pre>



<p class="wp-block-paragraph">2つ目は<a href="https://mashukabu.com/excel-function-howto-use-if/">IF関数</a>で空白を空文字に置き換える方法です。</p>



<pre class="wp-block-code"><code>=UNIQUE(IF(A2:A20=&quot;&quot;,&quot;&quot;,A2:A20))</code></pre>



<p class="wp-block-paragraph">この書き方だと、0の代わりに空欄が1件残ります。見た目さえ整えばよい場面なら、これで十分でしょう。</p>



<p class="wp-block-paragraph">3つ目は、複数列をまとめて1列にしたいときの技。<a href="https://mashukabu.com/excel-function-howto-use-tocol/">TOCOL関数</a>の第2引数に1を指定すると、空白を無視して1列に並べ直せます。</p>



<pre class="wp-block-code"><code>=UNIQUE(TOCOL(A2:C20,1))</code></pre>



<p class="wp-block-paragraph">複数の列に散らばった値から、まとめてマスタを作りたいときに便利な組み合わせです。</p>



<h3 class="wp-block-heading"><span id="toc20">#CALC!エラー</span></h3>



<p class="wp-block-paragraph"><code>#CALC!</code> は「計算結果が空っぽ」のときに出るエラーです。UNIQUE関数単体で出ることは少なく、内側に入れたFILTER関数が原因になるケースがほとんど。</p>



<pre class="wp-block-code"><code>=UNIQUE(FILTER(C2:C8,B2:B8=&quot;法務部&quot;))</code></pre>



<p class="wp-block-paragraph">サンプルデータに法務部の行はありません。FILTER関数の結果が0件になり、そのまま<code>#CALC!</code>が返ります。</p>



<p class="wp-block-paragraph">対処は、FILTER関数の第3引数（空の場合）を指定するだけ。</p>



<pre class="wp-block-code"><code>=UNIQUE(FILTER(C2:C8,B2:B8=&quot;法務部&quot;,&quot;該当データなし&quot;))</code></pre>



<p class="wp-block-paragraph">これで「該当データなし」という文字列が表示され、エラーは消えます。空白除去の数式を書いたあとに<code>#CALC!</code>が出たら、この第3引数を思い出してくださいね。</p>



<h3 class="wp-block-heading"><span id="toc21">#SPILL!エラー</span></h3>



<p class="wp-block-paragraph"><code>#SPILL!</code> は「結果を広げたいのに広げられない」ときのエラーです。UNIQUE関数に固有の問題ではなく、スピルする関数に共通のもの。主な原因は次の4つです。</p>



<ul class="wp-block-list"><li><strong>展開先のセルに何か入っている</strong>: 結果が4行必要なのに、2つ下のセルに文字や数式がある</li><li><strong>展開先に結合セルがある</strong>: 結合されたセルにはスピルできません</li><li><strong>Excelテーブルの中に直接入力した</strong>: テーブル内のセルはスピルに対応していません</li><li><strong>列全体（A:Aなど）を参照した</strong>: 展開先がシートの末尾を超えてしまいます</li></ul>



<p class="wp-block-paragraph">対処法は原因ごとにはっきりしています。</p>



<ul class="wp-block-list"><li>展開先のセルを空ける</li><li>結合を解除する</li><li>数式はテーブルの外に置く</li><li>範囲は <code>A2:A1000</code> のように具体的な行数で指定する</li></ul>



<p class="wp-block-paragraph">エラーが出たセルには警告マークが表示され、クリックすると原因の説明を確認できます。まずはそこを見るのが近道ですよ。他のエラー表示については、<a href="https://mashukabu.com/excel-error-value-list/">Excelのエラー値一覧｜種類・原因・対処法</a>にまとめています。</p>



<h3 class="wp-block-heading"><span id="toc22">#NAME?エラー</span></h3>



<p class="wp-block-paragraph"><code>#NAME?</code> は、関数名そのものが認識されていないサインです。原因は2つに絞られます。</p>



<p class="wp-block-paragraph">1つ目はバージョン。Excel 2019以前にはUNIQUE関数が存在しないため、入力しても関数として扱われません。</p>



<p class="wp-block-paragraph">2つ目は単純なスペルミスです。「UNIQE」「UNIQUR」のような打ち間違い、意外とやりがちですよね。</p>



<p class="wp-block-paragraph">バージョンが原因なら、Microsoft 365やExcel 2021以降への移行が根本的な解決になります。すぐに移行できない場合は、「重複の削除」機能かCOUNTIF関数で代用しましょう。</p>



<p class="wp-block-paragraph">判定の手順は<a href="https://mashukabu.com/excel-xlookup-filter-name-error-version/">XLOOKUP・FILTERが使えないときの対処法</a>で詳しく説明しています。</p>



<h3 class="wp-block-heading"><span id="toc23">全角・半角や表記ゆれは「別の値」として残る</span></h3>



<p class="wp-block-paragraph">ここは誤解が多いところ。UNIQUE関数の重複判定には、次のようなクセがあると考えられます。ただしMicrosoft公式のUNIQUE関数ページにはこの挙動の個別記載がなく、COUNTIFなど他の多くのExcel関数に共通する一般的な文字列比較ルールをもとにした整理です。運用前に手元の環境で確認しておくと安心です。</p>



<ul class="wp-block-list"><li><strong>大文字・小文字は区別しない</strong>: 「apple」と「APPLE」は同じ値とみなされ、1件にまとまります</li><li><strong>全角・半角は区別する</strong>: 「ABC-01」と「ＡＢＣ－０１」は別の値として2件とも残ります</li><li><strong>前後の空白も区別する</strong>: 「東京都」と「東京都 」（末尾に空白）は別の値です</li></ul>



<p class="wp-block-paragraph">複数人が入力したデータでは、この違いが必ずと言っていいほど起こります。「見た目は同じなのに重複が消えない」ときは、まず表記ゆれを疑ってみてください。</p>



<p class="wp-block-paragraph">対策は、UNIQUE関数に渡す前に表記をそろえることです。<a href="https://mashukabu.com/excel-function-howto-use-asc/">ASC関数</a>で全角文字を半角に変換し、TRIM関数で余分な空白を落とします。</p>



<pre class="wp-block-code"><code>=UNIQUE(TRIM(ASC(A2:A20)))</code></pre>



<p class="wp-block-paragraph">逆に大文字・小文字までしっかり区別したい場合は、<a href="https://mashukabu.com/excel-function-howto-use-exact/">EXACT関数</a>による比較を検討してください。こうした「見えない違い」でつまずいたときは、<a href="https://mashukabu.com/excel-aggregation-search-mismatch/">Excel集計・検索が合わない原因5つと直し方</a>も参考になります。</p>



<h3 class="wp-block-heading"><span id="toc24">データを追加しても一覧が増えない</span></h3>



<p class="wp-block-paragraph">「新しい行を入力したのに、一覧に出てこない」。これは範囲の指定が原因です。</p>



<p class="wp-block-paragraph"><code>=UNIQUE(A2:A8)</code> と書いた場合、9行目に追加したデータは範囲の外側。当然ながら結果には反映されません。</p>



<p class="wp-block-paragraph">解決策は2つあります。1つは <code>=UNIQUE(A2:A1000)</code> のように、あらかじめ余裕を持たせる方法。ただし空白セルが0として出るので、さきほどのFILTER関数との組み合わせをセットで使ってください。</p>



<p class="wp-block-paragraph">もう1つはExcelテーブルにする方法です。範囲を選んで <code>Ctrl + T</code> でテーブルに変換します。</p>



<p class="wp-block-paragraph">あとは構造化参照で書くだけ。構造化参照とは、テーブル名と列名で範囲を指定する書き方のことです。</p>



<pre class="wp-block-code"><code>=UNIQUE(テーブル1[担当者])</code></pre>



<p class="wp-block-paragraph">テーブルに行を追加すると範囲が自動で広がり、UNIQUE関数の結果も一緒に増えます。こちらのほうが圧倒的にラクですね。</p>



<p class="wp-block-paragraph">ただし数式は、テーブルの外側のセルに置いてください。テーブル内に書くとスピルできず、<code>#SPILL!</code>になってしまいます。</p>



<h2 class="wp-block-heading"><span id="toc25">よくある質問（FAQ）</span></h2>



<h3 class="wp-block-heading"><span id="toc26">Excel 2019でUNIQUE関数は使えますか？</span></h3>



<p class="wp-block-paragraph">使えません。対応しているのはMicrosoft 365・Excel 2024・Excel 2021の3つです。</p>



<p class="wp-block-paragraph">Windows版・Mac版・Excel for the web（ブラウザ版）のいずれでも動きます。iPad / iPhone / Android版Excelでも使えますよ。</p>



<p class="wp-block-paragraph">Excel 2019以前で入力すると<code>#NAME?</code>エラーになります。代わりの手段は、データタブの「重複の削除」機能かCOUNTIF関数による重複チェック。ただし自動更新はされないため、データを更新するたびに作業をやり直す必要があります。</p>



<h3 class="wp-block-heading"><span id="toc27">なぜ結果に「0」が表示されるのですか？</span></h3>



<p class="wp-block-paragraph">指定した範囲に空白セルが含まれているためです。Excelは空のセルを参照すると0として扱うので、その0がユニークな値の1つとして返ってきます。</p>



<p class="wp-block-paragraph"><code>=UNIQUE(FILTER(A2:A20,A2:A20<>""))</code> と書けば解決します。ただし条件に合う行が1件もないと<code>#CALC!</code>になるため、FILTER関数の第3引数もあわせて指定しておくと安心。</p>



<h3 class="wp-block-heading"><span id="toc28">全角・半角が混在するデータは重複と判定されますか？</span></h3>



<p class="wp-block-paragraph">基本的には判定されません。全角と半角は別の文字として扱われるため、「ABC-01」と「ＡＢＣ－０１」は2件とも残ります。一方で大文字・小文字は区別されないため、「apple」と「APPLE」は1件にまとまります（いずれもMicrosoft公式のUNIQUE関数ページに個別の明記はなく、他の多くのExcel関数に共通する一般的な文字列比較ルールに基づく整理です）。</p>



<p class="wp-block-paragraph">事前に<code>ASC</code>関数や<code>TRIM</code>関数で表記をそろえてから渡すのが確実です。</p>



<h3 class="wp-block-heading"><span id="toc29">複数列を指定するときの注意点は？</span></h3>



<p class="wp-block-paragraph">複数列を渡すと「行全体の組み合わせ」で重複が判定されます。1列でも値が違えば、別の行として残ります。判定に関係ない列まで含めると、重複が消えません。</p>



<p class="wp-block-paragraph">たとえば氏名・部署・登録日時の3列を渡した場合、登録日時が違うだけで別人扱いになります。判定に使いたい列だけを範囲に含めるのがコツ。</p>



<p class="wp-block-paragraph">なお、指定できるのは連続した列だけです。離れた列どうしを組み合わせたいときは、作業列を使いましょう。<code>=A2&"_"&D2</code> のような連結値を作り、その列をUNIQUE関数に渡すと確実ですよ。</p>



<h3 class="wp-block-heading"><span id="toc30">UNIQUE関数とCOUNTIF関数はどちらを使うべきですか？</span></h3>



<p class="wp-block-paragraph">目的が違うので、そもそも競合しません。重複を除いた「一覧」がほしいならUNIQUE関数。どの行が重複しているかの「判定」がほしいならCOUNTIF関数です。</p>



<p class="wp-block-paragraph">一覧に件数を添えたいなら、両方を組み合わせるのが正解。<code>=UNIQUE(A2:A8)</code> で一覧を作ります。隣の列に <code>=COUNTIF($A$2:$A$8,F2#)</code> を置けば、担当者ごとの件数まで並びますよ。</p>



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



<p class="wp-block-paragraph">ExcelのUNIQUE関数について、基本の使い方からエラー対処まで解説しました。ポイントをおさらいしておきましょう。</p>



<ul class="wp-block-list"><li><code>=UNIQUE(A2:A8)</code> と書くだけで、重複を除いた一覧がスピルで展開される</li><li>結果は<strong>元データの初出順</strong>。並べ替えたいならSORT関数と組み合わせる</li><li>複数列を渡すと<strong>行全体の組み合わせ</strong>で判定され、同姓同名も区別できる</li><li>第3引数をTRUEにすると「1回だけ出現した値」だけが返る</li><li>元データを壊さず自動更新される点が「重複の削除」機能との最大の違い</li><li>「0」が出たら空白セル、<code>#SPILL!</code>が出たら展開先、<code>#NAME?</code>が出たらバージョンを疑う</li><li>全角・半角や前後の空白は区別されることが多いので、事前にそろえておくと安心</li><li>対応はMicrosoft 365 / Excel 2024 / Excel 2021 / Excel for the webなど。2019以前は非対応</li></ul>



<p class="wp-block-paragraph">GoogleスプレッドシートにもUNIQUE関数があります。構文は <code>UNIQUE(範囲, 列で判定, 完全一致)</code>。引数の数・並び・既定値（いずれもFALSE）はExcel版とほぼ同じです。</p>



<p class="wp-block-paragraph">Sheets版の使い方は<a href="https://mashukabu.com/spreadsheet-unique-function/">スプレッドシートのUNIQUE関数の使い方｜重複を瞬時に除去</a>で解説しています。</p>



<p class="wp-block-paragraph">まずは手元のリストで <code>=UNIQUE(範囲)</code> を試してみてください。慣れてきたらSORT関数やFILTER関数を重ねていくと、毎月のコピペ作業が一気に減りますよ。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc32">この記事で紹介した関数・関連記事</span></h3>



<ul class="wp-block-list"><li><a href="https://mashukabu.com/excel-function-howto-use-sort/">SORT関数の使い方</a></li><li><a href="https://mashukabu.com/excel-function-howto-use-sortby/">SORTBY関数の使い方</a></li><li><a href="https://mashukabu.com/excel-function-howto-use-filter/">FILTER関数の使い方</a></li><li><a href="https://mashukabu.com/excel-function-howto-use-countif/">COUNTIF関数の使い方</a></li><li><a href="https://mashukabu.com/excel-function-howto-use-countifs/">COUNTIFS関数の使い方</a></li><li><a href="https://mashukabu.com/excel-function-howto-use-counta/">COUNTA関数の使い方</a></li><li><a href="https://mashukabu.com/excel-function-howto-use-count/">COUNT関数の使い方</a></li><li><a href="https://mashukabu.com/excel-function-howto-use-textjoin/">TEXTJOIN関数の使い方</a></li><li><a href="https://mashukabu.com/excel-function-howto-use-tocol/">TOCOL関数の使い方</a></li><li><a href="https://mashukabu.com/excel-function-howto-use-xlookup/">XLOOKUP関数の使い方</a></li><li><a href="https://mashukabu.com/excel-unique-filter-sort-sequence-spill/">スピル（動的配列）で集計・抽出を自動化する</a></li><li><a href="https://mashukabu.com/sheets-unique-sequence-sort-dynamic-list/">スプレッドシートのUNIQUE・SEQUENCE・SORT関数で動的リストを作る方法</a></li><li><a href="https://mashukabu.com/excel-function/">Excel関数とは？基本の使い方</a></li><li><a href="https://mashukabu.com/excel-function-list-by-function/">機能別 Excel関数一覧</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/excel-function-howto-use-unique/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
