Home > 即効テクニック > Excel VBA > その他関連のテクニック > 重複データのチェック <1>「For〜Next」と「DoWhile〜Loop」を使った方法

即効テクニック

その他関連のテクニック

重複データのチェック <1>「For〜Next」と「DoWhile〜Loop」を使った方法

( - )
●詳細● 
サンプルでは、A列のデータから、重複データを取り除いた結果をB列に抽出します。
今回は、「For〜Next」と「Do While〜Loop」を使ってチェックします。
まずは、A列のデータの総件数を取得します。「For〜Next」で1件目から総件数分、処理を行います。その中で、「Do While〜Loop」を使って重複チェックの処理をします。
「Do While〜Loop」の条件は、「B列が””でない間(B列に値がある間)」で、A列の内容をB列の1件目から比べていきます。B列に同じデータが無かった場合は、A列の内容をB列の最後にセットし、A列の次のデータをチェックします。
同じデータがあった場合は、「Do While〜Loop」を抜けて、A列の次のデータをチェックします。A列の全データのチェックが終了したら、メッセージボックスで「総件数中何件が重複していて、何件が抽出された」かを表示します。

●準備● 
*A列に何件かデータを入力し、重複データも用意してください。

●サンプル●
Sub Sample()

 Dim APos As Integer
 Dim BPos As Integer
 Dim SetPos As Integer
 Dim CellPos As String
 Dim AllSu As Integer

 '<結果を表示するB列を空にします。>
 Columns("B:B").Select
 Selection.ClearContents 

 '<最終データが入力されているセルに移動します。
 'データが無い場合は”A1”がSelectされます。>
 Range("A65536").End(xlUp).Select

 '<最終データ(セル)のアドレスを取得します。>
 CellPos = Selection.Address()

 '<データ総数を取得します。>
 AllSu = Range("A1:" & CellPos).Rows.Count

 '<結果(B列)をセットする行位置取得用変数を初期化します。>
 SetPos = 0

 データ総数分作業を繰り返します。
 For APos = 1 To AllSu '←(1)

 B列の全データと比較するので、行位置を1行目にしています。
  BPos = 1

 B列に値がある間、チェック作業を繰り返します。
 Do While (Cells(BPos, 2).Value <> "") '←(2)
    '<A列とB列の内容が同じかどうかチェックします。>
     If Cells(APos, 1).Value = Cells(BPos, 2).Value Then

     同じだったらB列にセットする必要が無いのでチェック作業を終わります。
     Exit Do '←(3)
     End
    
     Else
    
     同じではなかったら、次のB列のデータとのチェックをします。
     BPos = BPos + 1
     End If
 Loop

 '<B列に同じデータがなかった場合、B列にA列の内容をセットします。>
 If Cells(BPos, 2).Value = "" Then
    SetPos = SetPos + 1
    Cells(SetPos, 2).Value = Cells(APos, 1).Value
 End If
Next APos

MsgBox "総件数" & AllSu & "件中、" & AllSu - SetPos & "件が重複していました。" _
       & Chr(13) & SetPos & "件がB列に抽出されました。" '←(4)
End Sub

●補足説明● 
  1. 「For〜Next」ステートメントは、指定された回数分、処理を繰り返します。  <構文>   For x = i To y    (処理)   Next x  x:繰り返す回数をカウントする数値変数を指定します。  i:初期値をセットします。  y:繰り返す回数(最終値)をセットします。  Nextステートメントでxに1加算され、再び処理を繰り返します。
  2. 「Do〜Loop」ステートメントは、指定された条件が満たされている間 もしくは満たされるまで、処理を繰り返します。   満たされている間処理を行いたい場合。  <構文>   Do While 条件    (処理)   Loop   満たされるまで処理を行いたい場合。   <構文>   Do Until 条件    (処理)   Loop
  3. 「Exit Do」は「Do〜Loop」ステートメントから抜け出す方法です。   「For〜Next」の抜け方は「ExitFor」です。