アプリ版:「スタンプのみでお礼する」機能のリリースについて

以前、重複行を網掛けにする処理で質問を載せましたが、
もう少し深くやりたくて試しているのですが、
無限ループが発生して困っております。

A B
1 aaa
1 aaa
1 aaa
2 aaa
2 aaa
2 aaa
3 bbb
3 bbb
4 aaa
4 aaa
上記データがあって結果を

A B C
1 aaa 重複
1 aaa 重複
1 aaa 重複
2 aaa 重複
2 aaa 重複
2 aaa 重複
3 bbb パス
3 bbb パス
4 aaa パス
4 aaa パス
B列の値が同じの場合は、A列の番号が大きいもののみパスと
するように処理を作成しようと思っております。

下記でまずはどのように値が返ってくるか試したのですが、
無限ループになってしまいました。

Dim i As Integer
Dim n As Integer

LastRow = Range("A65356").End(xlUp).Row

For i = 1 To LastRow
A_retsu = Cells(i, 1).Value
B_retsu = Cells(i, 2).Value
For n = 1 To LastRow
If A_retsu = Cells(n, 1).Value And B_retsu = Cells(n, 2) Then
MsgBox "パス"
Else
MsgBox "重複"
End If
Next
Next

End Sub

最終結果は、

3 bbb パス
3 bbb パス
4 aaa パス
4 aaa パス
上記だけを残して他は削除させる処理を作りたいです。
すいませんがお願いします

A 回答 (2件)

C列に(C2セルに)


=IF(A2=MAX(IF(B$2:B$11=B2,A$2:A$11,"")),"パス","重複")
入れて Ctrl+Shift+Enter を押して決定します。
{=IF(A2=MAX(IF(B$2:B$11=B2,A$2:A$11,"")),"パス","重複")}
と{}で囲まれて配列関数になります。
そのセルを下までコピイすると
A B C
1 aaa 重複
1 aaa 重複
1 aaa 重複
2 aaa 重複
2 aaa 重複
2 aaa 重複
3 bbb パス
3 bbb パス
4 aaa パス
4 aaa パス
となりますので 後はマクロの記録で
オートフィルター 重複のみを表示
行を2行目からたっぷりと下まで選択
削除
オートフィルターに解除
マクロの記録の終わり
VBエディターで確認すると
Row("3:100").Slectとかありますので
Row("2;1000")とかに変更すればOKかと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます
ちょっとゴールに近づきました。
もう少しやってみます

お礼日時:2008/07/28 22:36

VBAで処理をするということだよね。


これは処理ロジックとして、経験から下記の処理をお勧めする。
(1)空き列に上行から連番を振る。元の順序に復帰させるためのもの。
(2)B列(昇順)+A列(降順、ここが肝心)でソート
(3)データ第2行から最終行までに着いて繰り返し。For Nextなど
データ第1行は「パス」とし、直前行B列を保持する変数と、直前行A列を保持する変数にデータ第1行のそれらをセット。
(4)今処理している行において、直前行のB列と変わったら「パス」と入れる。
(5)直前行とB列+A列が同じなら「パス」
(6)B列同じでもA列が変わったら、「重複」
(7)最後に(1)の連番でソートし元の順序に戻す。
==
上記は、まあ「ソート法」というべきやり方。
なぜこれを使わないとややこしいかというと、
質問例のaaaの4(最高値)に当たるものは、理論上データの最後まで探さないと決まらない。決まった段階(最終行)では、aaaで4(最高値)のあった行を行過ぎている。aaaごと最高値のあり場所(行)を記憶する方法もあるが。それでaaaごと毎回全レコードを総なめして探さないといけない。ロジックがややこしくなる。
ーーー
こういうのはいきなり我流のコードを挙げるのではなく、半日ぐらいロジックはどうすればよいかということを考えてみるべきだとおもう。
ロジックは自由なもので、思考の鋭さを反映するものなので、上記よりよいものがあるかも知れないと自省してはいるが。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!