エクセルバージョン
マイクロソフト365
本日はエクセルVBAで重複削除データの作成方法について解説していきたいと思います(((^-^)))
今回はRemoveDuplicatesメソッドとDictionaryオブジェクトの2つの方法で重複削除データを作成していきます。
それではいってみましょう!
Menu
RemoveDuplicatesメソッド
RemoveDuplicatesはエクセルの純正機能のデータ→重複の削除と一緒の動作です。
マクロの記録でVBAコードを記録させるとRemoveDuplicatesが記録されるので、あとはVBAで少し編集すれば柔軟に重複を簡単に削除させることができます。
特徴としては元データをそのまま重複削除します。
データが1列のみの重複削除
A列のみの重複データを削除する例
1 2 3 4 5 6 7 8 9 10 | Option Explicit Sub 列指定で重複削除() 'A列を重複削除 Columns("A").RemoveDuplicates _ Columns:=1, _ Header:=xlNo '見出しなし End Sub |
【結果】
同じ値が重複してる色のみが一瞬で削除されます(*^^)v
下記のような先頭行に見出しがない場合はHeader:= xlNoにします。
※複数列を指定したい場合
例(A列からC列)
Columns(“A:C”) みたいな感じでも指定できます。
データが複数列の値が一致する重複削除
A列とB列の2列の値が一致する重複削除サンプル
【重複データ】
重複してる値は以下になります。
・ハイボール 200
・ハイボール 250
・ビール 200
・ビール 230
1 2 3 4 5 6 7 8 9 10 11 12 | Option Explicit '定数(セル範囲指定) Const STARTCELL As String = "A1" '範囲開始セル Const ENDCELL As String = "B10" '範囲終わりセル Sub 範囲選択の重複削除() Range(STARTCELL & ":" & ENDCELL).RemoveDuplicates _ Columns:=Array(1, 2), _ Header:=xlYes '見出しあり End Sub |
【結果】
2列の重複している値が一瞬で削除されます\(^^)/
下記のような先頭行に品名と金額のような見出しがある場合はHeader:= xlYesにします。
パラメーター
➀Columns → データが1列のみは1を指定します。
②Header:= xlNo / xlYes / xlGuess
・xlNo → 見出しがないの時に指定(初期値)
・xlYes → 見出しがあるの時に指定
・xlGuess → 見出しがあるかを自動で判別
Dictionaryオブジェクト(連想配列)
概要
・Dictionaryオブジェクトは 連想配列を作成することができます。
・連想配列とはキーと値が格納ができる配列です。エクセルでも使用ができ、その他のプログラム言語でも連想配列はよく使用します。
・通常の配列はインデックス(添え字0からの番号)で値(要素)を取得しますが、連想配列はキーで値を取得することができます。
・キーは任意の文字などを使用することができます。
作成方法
手順は2つのみなので慣れれば簡単です!
➀Dictionaryオブジェクト(連想配列)を作成し、Existsメソッドで重複があるかを判定します。
②連想配列に存在しなかったら、繰り返し処理(ForEach)で、連想配列にキーと値を追加して、キーのみをセルに書きこんで完成です。
サンプルコード
今回はA列に下記ようなお酒の重複データを使用して解説します。
内容はB列に重複が削除されたデータが出来上がるというサンプルコードです(*^^)v
定数がパラメータになってますのでエクセルの形式がそれぞれ違うと思うので変更してみてください。
下記を標準モジュールにコピペ(*゚▽゚)ノ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | Option Explicit '定数 Const DATACOL As String = "A" 'データの列 Const RESCOL As String = "B" '結果の列 Const STARTROW As Integer = 1 'データの行頭番号 Sub 重複を削除() '変数 Dim rng, dataRange As Range Dim rowNum, rowEnd As Integer '結果列を消去 Columns(RESCOL).ClearContents 'データ範囲(今回はA列) rowEnd = Cells(Rows.Count, DATACOL).End(xlUp).Row Set dataRange = Range(Cells(STARTROW, DATACOL), Cells(rowEnd, DATACOL)) 'オブジェクト作成(連想配列) Dim objDic As Object Set objDic = CreateObject("Scripting.Dictionary") '繰り返し処理 rowNum = STARTROW For Each rng In dataRange 'rng.Valueが連想配列に存在しなかったら処理 If objDic.Exists(rng.Value) = False Then '連想配列のキーにrng.Valueを追加。値は今回使用しないので全部Nothing。 objDic.Add rng.Value, "Nothing" 'セルに書込(今回はB列) Cells(rowNum, RESCOL) = rng.Value '行番号を1プラスする rowNum = rowNum + 1 End If Next 'データ数を取得 MsgBox "データ数は : " & objDic.Count Set objDic = Nothing End Sub |
【結果】
B列に重複が削除されたデータが出来上がり、データの個数がメッセージボックスに表示されます\(^^)/
サンプルコード解説
➀まず1番目のハイボールをIF判定して、ハイボールは連想配列のキーにまだ存在しないので、Existsの値がFalse(まだないよ!)なので処理を実行します。
②IF判定でFalse(まだないよ!)なので処理が実行されAddメソッドで連想配列のキーに一番目のハイボールが追加されます。この時点で1番目のハイボールは連想配列のキーに存在するので、Existsの値が瞬時にTrue(もうあるよ~)に(ここが重要です)切り替わり、countプロパティが+1されます。
③繰り返し処理(ForEach)で2番目のハイボールをIFで判定しますが、ハイボールは既に連想配列に存在するのでIF判定でExistsの値はTrue(もうあるよ~)判定となり、追加処理はなしで次の値に移行します。
④次の3番目のレモンサワーは連想配列のキーにまだ存在しないので、IF判定でExistsの値がFalse(まだないよ!)なので②と同じ処理追加をし、countプロパティが+1されて、この時点の合計が2になります。
⑤この流れをデータ分ず~っと繰り返し、B列に重複削除データが作成されていきます(*^^)v
⑥最後のメッセージボックスのデータの個数は、countプロパティでオブジェクト.countで簡単に取得ができます。
試す場合は、A列に重複データをセットして実行で、B列に重複削除データがサクッと完成します。
まとめ
今回はRemoveDuplicatesメソッドとDictionaryオブジェクトで重複を削除してみました。
DictionaryのExistsメソッドは連想配列のキーが存在するかを判定してくれるので非常にありがたく重宝できますね!
以上です。
重複データを削除関連
【基本】重複非表示と違う列に削除データ作成(フィルターオプション)
【VBA】重複削除データの作成方法(RemoveDuplicatesとDictionary)
データが1回も重複しかったデータを取得関連
【関数】データが1回も重複しなかったデータを取得(UNIQUE関数)
【VBA】1回も重複しなかったデータを取得(Formula2R1C1とUNIQUE)
重複しない乱数関連
【VBA】重複しない乱数作成と指定範囲をランダム表示(Rnd)
【JavaScript/JQuery】重複なしのランダムデータを作成