大体でIT

-ちょっと使えるネタを紹介-

大体でIT

Excel VBAで、重複しないリストを抽出する方法について、ご紹介します。重複しないリストの抽出は、エクセル機能だと「フィルターオプション」で、VBAコードだと「AdvancedFilter」でできます。具体的なVBAコードを使って、重複しないリストの抽出について解説していきます。

はじめに

この記事では、重複しないリストを抽出する方法について、ご紹介します。

重複しないリストが抽出できれば、データ解析や、抽出したリストを選択用のプルダウンとして使うことができます。

重複しないリストの抽出は、エクセル機能の「フィルターオプション」を使うと、簡単に抽出することができます。

VBAコードで、重複しないリストの抽出は、「AdvancedFilter」を使います。

では、重複しないリストを抽出する方法について、解説していきます。

この記事で紹介すること

  • 重複しないリストを抽出する

本記事の内容を動画でまとめています

目次から見たい項目へ移動すると便利ですよ。

目次

ポイントなるVBAコード

初めに、重複しないリストの抽出について、ポイントとなるVBAコードを記載しておきます。

VBAコードだけ確認したい場合に、ご活用ください。

'重複しないリストを抽出
ActiveSheet.Range("B1:B11").AdvancedFilter Action:=xlFilterInPlace, Unique:=True

では、解説していきます。

VBAで重複しないリストを抽出

VBAで、重複しないリストを抽出する方法について、ご紹介します。

重複しないリストが抽出できれば、データ解析や、抽出したリストを選択用のプルダウンとして使うことができます。

エクセルの機能で「フィルターオプション」を使う

重複しないリストの抽出は、エクセルの機能で「フィルターオプション」を使うとできます。

では、エクセルの機能で「フィルターオプション」を使って、重複しないリストを抽出してみます。

重複したデータを用意しました。

重複データ

重複したデータ

エクセルの「データ」タブの「詳細設定」をクリックします。

「データ」タブの「詳細設定」をクリック

エクセルの「データ」タブの「詳細設定」をクリック

クリックすると、「フィルターオプションの設定」という画面が表示されます。

フィルターオプション

フィルターオプションの設定が表示される

この表示の「リスト範囲」を選択して、重複しないリストを作成したい列を選択します。

リスト範囲を設定

リスト範囲に、重複しないリストを作成したい列を設定する

次に、「重複するレコードは無視する」にチェックを入れます。

重複するレコードは無視する

重複するレコードは無視するにチェックを入れる

OKをクリックすると、「商品」の列で重複しないリストを抽出することができます。

重複しないリストを抽出

重複しないリストを抽出する

「商品」の列で、重複しないリストだけを、抽出することができました。

解除したい場合は、「データ」タブの「クリア」をクリックします。

フィルタの解除

解除する場合は、「データ」タブの「クリア」をクリックする

重複しないリストの抽出が、解除されます。

フィルタが解除される

重複しないリストの抽出が解除される

重複しないリストの抽出が解除されました。

「フィルターオプション」、かなり使えます。

ボタンをクリックして設定すると面倒なので、VBAでこの作業を自動化していきます。

AdvancedFilterで重複しないリストを抽出

エクセル機能の「フィルターオプション」は、VBAでは「AdvancedFilter」を使います。

「AdvancedFilter」を使って、重複しないリストを抽出するVBAコードは、こちらになります。

Sub TEST1()
    
    '1列に対して、重複しないリストを抽出
    ActiveSheet.Range("B1:B11").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
    
End Sub

重複をしないリストを作成する列を、範囲として選択します。

重複をするレコードを無視するために、「Unique:=True」と入力しています。

次の重複するデータを用意しました。

重複データ

重複するデータ

では、VBAコードを実行してみます。

AdvancedFilterで重複しないリストを抽出

AdvancedFilterを使って重複しないリストを抽出した結果

重複しないリストを抽出できました。

VBAコードで、1行で書けるのでかなりシンプルです。

複数列で重複しないリストを抽出

重複しないリストの抽出は、複数列でもできます。

複数の列をみて、重複しないリストを抽出します。

