【Excel VBA】マクロで重複した値を削除する方法を紹介【備忘録】

Excel
スポンサーリンク

今回はマクロで重複した値を削除する方法を備忘録も兼ねて残しておきたいと思います。

スポンサーリンク

やり方をざっくり説明

重複した値を削除するにはOn Error Resume NextCollectionを使用します。

On Error Resume Next
Dim col as Collection

Set col = new Collection

なぜこの2つを使うのか、そちらを簡単に説明します。

まずOn Error Resume Nextについて説明しますが、ざっくり言うと実行中にエラーが起きても処理を止めずに進めることが出来るようになるステートメントです。
これをマクロ内に記述すると、以降実行中にエラーが起きても処理が最後まで進みます。

詳細は下記リンクをご確認ください。

On Error ステートメント (VBA)
Office VBA リファレンス トピック

そしてCollectionについてざっくり言うと、それぞれ値とキーを紐づけるような形で格納することが出来る配列のようなもの、といった感じです。

Collection オブジェクト
Office VBA リファレンス トピック

Collectionに値を追加するにはItemKeyをそれぞれ指定して追加するようになっています。
以下のような感じで記述します。

'Item:値
'Key:キー
col.Add Item:="はりぼな" Key:="Key1"

ここでポイントなのが、Itemは重複しても問題ありませんが、Keyは重複してはいけないという点で、既にCollectionに格納済みのKeyを追加しようとするとエラーになってしまい、Collectionに追加することができないのです。

やり方をざっくり説明_1

この性質を利用し、前述したOn Error Resume Nextと組み合わせることで重複した値を疑似的に削除する、といったことが出来るわけです。

スポンサーリンク

重複した値を削除する方法

それでは実際に重複した値を削除する方法を紹介したいと思います。

今回はシート上のリストから重複分を削除したリストを取得する方法と、特定の文字列内で重複した値を削除する方法の2つを紹介します。

シート上のリストから重複分を削除したリストを取得する方法

以下のシートを使用して紹介します。

重複した値を削除する方法_シート上のリストから重複分を削除したリストを取得する方法_1
Sub 重複削除_セル()
    
    Dim target_Sht              As Worksheet
    Dim col_Fruit               As Collection
    Dim i                       As Long
    
    Application.ScreenUpdating = False
        
    On Error Resume Next
    
    Set target_Sht = ThisWorkbook.ActiveSheet
    Set col_Fruit = New Collection
    
    With target_Sht
        'A列の重複チェック
        i = 1
        Do Until IsEmpty(.Range("A1").Offset(i, 0))
            col_Fruit.Add Item:=.Range("A1").Offset(i, 0), _
                          Key:=.Range("A1").Offset(i, 0)
            i = i + 1
        Loop
    
        'B列のにCollection書き出し
        For i = 1 To col_Fruit.Count
            .Range("B1").Offset(i, 0) = col_Fruit(i)
        Next i
    
    End With
    
    
    Application.ScreenUpdating = True
    
    
End Sub

実行すると重複分が削除されたリストがB列に出力されます。

重複した値を削除する方法_シート上のリストから重複分を削除したリストを取得する方法_2

特定の文字列内で重複した値を削除する方法

次に特定の文字列内で重複した値を削除する方法ですが、実際にあった事例を基に紹介します。

その事例というのが以下のように特定の文字で区切られた文字列内で重複する文字を削除したい、というものです。

リンゴ/バナナ/イチゴ/イチゴ/バナナ/リンゴ/グレープフルーツ/バナナ/グレープフルーツ
Sub 重複削除_文字列()
    
    Dim col_Fruit               As Collection
    
    Dim ary_target_Str()        As String
    
    Dim target_Str              As String
    Dim target_Str_削除後       As String
    
    Dim i                       As Long
    
    Application.ScreenUpdating = False
        
    On Error Resume Next
    
    Set col_Fruit = New Collection
    
    
    '対象の文字列
    target_Str = "リンゴ/バナナ/イチゴ/イチゴ/バナナ/リンゴ/グレープフルーツ/バナナ/グレープフルーツ"
    
    ary_target_Str = Split(target_Str, "/")
    
    'Collectionに追加
    For i = 0 To UBound(ary_target_Str)
        col_Fruit.Add Item:=ary_target_Str(i), _
                      Key:=ary_target_Str(i)
    Next i
    
    'Collectionに追加した文字列を結合
    For i = 1 To col_Fruit.Count
        target_Str_削除後 = WorksheetFunction.TextJoin("/", True, target_Str_削除後, col_Fruit(i))
    Next i
    
    '表示
    MsgBox target_Str_削除後
    
    Application.ScreenUpdating = True
    
End Sub

実行すると重複分が削除された文字列がメッセージボックスに出力されます。

重複した値を削除する方法_特定の文字列内で重複した値を削除する方法_1
スポンサーリンク

まとめ

今回はマクロで重複した値を削除する方法を紹介しました。

On Error Resume NextCollectionを組み合わせることで重複分を削除することができるので、是非参考にしていただければと思います。

このブログではVBAに関する記事を不定期で投稿していますので、是非ご覧ください!

タイトルとURLをコピーしました