●詳細●
サンプルでは、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
'<同じではなかったら、次のB列のデータとのチェックをします。>
BPos = BPos + 1
Loop
'<B列に同じデータがなかった場合、B列にA列の内容をセットします。>
If Cells(BPos, 2).Value = "" Then
SetPos = SetPos + 1
Cells(SetPos, 2).Value = Cells(APos, 1).Value
End
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」です。
|