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

时间:2017-08-27 23:51:18

标签: excel excel-vba vba

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

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

A        B  C  D  E  F  G  H  I  J         K
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

到此:

A        B  C  D  E  F  G  H  I  J         K
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

如果在选择单元格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是一个耗时的函数,我可以一次选择多行进行删除(有时重复的值会重复数百个样本)吗?非常感谢!

2 个答案:

答案 0 :(得分:3)

删除方法很慢,单元格值的单个输入/输出也很慢。 使用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

答案 1 :(得分:2)

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

GlobalQueryFilter

我使用您为前几行提供的数据对此进行了测试,然后为下一个499995行复制了最后一行(除了在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 0之间随机选择了列B)复制大约250,000行数据需要20多秒。如果没有B列中的随机效果,只需要超过19秒即可复制您期望的3行。第I列中的随机效应,而不是B列,只需要超过28秒 - 这可能是最慢的。

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