2016-07-11 9 views
0

状況:最初の列の値(アイテムID番号)に基づいて行を合計することで、統合しようとしているデータがあります。 ID番号が一致する場合は、行を一緒に追加し、重複行を削除します。連結ループで間違った行が削除されました

私は次のコードを書いており、2つの問題が発生しています:1.コードを実行するときに、常に残りの重複が残っています。2.コードを再実行すると、行が合計され、それらが重複していなくても。

ご協力いただければ幸いです。

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

あなたは 'SUMIF'式とExcelリボンに組み込まれた' RemoveDuplicates'機能を使うことができます。または、実際に自動化が必要な場合は、単にVBAを作成してください。 –

答えて

1

行の削除、下部の常に開始し、あなたの方法を動作します。例えば

行1-5の列Aが含まれている場合:

Alpha 
Bravo 
Charlie 
Delta 
Foxtrot 

を、あなたは3行を削除し、あなたが今

Alpha 
Bravo 
Delta 
Foxtrot 

を持っているあなたのループカウンタ(値3ポインティングました削除前にCharlieにあるが、を指している場合は、にカウンタを増やし、i tはFoxtrotを指しているので、Deltaを削除する必要があるかどうかは評価されませんでした。

ことは、これを試してみてください:

'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 

*注:コードは、私の頭の上をオフに変更し、あなたはそれがまた、後方

に動作させるには、いくつかのマイナーな追加的な調整をしなければならないことがあり、調べてください.Find() - あなたのコードをと大幅にを実行するようにします。

+0

このコードを試してみてください! – TrackStar2016

+0

このコードは以前と同じように動作します。この文字列に 「アプリケーション定義またはオブジェクト定義エラー」 :それはDUPを、私はこのエラーを受け取った実行終了時にはなかった行を削除 細胞(iRow、ICOL)= Application.WorksheetFunction.Sum (セル(iRow、iCol)、セル(dupRow、iCol)) – TrackStar2016

+0

私が言ったように、それはテストなしで簡単な修正でした。もっと見ると、私はこれを見ています:あなたのwhileループの上から 'Wend'の直前まで' iRow = iRow - 1'を移動してください。その後、変数とスプレッドシートを一度に1行ずつデバッガでコードを実行して(「F8」キーを使用して)、エラーがどこで発生しているかを確認します。 – FreeMan

関連する問題