Home > 即効テクニック > Excel VBA > その他関連のテクニック > 重複データのチェック <2>「ForEach〜Next」と「Find」メソッドを使った方法

即効テクニック

その他関連のテクニック

重複データのチェック <2>「ForEach〜Next」と「Find」メソッドを使った方法

( - )
「For Each〜Next」と「Find」メソッドを使った方法
                  
●詳細●
サンプルでは、
A列のデータから、重複データを取り除いた結果をB列に抽出します。
「重複データのチェックをしよう<パターン1>」と同じ結果を得るのですが、今回は、「ForEach〜Next」と「Find」メソッドを使います。
<パターン1>では、A列の全データ数を取得して処理の繰り返し回数をセットしていましたが、「ForEach〜Next」を使うと対象のオブジェクトの”数”を意識せずに、A列の1件目のデータから最後のデータのまでのセル範囲に対して、処理を繰り返すとができます。その中で、「Find」メソッドを使って重複チェックの処理をします。
「Find」メソッドでB列に同じデータが検索されなかった場合は、A列の内容をB列の最後にセットし、A列の次のデータをチェックします。同じデータがあった場合は、「For Each〜Next」を抜けて、A列の次のデータをチェックします。A列のセル範囲のチェックが終了したら、メッセージボックスで「総件数中何件が重複していて、何件が抽出された」かを表示します。

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

●サンプル●
Sub Sample()
    Dim ChkRange As Range
    Dim ALastPos As String
    Dim BLastPos As String
    Dim Answer As Variant
    Dim SetPos As Integer

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

    '<結果(B列)をセットする行位置取得用変数を初期化します。>
    SetPos = 0
    
    '<A列の最終データ(セル)のアドレスを取得します。>
    ALastPos = Range("A65536").End(xlUp).Address()

    '<A列のセル範囲に対して処理を繰り返します。>
    For Each ChkRange
      In Worksheets(1).Range("A1" & ALastPos) ←(1)
     
      '<B列の最終データ(セル)のアドレスを取得します。>
      BLastPos = Range("B65536").End(xlUp).Address()

      '<A列と同じデータがB列の範囲にあるかどうか検索します。
         '同じデータがあれば”Answer”にセルを参照し、
         '無ければ”Nothing”を返します。>
      Set Answer = Worksheets(1).Range("B1:" & BLastPos). _ ←(2)
                   Find(ChkRange, LookAt:=xlWhole)          ←(3)
     
      '<B列に同じデータがなかった場合、B列にA列の内容をセットします。>
      If Answer Is Nothing Then
          SetPos = SetPos + 1
          Range("B" & SetPos).Value = ChkRange
      End If
    Next ChkRange
    MsgBox "総件数" & Range("A1:" & ALastPos).Count & _
           "件中、" & Range("A1:" & ALastPos).Count - SetPos & "件が重複していました。" & _
           Chr(13) & SetPos & "件がB列に抽出されました。";
End Sub

●補足説明●
  1. 「For Each〜Next」ステートメントは、オブジェクトコレクション (A列のセル範囲)の各オブジェクト(A列の各セル)に対して繰り返して処理を行います。     <構文>      For Each element          In group          (処理)      Next element     element:コレクションの各要素を繰り返す変数を指定します。     group:オブジェクトコレクションを指定します。    繰り返し処理が開始されると、引数groupの最初のオブジェクトに対して処理が実行されます。    引数groupの中にオブジェクトがある限り処理は続けられます。    処理から抜け出すには、「Exit For」を使います。
  2. 「Set」ステートメントは、オブジェクトへの参照を変数に代入して、実際のオブジェクト を参照できるようにします。
  3. 「Find」メソッドは、指定されたセル範囲(B列)の中で特定の情報(A列のセル要素) を検索し、情報が見つかった最初のセルを返します。検索の条件にあてはまるセルが見つから なかった場合は、「Nothing」を返します。     <構文>      object.Find(What,LookAt)      object:対象となるRangeオブジェクトを指定します。      What:検索する内容を指定します。      LookAt:定数「xlWhole」または「xlPart」を使って検索条件をセットします。      xlWhole・・・完全一致のセル      xlPart ・・・検索文字を含むセル