重複データのチェック1 − For...Nextのネストを使った方法|Excel VBA |
次のサンプルは、A列から重複を取り除いたデータをB列に出力します。
今回は、For...Nextループを2重にネストしてチェックします。
まず、A列のデータ数を取得します。
外側のFor...Nextループで1行目からA列の全データ数分、繰り返し処理を行います。
内側のFor...Nextループでは、B列の値を2行目から最終行まで調べていき、A列と同じ値がなかった場合に、A列の値をB列の最後に出力して、外側のループに戻ります。
B列に同じ値があった場合は、内側のFor...Nextループを抜け、外側のループに戻ってA列の次の値をチェックします。
A列、B列とも1行目は見出し行とします。
A列の2行目以降にデータを入力し、重複データも用意して実行してください。
Sub Sample()
Dim APos As Long, BPos As Long
Dim ALastRow As Long, BLastRow As Long
'結果を表示するB列を空にする
Columns("B").ClearContents
Range("B1").Value = "重複なしデータ"
'A列の最終行番号を取得
ALastRow = Cells(Rows.Count, 1).End(xlUp).Row
'B列の最終行番号を1(見出し行のみ)に設定
BLastRow = 1
'A列のデータの数だけ繰り返す
For APos = 2 To ALastRow
'A列のAPos行の値がB列にあるかをチェック
For BPos = 2 To BLastRow
If Cells(APos, 1).Value = Cells(BPos, 2).Value Then
'B列にあったらチェック終了
Exit For
End If
Next BPos
'同じ値がなかったら、A列の値を出力し、B列の最終行番号を1増やす
If BPos = BLastRow + 1 Then
Cells(BPos, 2).Value = Cells(APos, 1).Value
BLastRow = BLastRow + 1
End If
Next APos
End Sub
ただし、この方法はA列のすべての値について、1つ1つB列に既に同じ値がないかをチェックするため、データ数が多い場合や、重複が少ない場合は非常に時間がかかります。
そのような場合は、B列の存在チェックにFindメソッドを使ったり、ワークシート関数のCOUNTIF関数を使ったりするとよいでしょう。
またAdvancedFilterメソッド(フィルタオプション)を使って抽出する方法も高速です。