Tăng tốc độ xóa dòng?

Liên hệ QC

tigertiger

Coming back ...
Tham gia
25/1/07
Bài viết
1,934
Được thích
1,902
Một anh bạn nhờ, có sheet lớn số dòng khoảng 10000 dòng, muốn xóa tất cả ác dòng mà có giá trị cột B >=1000, có đoạn code sau nhưng rất chậm

PHP:
Dim myRow As Long
    Dim myCol As String
 
    Application.ScreenUpdating = False
    myCol = "B"
    For myRow = 10000 To 2 Step -1
        If ActiveSheet.Cells(myRow, myCol).Value >= 1000 Then
            Rows(myRow).delete
        End If
    Next myRow
    Application.ScreenUpdating = True

vậy làm sao cải thiện tốc độ, các bạn góp ý cho

xin cảm ơn.
 
Lần chỉnh sửa cuối:
Chào anh,
Theo em, nên Filter (Filter là ưu điểm của Excel) rồi Delete một lần sẽ nhanh hơn là duyệt từng dòng.
Anh có thể so sánh 2 Sub sau
PHP:
Sub Test1()
Dim myRow As Long
    Dim myCol As String

    Application.ScreenUpdating = False
    myCol = ""
    For myRow = 10000 To 2 Step -1
        If ActiveSheet.Cells(myRow, myCol).Value >= 1000 Then
            Rows(myRow).Delete
        End If
    Next myRow
    Application.ScreenUpdating = True
End Sub
Dùng Filter
PHP:
Sub Test2()
    Application.ScreenUpdating = False
    Range("B1").AutoFilter Field:=2, Criteria1:=">=1000"
    Range([B1], [B1].End(xlDown)).EntireRow.Delete
    Application.ScreenUpdating = True
End Sub
Em nghĩ nếu số dòng thoả điều kiện càng nhiều ">=1000" thì tốc độ này càng có sự cách biệt rõ nét.

TDN
 
Lần chỉnh sửa cuối:
Upvote 0
Đúng thế, nhưng nếu dùng Find và Go Special thì sao nhỉ?
?
 
Upvote 0
Đúng thế, nhưng nếu dùng Find và Go Special thì sao nhỉ?
?
Find cũng duyệt for i mà. Thương những vấn đề này, tôi dùng sort sau đó tìm chận đầu và cuối, sau đó xóa. Hay là dùng thêm 1 cột dùng countif dạng .formular => .value. Sort lại và xóa, đã thử # 50.000 rows thấy tốc độ có cải thiện.
 
Upvote 0
Khi & chỉ khi.

Thế nhưng nếu dùng Find và Go Special thì sao nhỉ?
?

Biết chắc rằng ta chỉ tìm thấy 0001 kết quả duy nhứt! Nhưng cũng không nhanh hơn ai.

To ThuNghi: phương thức FIND() lẹ làng hơn For . . Next chứ; Còn lẹ hơn bao nhiêu là tùy thuộc vô dữ liệu
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Find cũng duyệt for i mà. Thương những vấn đề này, tôi dùng sort sau đó tìm chận đầu và cuối, sau đó xóa. Hay là dùng thêm 1 cột dùng countif dạng .formular => .value. Sort lại và xóa, đã thử # 50.000 rows thấy tốc độ có cải thiện.

Chào các bác,
Xin bổ sung thêm một cách làm nữa, gần giống như bác ThuNghi.
Sau khi sort xong, ta dùng lệnh "Clear" để xóa, nhanh hơn "Delete" gấp nhiều lần !
 
Upvote 0
Chào các bác,
Xin bổ sung thêm một cách làm nữa, gần giống như bác ThuNghi.
Sau khi sort xong, ta dùng lệnh "Clear" để xóa, nhanh hơn "Delete" gấp nhiều lần !
Ở đây người ta cần xóa dòng chứ có phải xóa dử liệu đâu mà Clear hả bạn?
 
Upvote 0
Chào các bác,
Xin bổ sung thêm một cách làm nữa, gần giống như bác ThuNghi.
Sau khi sort xong, ta dùng lệnh
"Clear" để xóa, nhanh hơn "Delete" gấp nhiều lần !

Clear và Delete có khác nhau đấy bạn à. Đồng thời, không phải lúc nào cũng Sort được (Data chạy loạn luôn đó)

