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

Theo dõi so sánh thực tế và mục tiêu dạng vạch theo từng tháng với biểu đồ Excel20-05-2026 23:30
Hướng dẫn thêm đường mục tiêu động vào biểu đồ Excel20-05-2026 17:50
Hướng dẫn làm biểu đồ Kết quả Vs. Mục tiêu bằng Column Chart trong Excel20-05-2026 16:40
Cách tìm, đánh dấu và gắn nhãn điểm dữ liệu trong biểu đồ phân tán Excel20-05-2026 16:32