サラリーマンの投資と仕事研究所

サラリーマンのビジネス手法研究とその実践記録

【VBA】リストに重複しているデータを両方(3つ以上はすべて)削除する方法

エクセルの2000、2003のバージョンでは重複しているデータを無視するということができたらしいですが、それ以降のバージョンで重複しているデータをすべて削除する方法を工夫してみました。

方向としてはExcelでできる処理をVBAに乗せていくというわかりやすい方法で進めたいと思います。

【目次】

Excelで重複しているデータを判別する方法

A列のデータで重複するものがあるかどうかのチェック方法

=COUNTIF(A:A,A1)

A1セルの内容がA列に何個あるか数えるという処理方法です。これが式の答えが2以上であれば、重複しているという事になります。

2つの列データで確認したい場合

2つにデータがまたがっている場合には1列にしましょう。その時にどちらの列のデータなのかが分かるように隣に数字や記号を打っておくと良いと思います。

f:id:kazooloop:20170406110038j:plain

これで重複している2以上のデータを削除すればOKです。

VBAにしてみる

A列にデータがあるとしてVBAを書いてみます。

sub 重複両方削除()

'A列データの最終行を定義
Dim MaxrowA As Long
MaxrowA = Cells(Rows.Count, "A").End(xlUp).Row

'B列に判別式を記入
Range("B1").Formula = "=COUNTIF(A:A,A1)"

'B列の対応するセルに式をコピペ
Range("F4").Copy
Range(Cells(2, "B"), Cells(MaxrowA, "B")).Select
Selection.PasteSpecial Paste:=xlPasteAll

'A列とB列をソートし、B列を昇順にソート
    Columns("A:B").Select
    ActiveSheet.Sort.SortFields.Clear
    ActiveSheet.Sort.SortFields.Add Key:=Range("B:B"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveSheet.Sort
        .SetRange Range("A:B")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

’式を検索対象に含めないようにするため、B列を値に変換
Range("B:B").Copy
Range("B:B").PasteSpecial Paste:=xlPasteValues

'B列で2が最初に出てくる場所を特定・取得
Columns("B:B").Select
Selection.Find(What:="2", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
        :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False, MatchByte:=False, SearchFormat:=False).Activate

Dim nowrow As Long
nowrow = ActiveCell.Row

'全て重複していた場合にセルが2番に指定されるので、カバーする

If nowrow = 2 Then
   nowrow = 1
End If

'2以上のデータを消す
Range(Cells(nowrow, "A"), Cells(MaxrowA, "B")).Clear

'B列を消す
Range("B:B")).Clear

End sub