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 |