今回はマクロで重複した値を削除する方法を備忘録も兼ねて残しておきたいと思います。
やり方をざっくり説明
重複した値を削除するにはOn Error Resume Next
とCollection
を使用します。
On Error Resume Next
Dim col as Collection
Set col = new Collection
なぜこの2つを使うのか、そちらを簡単に説明します。
まずOn Error Resume Next
について説明しますが、ざっくり言うと実行中にエラーが起きても処理を止めずに進めることが出来るようになるステートメントです。
これをマクロ内に記述すると、以降実行中にエラーが起きても処理が最後まで進みます。
詳細は下記リンクをご確認ください。
そしてCollection
についてざっくり言うと、それぞれ値とキーを紐づけるような形で格納することが出来る配列のようなもの、といった感じです。
Collectionに値を追加するにはItemとKeyをそれぞれ指定して追加するようになっています。
以下のような感じで記述します。
'Item:値
'Key:キー
col.Add Item:="はりぼな" Key:="Key1"
ここでポイントなのが、Itemは重複しても問題ありませんが、Keyは重複してはいけないという点で、既にCollection
に格納済みのKey
を追加しようとするとエラーになってしまい、Collection
に追加することができないのです。
この性質を利用し、前述したOn Error Resume Next
と組み合わせることで重複した値を疑似的に削除する、といったことが出来るわけです。
重複した値を削除する方法
それでは実際に重複した値を削除する方法を紹介したいと思います。
今回はシート上のリストから重複分を削除したリストを取得する方法と、特定の文字列内で重複した値を削除する方法の2つを紹介します。
シート上のリストから重複分を削除したリストを取得する方法
以下のシートを使用して紹介します。
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列に出力されます。
特定の文字列内で重複した値を削除する方法
次に特定の文字列内で重複した値を削除する方法ですが、実際にあった事例を基に紹介します。
その事例というのが以下のように特定の文字で区切られた文字列内で重複する文字を削除したい、というものです。
リンゴ/バナナ/イチゴ/イチゴ/バナナ/リンゴ/グレープフルーツ/バナナ/グレープフルーツ
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
実行すると重複分が削除された文字列がメッセージボックスに出力されます。
まとめ
今回はマクロで重複した値を削除する方法を紹介しました。
On Error Resume Next
とCollection
を組み合わせることで重複分を削除することができるので、是非参考にしていただければと思います。
このブログではVBAに関する記事を不定期で投稿していますので、是非ご覧ください!
コメント