
Ví dụ:
- Xóa các dòng mà cột C có đánh dấu “x”
- Xóa các dòng mà Cột B có giá trị nhỏ hơn 0.1
- …
Nếu bạn đam mê tìm hiểu về VBA để áp dụng cho các thao tác trên Excel thì đây là cơ hội để rèn luyện đấy! Dưới đây là 1 đoạn code để giải quyết vấn đề xóa nhiều dòng một cách tự động và nhanh chóng mà bạn có thể học tập.
Sub DeleteUsingForLoop() | |
Dim rowIndex As Long | |
Application.ScreenUpdating = False | |
With Sheet1 | |
.Range(“D1”) = Now | |
For rowIndex = 40000 To 1 Step –1 | |
If .Range(“A” & rowIndex).Value < 0.1 Then | |
.Range(“A” & rowIndex).EntireRow.Delete | |
End If | |
Next | |
.Range(“E1”) = Now | |
End With | |
Application.ScreenUpdating = True | |
MsgBox “Done” | |
End Sub |
Nội dung bài viết
Chuẩn bị dữ liệu để thực hiện test việc xóa nhiều dòng
Trong bảng dưới, dữ liệu để test việc xóa dòng nằm ở cột A, Sheet 1, vùng A1:A40000. Đây là những giá trị nằm trong khoảng từ 0 tới 1, và được tạo thành từ hàm mảng động mới trong Excel RandArray. Yêu cầu trong ví dụ này là bạn sẽ thực hiện xóa đi các dòng mà cột A có giá trị nhỏ hơn 0,1. Hiện tại đang có khoảng 4000 dòng thỏa điều kiện này.
Với đoạn code VBA đã đề cập, việc xóa dòng theo điều kiện này sẽ mất khoảng hơn 10 phút. Ở hình bên dưới, D1 sẽ là thời gian bắt đầu và D2 là thời gian đoạn code kết thúc chạy.
Cách xóa nhiều dòng theo điều kiện nhanh hơn
Cách 1:
Ý tưởng ở đây là bạn sẽ dùng một công thức trong cột phụ để có thể nhận biết được dòng nào cần xóa, rồi xóa dòng đó với đoạn code VBA sau:
Sub DeleteUsingSpecialCells() | |
Application.ScreenUpdating = False | |
With Sheet1.Range(“B1:B40000”) | |
.Range(“E1”) = Now | |
.Formula = “=IF(A1<0.1,0/0,A1)” | |
.Cells.SpecialCells(xlCellTypeFormulas, xlErrors).EntireRow.Delete | |
.Range(“E2”) = Now | |
End With | |
Application.ScreenUpdating = True | |
MsgBox “Done” | |
End Sub |

Cách 2:
Bạn dùng hàm Filter trong bộ hàm mảng động mới của Microsoft. Bằng phương pháp này, kết quả filter gần như sẽ có ngay lập tức (kết quả lọc ở cột B)
Cách 3:
Dùng chức năng Filter để tiến hành lọc kết quả hoặc là copy qua sheet khác:
Sub DeleteRowsWithValuesNewSheet() ‘100K records 10K to delete | |
‘Test 1: 2.40234375 sec | |
‘Test 2: 2.41796875 sec | |
‘Test 3: 2.40234375 sec | |
‘1M records 100K to delete | |
‘Test 1: 32.9140625 sec | |
‘Test 2: 33.1484375 sec | |
‘Test 3: 32.90625 sec | |
Dim oldWs As Worksheet, newWs As Worksheet, rowHeights() As Long | |
Dim wsName As String, t As Double, oldUsedRng As Range | |
FastWB True: t = Timer | |
Set oldWs = Worksheets(1) | |
wsName = oldWs.Name | |
Set oldUsedRng = oldWs.Range(“A1”, GetMaxCell(oldWs.UsedRange)) | |
If oldUsedRng.Rows.Count > 1 Then ‘If sheet is not empty | |
Set newWs = Sheets.Add(After:=oldWs) ‘Add new sheet | |
With oldUsedRng | |
.AutoFilter Field:=1, Criteria1:=“<>Test String” | |
.Copy ‘Copy visible data | |
End With | |
With newWs.Cells | |
.PasteSpecial xlPasteColumnWidths | |
.PasteSpecial xlPasteAll ‘Paste data on new sheet | |
.Cells(1, 1).Select ‘Deselect paste area | |
.Cells(1, 1).Copy ‘Clear Clipboard | |
End With | |
oldWs.Delete ‘Delete old sheet | |
newWs.Name = wsName | |
End If | |
FastWB False: InputBox “Duration: “, “Duration”, Timer – t | |
End Sub |
Tiến hành xóa trực tiếp bằng việc sử dụng Autofilter trong VBA hoặc là xóa bằng tay.
Sub DeleteIf() | |
Dim LR As Long | |
Application.ScreenUpdating = False | |
With Sheet1 | |
.Range(“C1”).Value = Now | |
If .AutoFilterMode Then .AutoFilterMode = False | |
LR = .Range(“B” & .Rows.Count).End(xlUp).Row | |
With .Range(“B1”).Resize(LR) | |
.AutoFilter | |
.AutoFilter Field:=1, Criteria1:=“>0.5” | |
.Offset(1).Resize(LR – 1).SpecialCells(xlCellTypeVisible).EntireRow.Delete Shift:=xlUp | |
End With | |
.AutoFilterMode = False | |
.Range(“C2”).Value = Now | |
End With | |
Application.ScreenUpdating = True | |
End Sub |

Vậy là thông qua bài viết này, chúng tôi đã mang lại cho bạn 4 cách xóa nhiều dòng trong Excel vô cùng đơn giản và dễ dàng, chúc bạn thực hiện thành công!
Xem thêm: Hướng dẫn cách sử dụng hàm ngày tháng năm trong Excel