Code VBA Xóa dòng theo điều kiện dùng AutoFilter
Xin chào anh chị
Hiện tại em đang dùng 2 code sau để xóa các dòng thỏa điều kiện, nhưng vừa rồi form của em tới hơn 4k dòng thì phải mất gần 30P mới thực hiện xong. Em đã test thử, nếu chỉ cho xóa cột thôi thì chạy ok, nhưng để phần xóa dòng này vào thì ôi lâu quá.
Nhờ anh chị xem giúp em có cách nào chạy nhanh hơn không nha.
1- Code 1:Sub Delete()
Dim Cll As Range, lR As Long
With Application
.ScreenUpdating = False: .DisplayAlerts = False: .Calculation = xlCalculationManual: .EnableEvents = False
End With
On Error Resume Next
ThisWorkbook.Save
With Sheets("Sheet1")
lR = .Cells.Find("*", , , , , xlPrevious).Row 'Xac dinh dong cuoi'
.Range("A8:S" & lR).Value = .Range("A8:S" & lR).Value 'Chuyen thanh gia tri',khong co cong thuc
..Delete 'Xoa cac cot theo yeu cau'
.Range("D8:D" & lR).AutoFilter 'Tat che do loc
.Range("D8:D" & lR).AutoFilter 1, "PW*" 'Loc cac dong co gia tri PW
.Range("D9:D" & lR).SpecialCells(12).EntireRow.Delete 'Xoa ket qua loc
.Range("D8:D" & lR).AutoFilter 'Tat che do loc
End With
ThisWorkbook.SaveAs Left(ThisWorkbook.FullName, Len(ThisWorkbook.FullName) – 5) & "-TEST.xlsx", 51 'Luu mot ban sao khong chua Macro'
With Application
.ScreenUpdating = True: .DisplayAlerts = True: .Calculation = xlCalculationAutomatic: .EnableEvents = True
End With
End Sub2- Code thứ 2:
Sub Delete1()
Dim Cll As Range, lR As Long
With Application
.ScreenUpdating = False: .DisplayAlerts = False: .Calculation = xlCalculationManual: .EnableEvents = False
End With
On Error Resume Next
ThisWorkbook.Save
With Sheets("Sheet1")
.Range("A8", ..End(xlUp)).Value = .Range("A8", ..End(xlUp)).Value 'Chuyen thanh gia tri',khong co cong thuc ..Delete 'Xoa cac cot theo yeu cau'
.Range("D8", ..End(xlUp)).AutoFilter 'Tat che do loc
.Range("D8", ..End(xlUp)).AutoFilter 1, "PW*" 'Loc cac dong co gia tri PW
.Range("D9", ..End(xlUp)).SpecialCells(12).EntireRow.Delete 'Xoa ket qua loc
.Range("D8", ..End(xlUp)).AutoFilter 'Tat che do loc
End With
ThisWorkbook.SaveAs Left(ThisWorkbook.FullName, Len(ThisWorkbook.FullName) – 5) & "-TEST1.xlsx", 51 'Luu mot ban sao khong chua Macro'
With Application
.ScreenUpdating = True: .DisplayAlerts = True: .Calculation = xlCalculationAutomatic: .EnableEvents = True
End With
End Sub
Ý của em là xóa những dòng có chứa giá trị PW* ( có thể là PW, PW1, PW2 ……)
Về Vòng lặp thì a hướng dẫn giúp nha, vì em chưa hình dung ra.
Code này chỉ xoá dòng, chưa có xoá cột.
Sub XoaDong()
Dim arr(), i, j, k, kq()
arr = Sheet1..CurrentRegion.Value
ReDim kq(1 To UBound(arr), 1 To UBound(arr, 2))
For i = 1 To UBound(arr)
If Not arr(i, 6) Like "PW" & "*" Then
k = k + 1
For j = 1 To UBound(arr, 2)
kq(k, j) = arr(i, j)
Next
End If
Next
Sheet1..Resize(i – 1, j – 1) = kq
End Sub
www.giaiphapexcel.com/diendan/threads/code-vba-x%C3%B3a-d%C3%B2ng-theo-%C4%91i%E1%BB%81u-ki%E1%BB%87n-d%C3%B9ng-autofilter.101306/
Khóa học Power PI – Ứng dung trong Nhân sự
TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...
Xem khóa học
Ai biết đâu. Cứ thấy sao mần vậy thôi. Khi nào trật thì chủ thớt ráng chịu. Mình không có chịu à nghen.
Bạn thử vậy xem được ko
Bạn thử thế này xem có được ko . Đại ca Quang Hải lên rồi đó, để anh xử lý tiếp bạn nhá
Bạn thử cách này xem. Tuy không nhanh bằng cách dùng mảng của quanghai nhưng theo đúng ý của bạn là như làm thủ công và có thể nhanh hơn cách dùng vòng lặp.
Với file đính kèm của bài 17 thì thế này là được.
Sub Xoa()
Dim arr(), i, rng As Range
arr = .CurrentRegion.Value
Set rng = Cells(65536, 1)
For i = UBound(arr) To 1 Step -1
If arr(i, 6) Like "PW" & "*" Then
Set rng = Union(rng, Cells(i + 7, 1))
End If
Next
rng.EntireRow.Delete
End Sub
Bạn dùng cái này thử xem
Giải nén file đính kèm. Chạy file để đăng ký VBA. Copy code này vào file cần xoá dòng và chạy thử.
Public Sub Main()
Dim arr()
arr = Range("F10", .End(3)).Value
With CreateObject("VBAVBA.vbsub")
Set .ExcelApp = Application
.DeleteRow arr
End With
End Sub
Tìm xem trong trong C:WindowsSysWOW64 có file VBAVBA.dll chưa. Nếu chưa có thì copy thủ công vào. Sau đó thử chạy file này. Nhớ là phải Run as…
Như đã nói
Từ code bài 1 thấy rằng mục đích chính của bạn là tạo file mới với dữ liệu lọc là không chứa các dòng mà tài cột F có giá trị PW*,
Nên hình thành code sau (bổ sung, nâng cấp code #1 của bạn thôi) – đảm bảo tốc độ nhanh chấp nhận được, kết quả có đầy đủ định dạng format gốc
Chắc bạn biết VBA, và thạo Excel nên
– tự thêm lệnh xóa cột nào cần bỏ đi
– tự thêm lệnh save file
– và chú ý nên thay các công thức SUM thay SUBTOTAL(109, ….) với tham số hàm 109 để không tính tổng các giá trị ẩn đi =======> thì kết quả tổng mới đúng.
ví dụ M11 thành: =SUBTOTAL(109,M12:M38)+SUBTOTAL(109,M43:M45)
Sao cột lại có chiều cao ??? chắc là dòng?
Bạn phức tạp nhỉ, muốn thế sử dụng cách củ chuối -code sau- vẫn khá nhanh
(chú ý khi thử chạy chương trình, nên copy 1 file lưu trước, vì không thể undo những dòng đã xoá đâu, các chú ý khác như thay SUM thành SUbtotal, xoá cột vẫn như bài trước… )