HOME > 即効テクニック > Excel VBA > その他関連のテクニック > 重複データのチェック1 − For...Nextのネストを使った方法

重複データのチェック1 − For...Nextのネストを使った方法|Excel VBA

その他関連のテクニック

重複データのチェック1 − For...Nextのネストを使った方法

(Excel 2000/2002/2003/2007/2010)

次のサンプルは、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メソッド(フィルタオプション)を使って抽出する方法も高速です。