2016-05-11 8 views
3

Ich schreibe einen Code, der Daten von einem Blatt in ein anderes kopiert, und ich habe diese Funktion funktioniert gut. Jetzt versuche ich es zu codieren, um alle Zeilen zu löschen, die doppelte Informationen enthalten, die auf der ID-Nummer dieser Information in Spalte F basieren. Teil unseres Prozesses ist es, manuell in Spalte E einzugeben, wenn jede Zeile bearbeitet wurde.Löschen von Zeilen mit doppelten Informationen in Spalten

Also ist mein Endziel, dass der Code Zeilen löschen soll, wo Spalte E leer ist und Spalte F ein Duplikat ist. Mein Code wird ausgeführt, löscht jedoch nichts. Ich hoffe wirklich, ich vermisse nur etwas lächerlich Offensichtliches.

For i = 1 To Range("f" & Rows.Count).End(xlUp).Row 
    If Cells(i, 5).Value = "" Then 'if column E is blank on row i 
     x = Cells(i, 6).Value 
     If Not IsError(Application.Match(x, "F:F", 0)) Then '& if that row is a duplicate 
      ActiveSheet.Range(x).EntireRow.Delete 'delete new duplicate row 
     End If 
    End If 
Next i 
+0

Versuchen Sie 'ActiveSheet.Cells (i, 6) .EntireRow.Delete' – findwindow

Antwort

4

Es gibt also ein paar Fehler, die in Ihrem Code behoben werden müssen. Erstens, wenn Sie einen Bereich durchlaufen und Zeilen löschen, beginnen Sie am besten von unten und arbeiten sich hoch. Dies verhindert Probleme, bei denen sich Ihr Iterator in einer Zeile befindet, diese Zeile gelöscht wird und die Schleife im Wesentlichen die nächste Zeile überspringt.

Als nächstes suchen Sie nach einem Match in Spalte F von x, die einen Wert aus Spalte F enthält. So wird es immer einen Wert (selbst, am allerwenigsten) zurückgeben. Vielleicht versuchen Sie es mit einem COUNTIF und zu sehen, ob es größer als 1 ist, könnte eine bessere Option sein?

Als nächstes haben Sie die Variable x mit dem Wert in Cells(i, 6) gefüllt, aber dann versuchen Sie, es als einen Bereich zu verwenden, wenn Sie löschen. Ändern Sie Ihren Code in den folgenden und überprüfen Sie, ob es funktioniert:

For i = Range("f" & Rows.Count).End(xlUp).Row To 1 Step -1 
If Cells(i, 5).Value = "" Then 'if column E is blank on row i 
x = Cells(i, 6).Value 
    If Application.Countif(Columns(6), x) > 1 Then '& if that row is a duplicate 
    ActiveSheet.Rows(i).Delete 'delete new duplicate row 
    End If 
End If 
Next i 
+0

Sehr zu schätzen die zusätzlichen Informationen/Best Practices Details.Ich würde dafür nur aufheben. "Teach a man to fish ..." –

5

Probieren Sie es mit,

For i = Range("f" & Rows.Count).End(xlUp).Row to 1 Step -1 
    If Cells(i, 5).Value = "" Then 'if column E is blank on row i 
     x = Cells(i, 6).Value 
     If Application.Countif(Columns(6), x) > 1 Then '& if that row is a duplicate 
      Rows(i).EntireRow.Delete 'delete new duplicate row 
     End If 
    End If 
Next i 

Sie versuchten, die Zeilennummer x, nicht i zu löschen. Außerdem sollte alles einmal zusammenpassen.

+0

Sie schlagen mich zu dem Haufen. Ich muss schneller tippen !! – user3561813

+0

@ user3561813 Sie hatten eine längere Erklärung^_^ – findwindow

+1

@findwindow vielleicht kann ich meinen Benutzernamen in 'Ausführlichkeit' ändern! – user3561813

0

Warum nicht die .RemoveDuplicates-Methode verwenden? Es ist schneller als herumlaufen. Hier ist eine grobe Skizze auf seiner Verwendung:

With Range 
    .RemoveDuplicates Columns:=Array(6), Header:=xlYes 
End With 

Hier ist die msdn doc für das Verfahren und another page mit einer detaillierteren Umsetzung. Sie sollten alle Fragen klären, die Sie haben könnten.

+0

Die Spalte E muss leer sein und die Werte in Spalte F müssen dupliziert werden. Die Verwendung der Spalten E und F für die doppelten Kriterien ** könnte ** funktionieren, könnte jedoch zu Fehlalarmen führen. – Jeeped