Hướng dẫn cách xóa nhiều dòng trong Excel

Đánh giá bài viết

Trong quá trình làm việc với Excel, sẽ không ít lần bạn gặp trường hợp muốn xóa rất nhiều dòng mà trong đó thỏa mãn chung 1 điều kiện nhất định. Để giúp bạn có thể thực hiện được nhanh chóng thì bài viết dưới đây sẽ hướng dẫn cho bạn chi tiết cách xóa nhiều dòng trong Excel. Cùng theo dõi ngay nhé!

Bạn có thể biết chút ít về VBA và đang nghĩ ra một kế hoạch sẽ dùng vòng lặp trong VBA để giúp giải quyết việc xóa nhiều dòng tự động và nhanh chóng. Bạn có thể tự viết được 1 đoạn code như sau:

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
Sau khi đã thực hiện bấm nút cho code chạy, việc bạn chỉ làm lúc này là thư thái chờ đợi trong vòng 10 phút để có kết quả. Tuy nhiên, khi 10 phút đã kết thúc, bạn vẫn chưa nhận được kết quả ưng ý bởi những lí do sau đây:

CHUẨN BỊ DỮ LIỆU ĐỂ TEST VIỆC XÓA NHIỀU DÒNG

Dữ liệu dùng để test việc xóa dòng của bạn sẽ nằm trong cột A của Sheet1 vùng A1:A40000, được biết đến là các giá trị trong khoảng 0 tới 1 được tạo ra bởi hàm mảng động mới trong Excel RandArray Tại đây, bạn sẽ đi xóa các dòng mà cột A có giá trị nhỏ hơn 0,1. Và sẽ có khoảng 4000 dòng như vậy

Với đoạn code VBA bên trên, thì việc thực hiện xóa dòng theo điều kiện này sẽ mất tầm hơn 10 phút. Trong hình sau, D1 sẽ là thời gian bắt đầu, còn 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 thực hiện ở đây là, bạn sẽ dùng 1 công thức tại cột phụ để “nhận biết” được dòng nào cần xóa, sau đó xóa với đoạn code VBA bên dưới:

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
Kết quả: nhanh hơn 1 chút

 

Cách 2:

Dùng hàm Filter trong bộ hàm mảng động mới của Microsoft. Bằng cách này, filter gần như sẽ có kết quả ngay lập tức (kết quả lọc ở cột B)

Cách 3:

Dùng chức năng Filter để lọc kết quả hay 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
Cách 4:

Thực hiện xóa trực tiếp 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

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *