Hỏi xóa hàng khi có điều kiên

Liên hệ QC

kkls4745

Thành viên mới
Tham gia
7/11/08
Bài viết
10
Được thích
1
Xin hỏi : Muốn xóa hàng Khi Điều kiện :
Ô nào trong B1 đến B20 >2 thì xóa hàng đó
XIn cảm ơn.
 
Xin hỏi : Muốn xóa hàng Khi Điều kiện :
Ô nào trong B1 đến B20 >2 thì xóa hàng đó
XIn cảm ơn.
Dùng auto Fiter với thông số: is greater than 2, và chọn hết các hàng hiện lên xóa, Ctr -
Hay là code
PHP:
Sub Xoa()
Dim MyRng As Range, iR As Long
Set MyRng = [b1:b20]
For iR = 20 To 1 Step -1
    If Range("B" & iR).Value > 2 Then
        Range("B" & iR).EntireRow.Delete
    End If
Next
End Sub
 
Upvote 0
Xin hỏi : Muốn xóa hàng Khi Điều kiện :
Ô nào trong B1 đến B20 >2 thì xóa hàng đó
XIn cảm ơn.

Bạn dùng Autofilter (Atl+D,F,F) cột B. Sau đó chọn Custom và lọc "Is greater than" 2 sau đó Delete (Ctrl+ "-" [dấu trử]) các ô này đi là xong!

attachment.php


attachment.php
 

File đính kèm

  • Pic2.JPG
    Pic2.JPG
    109.6 KB · Đọc: 96
  • Pic1.JPG
    Pic1.JPG
    21.5 KB · Đọc: 93
Upvote 0
Xóa hàng khi Ô B >2
PHP:
For k = 1 To 65536 Step 1
    If Range("B" & k).Value > 2 Then
        Range("B" & k).EntireRow.Delete
    End If
Next
 
Upvote 0
Xóa hàng khi Ô B >2
PHP:
For k = 1 To 65536 Step 1
    If Range("B" & k).Value > 2 Then
        Range("B" & k).EntireRow.Delete
    End If
Next
Bạn test thử code trên, một điều khi xóa dòng là phải cho for từ cuối lên đấu.
Nếu k=1 thỏa DK, dele next thì k?
 
Upvote 0
Xóa hàng khi Ô B >2
PHP:
For k = 1 To 65536 Step 1
    If Range("B" & k).Value > 2 Then
        Range("B" & k).EntireRow.Delete
    End If
Next

Nếu cột B chỉ có vài hàng dữ liệu mà quét hết cả 65536 hàng thì phí quá!
Thêm vào đó, bạn đã test thử code trước khi post lên chưa, vì cái đoạn này:
Range("B" & k).EntireRow.Delete
Mà sẽ có nhiều ô mà vòng lặp For...Next sẽ bỏ qua! Vì hàng dưới sẽ bị đôn lên hàng trên và biến K thì không quay lai được.

Nếu dùng VBA, bạn tham khảo code sau nhé! Chép vào Module nhé:
PHP:
Sub XoaDongCoDK()
Dim iK As Long, iZ As Long
iZ = ActiveSheet.[B65536].End(xlUp).Row
    For iK = 1 To iZ
        With ActiveSheet.Cells(iK, 2)
        If .Value > 2 Then .Value = ""
        End With
    Next iK
ActiveSheet.[B:B].SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub
Hoặc như gợi ý của anh ThuNghi:
PHP:
Sub XoaDongCoDK()
Dim iK As Long, iZ As Long
iZ = ActiveSheet.[B65536].End(xlUp).Row
    For iK = iZ To 1 Step -1
        With ActiveSheet.Cells(iK, 2)
        If .Value > 2 Then .EntireRow.Delete
        End With
    Next iK
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Đúng rồi, do không để ý. Có thể thêm 1 hàm để xử lý sau khi xóa hàng xong.
Thay 65536 hàng bằng số hàng dữ liệu cần làm :
PHP:
For k = 1 To 65536 Step 1
    If Range("B" & k).Value > 2 Then
        Range("B" & k).EntireRow.Delete
        k = k - 1
    End If
Next
 
Lần chỉnh sửa cuối:
Upvote 0
Theo tôi, viết code theo kiểu AutoFilter như bạn Kiệt nói ở trên là hợp lý nhất... For chỉ nên xài trong trường hợp bất khả kháng (giống như IF)... Vì nó chậm rì rì...
Quét 65536 dòng mà dùng For thì đói luôn... trong khi AutoFilter chỉ làm 1 nhát là xong!
 
Upvote 0
A nói khó thuyết phục quá?

Chắc chắn không khác nhau nhiêu quan trọng là chương trình viết thế nào thôi
Vì sao lại nhanh hơn, a? giải thích 1 chút cho em mở tầm mắt?
Oh... đương nhiên là vậy rồi!
Giã định dử liệu gồm 65536 dòng... khi dùng For thì phải quét qua từng cell 1, so với điều kiện, nếu đúng thì Delete...
Vậy có phải vòng lập tốn 65536 lần để quét không?
Trong khi đó tôi dùng AutoFilter chỉ lọc 1 lần điều kiện rồi Delete cái rẹt
Vậy cái nào nhanh hơn ---> Dể nhận thấy mà
(Đương nhiên với dử liệu ít thì sự khác nhau về tốc độ hầu như không nhận biết được)

Đây! Tôi đưa lên 1 file thí nghiệm xóa 30.000 dòng
Các bạn cứ thí nghiệm (trong đó đã cài thời gian)... Xem khi khi kết thúc thì MsgBox cho kết quả = bao nhiêu giây nhé
Sheet 1 dùng For
Sheet 2 dùng AutoFilter
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Cảm ơn tất cả mọi người.
Mỗi cách lọc đều có cái hay riêng của nó.
Nếu Lọc bằng : AF của ndu96081631 nếu dữ liệu lớn thì nhanh hơn.
Nhưng hàm đó còn bị 1 lỗi, nếu AdvanFilter không có dữ liệu >2 thì bị báo lỗi "hay làm 2 lần cũng bị lỗi ..... Vì không còn dữ liệu để xóa".
Vậy thêm hàm gì để khắc phục lỗi đó.
 
Upvote 0
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Đúng thế a ndu ah,

NHƯNG ở đây e muốn nói là tại sao AutoFilter có sẵn trong Excel lại nhanh đó mới là điều đáng nói,

Tuy a làm AutoFilter có 1 nhát -> tuy nhiên phía trong Excel cũng phải dò tìm đặc trưng số liệu để filter - nhưng lại vẫn NHANH chứng tỏ thuật toán tốt, hoặc là dựa vào đặc trưng số liệu --
hay nói một cách khác, là cũng là viết lệnh cho máy tính,

Dĩ nhiên sử dụng công cụ có sẵn ví như chặt cây to bằng cưa máy chắc chắn nhanh hơn dao lại còn tự chế rồi. -- quan trọng là công nghệ làm ra cưa và nguyên lý làm việc mới là điều cần học..

cám ơn anh đã nhiệt tình làm bài test cho TV,
.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Mình cũng nghĩ như vậy.
Nếu Filter thì nó cũng dò B1:3000, Ô nào thỏa DK thì nó ẩn, Vậy nó cũng phải dò 3000 dòng. Ròi cuối cùng xóa 1 lần.
Còn For thì cũng dò từ B1 đến B3000. gặp đúng DK thì nó xóa .
Vậy có nghĩ là : Hàm For ít hơn 1 lần .....Nhưng kết quả sao chậm hơn vậy.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Các bạn có cho rằng con đẻ bao giờ cũng thuộc đường trong nhà hơn con nuôi? tất cả các chức năng gốc của Excell cơ bản là hoàn hảo và tối ưu nhất. Còn các giao tiếp với User bao giờ cũng phải thông qua các cơ chế giao tiếp nên chắc chắn sẽ hạn chế về tốc độ. Ví dụ bạn viết hàm cộng thì khi thực hiện bao giờ cũng chậm hơn hàm sum của Ex. Chưa kể VBA lại càng chậm vì mã không được Complie sang mã máy như VB. Vậy việc so sánh của ndu là hoàn toàn có lý đấy.
Mình thấy điều rõ ràng nhất khi nạp dữ liệu cho listbox nếu khai báo bằng vùng hoặc name máy nạp cực nhanh, nhưng nếu nạp theo cơ chế VB thì chậm hơn hàng chục lần (Với dữ liệu lớn). Vậy thì sao ta không tận dụng những gì Ex sẵn có thay vì lệnh đk bởi User. Mình thấy signature (Không biết chính xác của ai) có câu hay : " Excellent Macro is no macro"
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các bạn! nếu dòng bị lỗi #REF! thì xoá luôn thi lam sao mong các bạn giúp cam ơn các bạn nhiều nhiều!
 
Upvote 0
Web KT

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

Back
Top Bottom