Sub TEST2()
    
    '2列に対して、重複しないリストを抽出
    ActiveSheet.Range("B1:C11").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
    
End Sub

やり方は、選択する範囲を複数列「.Range("B1:C11")」にします。

重複するデータを用意しました。

重複するデータ

重複するデータ

VBAコードを実行してみます。

複数列で重複しないリストを抽出

AdvancedFilterを使って複数列で重複しないリストを抽出した結果

複数列で重複しないリストを、抽出できました。

AdvancedFilterの解除

「AdvancedFilter」でフィルタしたデータの解除は、「ShowAllData」を使います。

オートフィルタと同じですね。

「AdvancedFilter」でフィルタして、解除するVBAコードです。

Sub TEST3()
    
    '1列に対して、重複しないリストを抽出
    ActiveSheet.Range("B1:B11").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
    
    'フィルタされている場合
    If ActiveSheet.FilterMode Then
        'フィルタを解除
        ActiveSheet.ShowAllData
    End If
    
End Sub

重複データを用意しました。

重複データ

重複データ

では、VBAコードを実行します。

AdvancedFilterでフィルタ

AdvancedFilterでフィルタした結果

重複しないリストを抽出できました。

では、フィルタを解除します。

ShowAllDataでフィルタを解除

ShowAllDataでフィルタを解除した結果

ShowAllDataでフィルタを解除できました。

時間を計測

つづいて、「AdvancedFilter」の実行速度を計測してみます。

50,001行の重複するデータを用意しました。

50,001行の重複データ

50001行の重複するデータ

重複しないリストを抽出するVBAコードです。

Sub TEST4()
    
    t = Timer
    
    '1列に対して、重複しないりリストを抽出
    ActiveSheet.Range("B1:B50001").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
    
    Debug.Print Timer - t & " 秒"
    
End Sub

では、実行してみます。

重複しないリストを抽出できました。

重複しないリストを抽出

AdvancedFilterで重複しないリストを抽出した結果

重複しないリストを抽出できました。

かかった時間

かかった時間は、「0.109 秒」となりました。

かなり速いですね。

重複しないリストを抽出する場合は、「AdvancedFilter」が速くて、VBAコードもシンプルです。

VBAで重複しないリストを作成

次は、「AdvancedFilter」を使って、重複しないリストを作成してみます。

やり方は、「AdvancedFilter」を使って重複しないリストを抽出して、抽出したデータをコピーする、という方法です。

重複しないリストを作成

では、「AdvancedFilter」を使って、重複しないリストを作成してみます。

Sub TEST5()
    
    '1列に対して、重複しないリストを抽出
    ActiveSheet.Range("B1:B11").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
    
    '重複しないリストをコピー
    ActiveSheet.Range("A1").CurrentRegion.Copy ActiveSheet.Range("D1")
    
    'フィルタされている場合
    If ActiveSheet.FilterMode = True Then
        'フィルタ解除
        ActiveSheet.ShowAllData
    End If
    
End Sub

手順としては、

  • ①重複するリストを抽出
  • ②抽出したデータをコピー
  • ③フィルタを解除

という流れです。

重複するデータを用意しました。

重複するデータ

重複するデータを用意

では、VBAコードを実行します。

実行する手順

1列で、重複しないデータを抽出します。

重複しないデータを抽出します

フィルタした結果を、別セルにコピーします。

フィルタ結果を、別セルにコピーします

最後に、フィルタを解除します。

フィルタを解除します

これで、重複しないリストを作成することができます。

重複しないリストを作成できた

AdvancedFilterで重複しないデータを作成した結果

重複しないデータを、作成することができました。

重複しないリストを使って、選択用のプルダウンで使うことができます。

別シートに重複しないリストを作成

別シートに、重複しないリストを作成する方法です。

元のシートには変更を加えないで、重複しないリストを作成することができます。

別シートに、重複しないリストを作成するVBAコードです。

Sub TEST6()
    
    '1列に対して、重複しないリストを抽出
    ActiveSheet.Range("B1:B11").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
    
    '元のシートの右側に、シートを追加
    Worksheets.Add after:=ActiveSheet
    
    '追加したシートに、重複しないリストをコピー
    ActiveSheet.Previous.Range("A1").CurrentRegion.Copy ActiveSheet.Range("A1")
    
    'フィルタされている場合
    If ActiveSheet.Previous.FilterMode Then
        'フィルタを解除
        ActiveSheet.Previous.ShowAllData
    End If
    