Theo mình, để có cách tối ưu thì tốt nhất nên dựa vào file cụ thể, bảng dữ liệu cụ thể và yêu cầu cụ thể mới có cách thích hợp nhất. Ví dụ (nói vui) : dữ liệu vài ba dòng thì cần gì code, làm tay cho nhanh, hi hi --=0

TDN
 
Upvote 0

Ví dụ (nói vui) : dữ liệu vài ba dòng thì cần gì code, làm tay cho nhanh, hi hi --=0
Ah... nói thêm (cái này nói thiệt)... Dù cho dử liệu là 10.000 dòng, nhưng nếu ta quyết định dùng AutoFilter để lọc và xóa cũng đâu cần code ---> Cứ theo ý ta mà lọc rồi Delete thôi.. trừ phi ta muốn AutoFilter rất nhiều cột hoặc là chuyện XÓA này chỉ là 1 công đoạn nhỏ trong cả quá trình nào đó
 
Upvote 0
Clear và Delete có khác nhau đấy bạn à. Đồng thời, không phải lúc nào cũng Sort được (Data chạy loạn luôn đó)

Theo mình, để có cách tối ưu thì tốt nhất nên dựa vào file cụ thể, bảng dữ liệu cụ thể và yêu cầu cụ thể mới có cách thích hợp nhất. Ví dụ (nói vui) : dữ liệu vài ba dòng thì cần gì code, làm tay cho nhanh, hi hi --=0

TDN

ban noi 2 cai clear và delete dĩ nhiên là khác xa rồi
vì clear chỉ có xóa nhưng lại để cột lại (xóa dữ liệu để cột)
còn delete thì xóa nguyên cột (xóa dữ liệu và cột )
 
Upvote 0
ban noi 2 cai clear và delete dĩ nhiên là khác xa rồi
vì clear chỉ có xóa nhưng lại để cột lại (xóa dữ liệu để cột)
còn delete thì xóa nguyên cột (xóa dữ liệu và cột )
Cái này lại càng tầm bậy quá trời luôn!
Ai nói với bạn rằng Delete là xóa nguyên cột thế?
Vã lại ở đây đang bàn đến vụ XÓA DÒNG ---> CỘT của bạn thì liên quan gì?
 
Upvote 0

Clear và Delete có khác nhau đấy bạn à. Đồng thời, không phải lúc nào cũng Sort được (Data chạy loạn luôn đó)

Theo mình, để có cách tối ưu thì tốt nhất nên dựa vào file cụ thể, bảng dữ liệu cụ thể và yêu cầu cụ thể mới có cách thích hợp nhất. Ví dụ (nói vui) : dữ liệu vài ba dòng thì cần gì code, làm tay cho nhanh, hi hi --=0

TDN

Trích bác ndu:
Ở đây người ta cần xóa dòng chứ có phải xóa dử liệu đâu mà Clear hả bạn?

Với mục đích của tác giả topic này thì clear và delete có cùng một kết quả là chỉ giữ lại những dòng dữ liệu <1000.
Còn sort làm sao để dữ liệu không chạy loạn lên thì không khó gì cả, đúng như bác nói tùy vào hoàn cảnh mà lựa vùng dữ liệu như thế nào mà sort cho phù hợp. Với các bác có trình độ coding VBA như ở đây thì tin rằng không ai mắc sai lầm cả.

Còn xóa dòng và cột như bác rarnan thì mình hiểu là bác ấy đề cập tới "xóa dữ liệu" và "xóa định dạng". Bác thử vào Edit -> Clear -> All thì thấy lệnh clear nó xóa được những gì.
Em đã từng có nhu cầu như bác chủ topic đây, dùng filter xóa một lúc hay xóa từng dòng mà delete thì phải đợi rất lâu, đôi khi còn bị treo nữa là.
Đây là kinh nghiệm của em thôi, các bác đóng góp ý kiến
 
Upvote 0
Theo tôi thì cách dùng Filter rồi xóa có lẽ là nhanh nhất rồi, bất kể làm bằng tay hay dùng code.
 
