Tin tức mới

Xóa tất cả dòng trống bằng VBA trong Excel

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

Leave a Reply

Your email address will not be published. Required fields are marked *