End Sub

手順としては、

  • ①重複しないリストを抽出
  • ②元のシートの右側に、シートを追加する
  • ③追加したシートに重複しないリストをコピー
  • ④元シートのフィルタを解除

という手順です。

重複したデータを用意しました。

重複するデータ

重複したデータ

では、VBAコードを実行します。

実行する手順

1列分で、重複しないデータを抽出します。

1列分で、重複しないデータを抽出します

シートを追加します。

シートを追加します

追加したシートに、フィルタ結果を貼り付けます。

追加したシートに、フィルタ結果を貼り付けます

最後に、元シートのフィルタを解除します。

元シートのフィルタを解除します

これで、別シートに重複しないリストを作成することができます。

別シートに重複しないリストを作成

AdvancedFilterを使って別シートに重複しないリストを作成した結果

別シートに、重複しないリストを作成できました。

元のシートはそのままです。

元シートはそのまま

元のシートはそのまま

元のシートには、変更を加えていません。

別シートを使えば、元シートに変更を加えず、重複しないリストを作成することができます。

別ブックに重複しないリストを作成

次は、別ブックに重複しないリストを作成する方法です。

別ブックを使えば、元のブックに変更を加えず、重複しないリストを作成することができます。

別ブックに、重複しないリストを作成するVBAコードです。

Sub TEST7()
    
    '1列に対して、重複しないリストを抽出
    ActiveSheet.Range("B1:B11").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
    
    '元のシートの右側に、シートを追加
    Worksheets.Add after:=ActiveSheet
    
    '追加したシートに、重複しないリストをコピー
    ActiveSheet.Previous.Range("A1").CurrentRegion.Copy ActiveSheet.Range("A1")
    
    'フィルタされている場合
    If ActiveSheet.Previous.FilterMode Then
        'フィルタを解除
        ActiveSheet.Previous.ShowAllData
    End If
    
    '追加したシートを、新規ブックに移動
    ActiveSheet.Move
    '新規ブックを、名前を付けて保存
    ActiveWorkbook.SaveAs ThisWorkbook.Path & "\TEST.xlsx"
    '新規ブックを閉じる
    ActiveWorkbook.Close
    
End Sub

手順としては、

  • ①重複しないリストを抽出
  • ②元のシートの右側に、シートを追加する
  • ③追加したシートに重複しないリストをコピー
  • ④元シートのフィルタを解除
  • ⑤追加したシートを別ブックに移動
  • ⑥名前を付けて保存して、閉じる

という流れです。

途中までは、別シートに作成する方法と同じです。

別シートに一旦、重複しないリストを作成して、そのあとに別ブックに移動するという方法です。

重複したデータを用意しました。

重複するデータ

重複したデータ

では、VBAコードを実行します。

別シートに重複しないリストを作成

別シートに重複しないリストが作成される

まず、別シートに重複しないリストが作成されました。

追加したシートを別ブックに移動して保存します。

別ブックが作成される

別ブックが作成される

別ブックが作成されました。

ファイルの中身を開いてみます。

別ブックに重複しないリストが作成される

別ブックに重複しないリストが作成される

重複しないリストが作成されました。

もちろん、元のブックはそのままです。

元ブックはそのまま

元のブックはそのまま

元のブックに変更はありません。

おわりに

この記事では、重複しないリストを抽出する方法について、ご紹介しました。

重複しないリストの抽出は、エクセル機能の「フィルターオプション」を使うと、簡単に抽出することができます。

VBAコードで、重複しないリストの抽出は、「AdvancedFilter」を使うとできます。

重複しないリストを作成できれば、選択用のプルダウンに使えます。

参考になればと思います。最後までご覧くださいまして、ありがとうございました。

関連する記事から探す

カテゴリから探す

カテゴリから見たい項目を探すと便利ですよ。

サイト内を検索する

↓キーワードを入力する

アーカイブから探す