Upvote 0
Em đã từng có nhu cầu như bác chủ topic đây, dùng filter xóa một lúc hay xóa từng dòng mà delete thì phải đợi rất lâu, đôi khi còn bị treo nữa là.
Đây là kinh nghiệm của em thôi, các bác đóng góp ý kiến
Tôi không nghĩ Filter chậm đâu! Có chăng là vì trong bảng tính của bạn còn có các công thức khác (công thức nằm tại sheet hiện hành hoặc sheet khác) --> Chính nó làm cho bảng tính phải tính toán lại (khi có thay đổi) ---> Và nếu như dùng AutoFilter mà bạn vẫn thấy nó chậm thì tôi nghĩ các phương pháp khác cũng sẽ chậm thế thôi
Bạn hãy thử trên 1 file toàn dử liệu thô xem ---> 10.000 dòng sẽ được xóa trong nháy mắt
 
Upvote 0
Tôi không nghĩ Filter chậm đâu! Có chăng là vì trong bảng tính của bạn còn có các công thức khác (công thức nằm tại sheet hiện hành hoặc sheet khác) --> Chính nó làm cho bảng tính phải tính toán lại (khi có thay đổi) ---> Và nếu như dùng AutoFilter mà bạn vẫn thấy nó chậm thì tôi nghĩ các phương pháp khác cũng sẽ chậm thế thôi
Bạn hãy thử trên 1 file toàn dử liệu thô xem ---> 10.000 dòng sẽ được xóa trong nháy mắt

Vâng, về cơ bản theo yêu cầu của bài này, filter sẽ khả thi.
Xin mở rộng một chút, bác đã bao giờ gặp phải lỗi không xóa được khi dùng filter chưa ạ ?
Em có file dữ liệu gần 40.000 dòng (dữ liệu thô only), filter xong thì nó xóa hết luôn chứ không phải chỉ những dòng đã lọc ra. Nhân đây em nhờ bác xem giúp em lỗi này.-=.,,

Trong các trường hợp công thức phức tạp hoặc phải mở nhiều file excel, hoặc nhiều điều kiện lọc, em hay sử dụng công thức -> sort -> clear. Em đã so sánh và thấy nhanh hơn lệnh delete (em thường dùng clear và delete nên so sánh như vậy, các phương pháp xóa khác thì em không rành lắm).
Em sẽ sử dụng filter ở những chỗ đơn giản như bác comment.
 

File đính kèm

Upvote 0
Vâng, về cơ bản theo yêu cầu của bài này, filter sẽ khả thi.
Xin mở rộng một chút, bác đã bao giờ gặp phải lỗi không xóa được khi dùng filter chưa ạ ?
Em có file dữ liệu gần 40.000 dòng (dữ liệu thô only), filter xong thì nó xóa hết luôn chứ không phải chỉ những dòng đã lọc ra. Nhân đây em nhờ bác xem giúp em lỗi này.-=.,,

Điều đó có nghĩa là vùng chọn để filter chưa được chọn hết, nghĩa là vùng filter có những dòng có khoản trắng ngăn cách giữa các vùng dữ liệu. Nếu chỉ đứng tại dòng chứa header mà filter thì chết ngay là phải!

Đối với trường hợp này, phải chọn toàn bộ vùng dữ liệu rồi mới filter. Đại khái như:
PHP:
Range("A1:AA45000").autofilter.....
 
Upvote 0
Cám ơn ca_dafi,
Cái lỗi này phát sinh khi filter bằng tay hẳn hoi, có chọn vùng dữ liệu đàng hoàng. Mình có copy value sang file mới -> vẫn vậy đấy.
 
Upvote 0
Cám ơn ca_dafi,
Cái lỗi này phát sinh khi filter bằng tay hẳn hoi, có chọn vùng dữ liệu đàng hoàng. Mình có copy value sang file mới -> vẫn vậy đấy.
Như bài #8 mình nói rất rõ mà
để có cách tối ưu thì tốt nhất nên dựa vào file cụ thể, bảng dữ liệu cụ thể và yêu cầu cụ thể mới có cách thích hợp nhất
trường hợp của bạn cũng vậy.

TDN
 
Upvote 0
Cảm ơn các bạn,
Bạn có thể xem giúp minh tại sao xảy ra lỗi filter theo file dữ liệu của mình ở đây nhé
http://www.megaupload.com/?d=BG60JMF5
Xin lỗi nhưng lại lạc sang đề filter rồi !
 
Upvote 0
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom