重複データのチェックする <パターン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 ・・・検索文字を含むセル




戻る


Excel Word Access VBA! モーグ