1. Sử dụng Vòng lặp ngược
Quy tắc vàng: Khi xóa dòng bằng vòng lặp, bạn phải luôn chạy từ dưới lên trên.
Tại sao phải chạy ngược? Nếu bạn xóa dòng 5 khi đang chạy xuôi, dòng 6 sẽ nhảy lên thành dòng 5. Vòng lặp tiếp theo sẽ nhảy sang dòng 6 (mới), dẫn đến việc bạn bỏ sót dòng 6 cũ. Chạy ngược giúp vị trí các dòng bên trên không bị thay đổi.
Sub XoaDongTrong_VongLap()
Dim lastRow As Long
Dim i As Long
Dim colIndex As Integer
colIndex = 1 'Cột A là 1, B là 2...
'Sử dụng công thức tìm dòng cuối cùng có chứa dữ liệu trong một Worksheet.
lastRow = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
Application.ScreenUpdating = False 'Tắt cập nhật màn hình để chạy nhanh hơn
For i = lastRow To 1 Step -1
If Trim(Cells(i, colIndex).Value) = "" Then
Rows(i).Delete
End If
Next i
Application.ScreenUpdating = True
End Sub
2. Dùng AutoFilter (Tốc độ “thần thánh”)
Đây là cách nhanh nhất vì nó xử lý hàng loạt. Thay vì xóa từng dòng, chúng ta lọc ra tất cả dòng trống rồi xóa toàn bộ vùng hiển thị đó trong một nốt nhạc.
Sub XoaDongTrong_Filter()
Dim ws As Worksheet
Dim lastRow As Long
Dim targetColumn As Range
Set ws = ActiveSheet
'Xác định dòng cuối cùng của bảng tính
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
'Vùng làm việc (ví dụ cột A)
Set targetColumn = ws.Range("A1:A" & lastRow)
Application.ScreenUpdating = False
'1. Tắt Filter cũ nếu có
ws.AutoFilterMode = False
'2. Lọc các ô trống (Blanks)
targetColumn.AutoFilter Field:=1, Criteria1:="="
'3. Xóa các dòng đang hiển thị (trừ dòng tiêu đề - Offset(1))
On Error Resume Next 'Tránh lỗi nếu không có dòng trống nào được tìm thấy
targetColumn.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
On Error GoTo 0
'4. Tắt Filter sau khi xong
ws.AutoFilterMode = False
Application.ScreenUpdating = True
End Sub
3. Dùng Union (Linh hoạt và an toàn)
Phương pháp này gom tất cả các dòng cần xóa vào một “nhóm” (biến delRange), sau đó chỉ thực hiện lệnh xóa đúng một lần duy nhất vào cuối chương trình.
Sub XoaDongTrong_Union()
Dim i As Long, lastRow As Long
Dim delRange As Range
Dim colIndex As Integer
colIndex = 1 'Ki?m tra c?t A
lastRow = Cells(Rows.Count, colIndex).End(xlUp).Row
Application.ScreenUpdating = False
For i = 1 To lastRow
'Ki?m tra n?u ô tr?ng ho?c ch? ch?a kho?ng tr?ng
If Trim(Cells(i, colIndex).Value) = "" Then
If delRange Is Nothing Then
Set delRange = Rows(i) 'Dòng d?u tiên tìm th?y
Else
Set delRange = Union(delRange, Rows(i)) 'Gom thêm dòng m?i vào nhóm
End If
End If
Next i
'Xóa toàn b? nhóm dã gom du?c
If Not delRange Is Nothing Then
delRange.Delete
Else
MsgBox "Không tim thay dòng nao de xoa."
End If
Application.ScreenUpdating = True
End Sub

Phân tích doanh thu với Advanced Filter và hàm SUMIFS09-05-2026 11:17
Cách tổng doanh thu trong khoảng thời gian với hàm SUMIFS08-05-2026 17:20
Tìm top customers với hàm Take và Sortby trong Excel08-05-2026 11:54