如果在Excel中删除整行,如果前面的行中的单元格相同?

我的Excel电子表格包含11列和500k行。 每一行都是8通道数字逻辑分析仪的样本:A列是一个时间戳; 列B到I是比特值(每个单元中的1或0); 列J是用CONCATENATE(B,C,D,E,F,G,H,I)创build的二进制字节; 列K是以BIN2HEX(J)创build的hex相同的字节。

逻辑分析仪显着过度采样数据。 我想删除字节值没有改变的样本,只保留一系列连续重复的第一个样本。 换句话说,我想改变这个:

ABCDEFGHIJK 0.67497 1 0 0 1 1 1 1 0 10011110 9E 0.67498 1 0 0 1 1 1 0 1 10011101 9D 0.67499 1 0 0 1 1 1 0 1 10011101 9D 0.67500 1 0 0 1 1 1 0 1 10011101 9D 0.67501 1 0 0 1 1 1 1 0 10011110 9E 

对此:

 ABCDEFGHIJK 0.67497 1 0 0 1 1 1 1 0 10011110 9E 0.67498 1 0 0 1 1 1 0 1 10011101 9D 0.67501 1 0 0 1 1 1 1 0 10011110 9E 

如果我select单元格K1后运行下面的代码,它会删除我想要的过度采样,但它运行得非常慢。 (这将需要几天的时间完成。)

 Sub DeleteOverSamples() Do Until ActiveCell.Value = "" If ActiveCell.Value = ActiveCell.Offset(-1, 0).Value Then ActiveCell.EntireRow.Delete ElseIf ActiveCell.Value <> ActiveCell.Offset(-1, 0).Value Then ActiveCell.Offset(1, 0).Select End If Loop End Sub 

我怎样才能使这个更有效率? 如果EntireRow.Delete是一个耗时的函数,我可以一次select多行进行删除(有时重复的值会重复数百个样本)吗? 非常感谢!

删除方法速度慢,并且单元格的值的单独input/输出也很慢。 使用Variant数组很快。

 Sub test() Dim vDB As Variant, vR() As Variant Dim r As Long, c As Integer, n As Long, j As Integer Dim s As String vDB = Range("a1").CurrentRegion r = UBound(vDB, 1) c = UBound(vDB, 2) s = vDB(1, 11) n = n + 1 ReDim Preserve vR(1 To r, 1 To c) For j = 1 To c vR(n, j) = vDB(1, j) Next j For i = 1 To r If s <> vDB(i, 11) Then n = n + 1 For j = 1 To c vR(n, j) = vDB(i, j) Next j s = vDB(i, 11) End If Next i Sheets.Add Range("a1").Resize(n, c) = vR End Sub 

以下代码将创build一个新工作表,从第一个工作表中复制相关的值:

 Sub test() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Dim ws0 As Worksheet Dim ws1 As Worksheet Dim r0 As Long Dim r1 As Long Dim c As Long Dim startTime As Single startTime = Timer Set ws0 = ActiveSheet Set ws1 = Worksheets.Add r0 = 1 r1 = 1 Do While Not IsEmpty(ws0.Cells(r0, 1).Value) If r0 = 1 Then ws1.Rows(r1).Range("A1:I1").Value = ws0.Rows(r0).Range("A1:I1").Value r1 = r1 + 1 Else For c = 2 To 9 If ws0.Cells(r0, c).Value <> ws0.Cells(r0 - 1, c).Value Then ws1.Rows(r1).Range("A1:I1").Value = ws0.Rows(r0).Range("A1:I1").Value r1 = r1 + 1 End If Exit For Next End If r0 = r0 + 1 Loop MsgBox "Finished in " & (Timer - startTime) & " seconds" Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub 

我使用前几行提供的数据testing了这个数据,然后复制了最后一行,用于接下来的499995行(除了列B在01之间随机select)之外,复制了大约25万数据行。 如果B列中没有随机效应,则只需要超过19秒即可复制所期望的3行。 第一列,而不是列B,随机效应超过28秒 – 这可能是最慢的。

(如果使用计算的列J或K,它会更快,因为它只需要查看每行的一个单元格而不是当前查看的8个单元格,但是我不确定是否真的需要这些单元格列或是否只添加它们以使现有代码更简单。)