前の行と同じ場合、Excel 2003 の関数を使用して行全体を削除することはできますか? 例えば:
- りんご
- りんご
- 梅
- お酢
- りんご
- バナナ
- バナナ
- バナナ
- りんご
#2、7#、#8 は削除したいが、#5、#9 は削除したくない。重複したエントリを削除したいのは、それが次のエントリである場合のみです。私はあなたにそれを明確に保つことができたことを願っています. 関数がない場合、どうすれば VBA でそれを行うことができますか? 前もって感謝します!
前の行と同じ場合、Excel 2003 の関数を使用して行全体を削除することはできますか? 例えば:
#2、7#、#8 は削除したいが、#5、#9 は削除したくない。重複したエントリを削除したいのは、それが次のエントリである場合のみです。私はあなたにそれを明確に保つことができたことを願っています. 関数がない場合、どうすれば VBA でそれを行うことができますか? 前もって感謝します!
1 回限りの場合は、次の列に数式を追加することで、VBA を使用せずに簡単に実行できます。列が A であるとしましょう。
B2 に次のように入力します。
=IF(A1=A2,"DELETE","")
数式を下にドラッグします
簡単なメモ...行全体を削除する場合は、範囲の一番下から作業するようにしてください。範囲の上から下に向かって作業すると、予期しない結果が得られる場合があります。削除する代わりに、セルの値をクリアしてから並べ替えることを検討することもできます。私はあなたのために例を書きたいと思いますが、時間がありません。行き詰まったら、後で書きます。
編集:
以下のmakciookのソリューションに示すように、私の元の答えは必ずしも真実ではありません。過去に、私は誤ってこの方法で問題に取り組みました (これを解決策として使用しないでください!!!):
Sub duplicates()
Dim c As Range, rng As Range
Set rng = Selection ''Select the entire list before running
For Each c In rng
If c.Value = c.Offset(-1, 0).Value Then c.EntireRow.Delete
Next
End Sub
このスクリプトでは、行が削除されて上にシフトされると、セル範囲はリセットされません。したがって、これを実行しても、リスト内のバナナの 2 番目の重複は検出されません。別の方法として、通常は最後の行を見つけて最初の行まで進み、削除が発生したときに行がシフトアップすることを考慮します。可能であれば、自分自身に-1を付けます。
これは、すべての重複行を削除して (物理的には、セル データだけでなく) 適合する可能性があるため、1 列のシートを使用する場合にのみ使用できることに注意してください。そうしないと、他のデータが失われます。
Sub Unduplicate()
Dim prev As String
Dim sel As Range
Dim i As Integer
Set sel = Range(Selection, Selection)
prev = sel.Offset(0).Value ' set prev as the first value - never will be deleted
i = 1 ' start from 2nd row
Do While sel.Offset(i).Value <> "" And sel.Offset(i).Value <> ""
If sel.Offset(i).Value = prev Then ' if duplicate - delete row
sel.Offset(i).EntireRow.Delete
Else ' else set new prev, and go further
prev = sel.Offset(i).Value
i = i + 1
End If
Loop
End Sub
あなたの例でこのマクロを実行した後、私は得ています:
値を配列に格納するように変更し、行を削除する代わりに記憶された配列で列を埋めることができますが、これは簡単なはずです。