• 締切済み

VBAプロシージャの間違いを添削願います

A列からD列にかけてデータが入力されます。B列には4桁の数値が入力されており、 この4桁の数値を利用して、次のようにデータを管理したいと思います。 1.4桁の数値が同じものを抽出する。 2.抽出された数値は、最初に出現している数値の下の行に挿入する。 3.最初に出現している数値以外は削除する。 4.各行は空行が無い状態とする。 これをプロシージャにしたものが下記です。 Sub 重複行削除() Dim lastgyou As Integer Dim i As Integer Dim j As Integer Dim atai As Integer lastgyou = Range("B1").End(xlDown).Row For i = 1 To lastgyou - 1 atai = Cells(i, 2).Value For j = i + 1 To lastgyou If atai = Cells(j, 2).Value Then If j <> i + 1 Then Rows(j).Cut Rows(i + 1).Insert Shift:=xlDown End If i = i + 1 End If Next j Next i End Sub としましたが、重複行が削除されません。 ご教授をお願いいたします。

みんなの回答

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.1

問題のコードにツッコム前に、 管理方法からツッコム必要がありそうですね。 > 2.抽出された数値は、最初に出現している数値の「下の行に挿入」する。 これはつまり「2番目以降に抽出された数値を残す」ということですね。 単純に「ソート(並べ替え)」の処理で解決できると思われます。 ※そんなに単純でもないのかもしれませんが。 にも関わらず、 > 3.最初に出現している数値以外は削除する。 とありますが、これは前の「2.」の処理と矛盾しませんか? さて、その辺りの「管理方法」の構築はもう一度頭を捻っていただくとして、 お望みの処理のうち「条件に合致した行を削除する」場合は 「一番下の行から上に向かって処理していく」のが常套的手法です。 つまり、ザックリ書くと For i = lastgyou to 1 Step -1   If 条件 then     Rows(i).Delete   End If Next と言う感じです。 ご提示のコードを拝見する限り、 行削除に相当する部分が無いように見えます。 なので、 > 重複行が削除されません。 当然と言えば当然と言えます。 もう一度、なさりたい処理を整理することをオススメします。

kakehasi
質問者

お礼

tsubuyuki さん、ありがとうございます。

関連するQ&A