下面的第一个版本 (AutoFilter) 非常快 - 2 秒,100 K 行
要更改行间隔,请更新Const FRM(公式)中的4
.
版本 1 - 使用 AuroFilter
Option Explicit
'Deleted Rows: 75,000 (out of 100,000) - Time: 2.341 sec
Public Sub DeleteRowSetsAutoFilter()
Const FRM = "=MOD(ROW() - 1, 4) = 0" 'Rows where reminder of Row/4 = 0
Dim ws1 As Worksheet, ws2 As Worksheet, wsName As String, fc As Range
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set ws1 = ActiveSheet
Set ws2 = Sheets.Add(After:=ws1) 'Add new sheet
wsName = ws1.Name
Set fc = ws1.UsedRange.Columns(ws1.UsedRange.Columns.Count + 1) 'Filter column
fc.Formula = FRM
fc.AutoFilter Field:=1, Criteria1:="TRUE" 'Rows to be deleted: 2 To 4, 6 To 8, ...
ws1.UsedRange.Copy 'Copy visible rows to new sheet
ws2.Cells.PasteSpecial xlPasteColumnWidths
ws2.Cells.PasteSpecial xlPasteAll 'Paste data on new sheet
ws1.Delete 'Delete old sheet
ws2.Name = wsName
ws2.Cells(1).Select
ws2.Columns(ws2.UsedRange.Columns.Count).EntireColumn.Delete 'Delete filter column
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.CutCopyMode = False
End Sub
.
版本 2 - 使用 For 循环
Public Sub DeleteRowSetsForLoop()
Const STP = 4 'Row interval
Dim ws As Worksheet, lr As Long, i As Long, toDel As Range
Set ws = ActiveSheet
lr = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Set toDel = ws.Rows(lr + 1) 'First empty row (just to set the range)
For i = 1 To lr Step STP
Set toDel = Union(toDel, ws.Rows(i + 1 & ":" & i + (STP - 1))) '2-4, 6-8, etc.
Next
toDel.EntireRow.Delete
End Sub
.
Rows: 2,500 (out of 10 K)
DeleteRowSetsAutoFilter() - Time: 0.085 sec, 0.086 sec, 0.089 sec
DeleteRowSetsForLoop() - Time: 9.568 sec, 9.524 sec, 9.530 sec