2016-07-11 18 views
0

Situation: Ich habe Daten, die ich durch Summierung von Zeilen basierend auf dem ersten Spaltenwert (Artikel-ID-Nummer) zu konsolidieren versuche. Wenn die ID-Nummern übereinstimmen, möchte ich, dass die Zeilen zusammengefügt und die doppelten Zeilen gelöscht werden.Falsche Zeilen in Konsolidierungsschleife gelöscht

Ich habe den folgenden Code geschrieben und ich habe 2 Probleme: 1. Das erste Mal, wenn ich den Code ausführen, gibt es immer ein paar Duplikate übrig, die nicht konsolidiert wurden. 2. Wenn ich den Code erneut ausführen, summiert und löscht Zeilen auch wenn sie keine Duplikate sind.

Jede Hilfe würde sehr geschätzt werden.

Sub ConsolidateRows() 
    Dim WB As Workbook 
    Dim WS As Worksheet 
    Dim iRow As Long 
    Dim iCol As Long 
    Dim LastRow As Long 
    Dim LastCol As Long 
    Dim duplicate As String 
    Dim dupRow As Long 
    Dim cell As Range 
    Dim i As Integer 

    'set 
    Set WB = Workbooks("Book1") 
    Set WS = WB.Sheets("Data") 
    LastRow = WS.UsedRange.Rows.Count 
    LastCol = WS.UsedRange.Columns.Count 

    'Loop to consolidate, delete the duplicate rows 
    iRow = 1 
    While WS.Cells(iRow, 1).Value <> "" 
     duplicate = Cells(iRow, 1).Value 
     iRow = iRow + 1 

     For Each cell In WS.Range("A1:A" & LastRow).Cells 
       dupRow = cell.Row 

      If cell.Value = duplicate And iRow <> dupRow Then 
       For iCol = 3 To LastCol 
         Cells(iRow, iCol) = Application.WorksheetFunction.Sum(Cells(iRow, iCol), Cells(dupRow, iCol)) 
       Next iCol 
       WS.Rows(dupRow).Delete 
      End If 
     Next cell 
    Wend 
End Sub 
+0

können Sie einfach eine Formel 'SUMMEF 'und die Funktion' RemoveDuplicates 'in die Excel-Multifunktionsleiste integriert verwenden. Oder schreiben Sie einfach den VBA, um dies zu tun, wenn Sie es wirklich automatisiert benötigen. –

Antwort

1

Wenn Zeilen löschen, immer Start am Boden und arbeiten Sie Ihren Weg nach oben.

Zum Beispiel, wenn Spalte A für die Zeilen 1-5 enthalten:

Alpha 
Bravo 
Charlie 
Delta 
Foxtrot 

und Sie Zeile 3, haben Sie jetzt

Alpha 
Bravo 
Delta 
Foxtrot 

Ihr Schleifenzähler (Wert 3) war Zeige haben löschen um Charlie vor dem Löschen, aber ist jetzt zeigt auf Delta, dann erhöhen Sie Ihren Zähler auf 4, und ich t zeigt auf Foxtrot, daher haben Sie nie ausgewertet, ob Sie Delta löschen mussten.

Try this:

'Loop to consolidate, delete the duplicate rows 
iRow = LastRow 
While WS.Cells(iRow, 1).Value <> "" 
    duplicate = Cells(iRow, 1).Value 
    iRow = iRow - 1 

    For Each cell In WS.Range("A1:A" & LastRow -1).Cells 
      dupRow = cell.Row 

     If cell.Value = duplicate And iRow <> dupRow Then 
      For iCol = 3 To LastCol 
        Cells(iRow, iCol) = Application.WorksheetFunction.Sum(Cells(iRow, iCol), Cells(dupRow, iCol)) 
      Next iCol 
      WS.Rows(dupRow).Delete 
      LastRow = LastRow - 1 
     End If 
    Next cell 
Wend 

* Hinweis: Code, um die Oberseite meines Kopfes ändert sich ab, können Sie einige kleinere zusätzliche Veränderungen vornehmen müssen, um es rückwärts fahrbereit

Auch untersuchen bitte .Find() - es wird Ihren Code deutlich schneller zum Finden von Dups machen.

+0

Diesen Code ausprobieren! – TrackStar2016

+0

Dieser Code hat sich ähnlich wie zuvor verhalten. Es gelöschten Zeilen, die nicht dups und am Ende des Laufes waren erhielt ich diese Fehlermeldung: „Application-Defined oder Object-Defined Fehler“ auf dieser Zeichenfolge: Cells (iRow, iCol) = Application.WorksheetFunction.Sum (Zellen (iRow, iCol), Zellen (dupRow, iCol)) – TrackStar2016

+0

Wie gesagt, das war ein Quickie-Fix ohne Tests. Wenn ich genauer hinsehe, sehe ich Folgendes: Bewege 'iRow = iRow - 1 'von der Spitze deiner While-Schleife bis kurz vor' Wend '. Danach durchlaufen Sie Ihren Code im Debugger (verwenden Sie die Taste 'F8') Zeile für Zeile und beobachten Sie Ihre Variablen und Ihre Tabelle, um zu sehen, wo es falsch läuft. – FreeMan