2016-02-24 93 views
2

我有一个Excel工作表,其中一些行可能包含与其他行相同的数据,除了一列。我需要一个宏来对该列中的所有值进行求和并删除所有重复项,除了第一个包含其余项的总和之外。例如:总和重复的行,然后删除所有重复

A B C D 
1 a b c d 
2 n j i o 
3 a b c p 
4 v y e b 
5 a b c m 
6 . . . . 

在这种情况下,代码必须删除行3和5(因为它们是第1行的“重复”)中,用d + P +米替换第1行的列d。我设法想出下面的代码:

For j = 1 To Range("A1").End(xlDown).Row 
    For i = j + 1 To Range("A1").End(xlDown).Row 
     If Cells(j, 1).value = Cells(i, 1).value And Cells(j, 2).value = Cells(i, 2).value And Cells(j, 3).value = Cells(i, 3).value Then 
      Cells(j, 6) = Cells(i, 6).value + Cells(j, 6).value 
      Rows(i).Delete Shift:=xlUp 
      i = i - 1 
     End If 
    Next i 
Next j 

但正如你可能已经注意到,这是非常低效的和基本的。任何更好的想法?

+1

连接一个,B和C,然后排序并内置在Excel中使用小计在串联中的每一个变化总结d?编辑:虽然没有删除:/ – findwindow

+1

lol @Jeeped我正在写一个答案XD – findwindow

+0

@findwindow如果它与Jeeped指出的不同,那么继续...越多的选项,越好:) –

回答

2

下面是一个简单的代码:

Sub remdup() 
    Dim ws As Worksheet 
    Dim lastrw As Long 
    Set ws = ActiveSheet 
    lastrw = ws.Range("A" & ws.Rows.Count).End(xlUp).Row 
    ws.Range("E1:E" & lastrw).FormulaR1C1 = "=SUMIFs(C[-1],C[-4],RC[-4],C[-3],RC[-3],C[-2],RC[-2])" 
    ws.Range("D1:D" & lastrw).Value = ws.Range("E1:E" & lastrw).Value 
    ws.Range("E1:E" & lastrw).ClearContents 
    With ws.Range("A1:D" & lastrw) 
     .Value = .Value 
     .RemoveDuplicates Array(1, 2, 3), xlNo 
    End With 

End Sub 
+1

是的。比我好^ _ ^; – findwindow

+0

如果有更多的列要加总什么?假设我在E,F,G,H,I,J,K,L,M,N等列中也有值,当A,B和C中的值重合时也需要对它们进行分组。这种方法仍然有效吗? –

+0

@ N.Pavon你只需要添加逻辑来将sumif放在一个空的列中,然后移动这些值,这不是使用循环,所以它仍然非常有效。 –