0

前の行と同じ場合、Excel 2003 の関数を使用して行全体を削除することはできますか? 例えば:

  1. りんご
  2. りんご
  3. お酢
  4. りんご
  5. バナナ
  6. バナナ
  7. バナナ
  8. りんご

#2、7#、#8 は削除したいが、#5、#9 は削除したくない。重複したエントリを削除したいのは、それが次のエントリである場合のみです。私はあなたにそれを明確に保つことができたことを願っています. 関数がない場合、どうすれば VBA でそれを行うことができますか? 前もって感謝します!

4

3 に答える 3

5

1 回限りの場合は、次の列に数式を追加することで、VBA を使用せずに簡単に実行できます。列が A であるとしましょう。

  • B2 に次のように入力します。

    =IF(A1=A2,"DELETE","")
    
  • 数式を下にドラッグします

  • 両方の列にオートフィルターを追加する
  • 列 B の「DELETE」でフィルタ
  • 表示されているすべての行を削除する
  • 列Bを削除
于 2013-01-30T14:23:39.900 に答える
1

簡単なメモ...行全体を削除する場合は、範囲の一番下から作業するようにしてください。範囲の上から下に向かって作業すると、予期しない結果が得られる場合があります。削除する代わりに、セルの値をクリアしてから並べ替えることを検討することもできます。私はあなたのために例を書きたいと思いますが、時間がありません。行き詰まったら、後で書きます。

編集:

以下の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を付けます。

于 2013-01-30T15:12:45.873 に答える
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

あなたの例でこのマクロを実行した後、私は得ています:

実行後のビュー vba

値を配列に格納するように変更し、行を削除する代わりに記憶された配列で列を埋めることができますが、これは簡単なはずです。

于 2013-01-30T15:02:30.870 に答える