我的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是一个耗时的函数,我可以一次选择多行进行删除(有时重复的值会重复数百个样本)吗?非常感谢!
答案 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个单元格,但我不确定您是否确实需要这些列,或者您是否只添加了这些列以使现有代码更容易。)