Hỏi cách xóa dòng theo điều kiện

  • Thread starter Thread starter ST-Lu!
  • Ngày gửi Ngày gửi
Liên hệ QC

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Em muốn xóa những dòng (bắt đầu từ A2 trờ đi) mà các giá trị tại cột A khác
"KKLUHPH1*"
thì đoạn code sau sai ở đâu ạ
Dim rc As Long
rc = Cells(Cells.Rows.Count, 1).End(xlUp).Row
Do
If rc > 1 and Cells(rc, 1).value <> "kkluhph1*" Then
Cells(rc, 1).EntireRow.Delete Shift:=xlUp
End If
rc = rc - 1
Loop While rc > 1

Mong các anh dạy bảo
 
Em muốn xóa những dòng (bắt đầu từ A2 trờ đi) mà các giá trị tại cột A khác
"KKLUHPH1*"
thì đoạn code sau sai ở đâu ạ
PHP:
Dim rc As Long
rc = Cells(Cells.Rows.Count, 1).End(xlUp).Row
Do
If rc > 1 and Cells(rc, 1).value <> "kkluhph1*" Then   ''<====Sai chỗ này
Cells(rc, 1).EntireRow.Delete Shift:=xlUp
End If
rc = rc - 1
Loop While rc > 1

Bạn sửa lại một chút như sau:
PHP:
Dim Rc As Long
Rc = Cells(Cells.Rows.Count, 1).End(xlUp).Row
Do
If Rc > 1 and Left(Cells(Rc, 1),8) <> "kkluhph1" Then   ''<==== Sửa chỗ này
Cells(Rc, 1).EntireRow.Delete Shift:=xlUp
End If
Rc = Rc - 1
Loop While rc > 1
 
Upvote 0
Bạn thử sữa lại như vầy xem!
PHP:
Sub thu() Dim rc As Long rc = Cells(Cells.Rows.Count, 1).End(xlUp).Row Do     If rc > 1 And Cells(rc, 1).Value  "kkluhph1*" Then     Rows(rc).Delete     End If rc = rc - 1 Loop While rc > 1 End Sub
Hoặc dùng như vầy cho dễ hiểu!
PHP:
Sub thu() For i = [A6000].End(xlUp).Row To 2 Step -1 If Cells(i, 1)  "KKLUHPH1*" Then Rows(i).Delete End If Next End Sub
Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Hoặc dùng như vầy cho dễ hiểu!
PHP:
Sub thu()
For i = [A6000].End(xlUp).Row To 2 Step -1
If Cells(i, 1) <> "KKLUHPH1*" Then
Rows(i).Delete
End If
Next
End Sub
Thân.

To Po_Pikachu: Code này nó delete hết luôn đó! Lỗi ngay tại cái dấu "*" đấy, Po_Pikachu test lại xem sao!
 
Upvote 0
Em chưa hiểu ý bác! Đấu đó đâu có ảnh hưởng gì đâu! Vấn đề là không biết xóa hết dòng luôn hay chỉ xóa ô khác đó thôi! Bác xem file xem thích cái nào thì chọn nha! Thân.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nếu dùng phương thức FIND() sẽ nhanh hơn vòng lặp.

Và nhất là: cứ thấy đạt yêu cầu là xóa; chúng ta nên gôm chúng lại & xóa 1 cái rẹt chắc sẽ nhanh hơn. --=0
 
Upvote 0
Anh Kiệt nói đúng đó, cho dấu * vào nó xóa hết sạch luôn (em sơ ý nói là bị lỗi, nên anh THU NGHI hỏi lỗi ở đâu)
các bác ơi đằng sau KKLUHPH là rất nhiều số, mình chỉ lưu lại những giữ liệu KKLUHPH1* thôi
ví dụ: KKLỤHPH11078
Còn KKLƯHPH20755 thì xóa đi

------------
Em nghĩ chỉ có cách dùng left thôi
 
Upvote 0
Em chưa hiểu ý bác! Đấu đó đâu có ảnh hưởng gì đâu!
Vấn đề là không biết xóa hết dòng luôn hay chỉ xóa ô khác đó thôi!
Bác xem file xem thích cái nào thì chọn nha!
Thân.
Em muốn xóa những dòng (bắt đầu từ A2 trờ đi) mà các giá trị tại cột A khác
"KKLUHPH1*"

Theo mình hiểu là ô nào bắt đầu bằng "KKLUHPH1" thi giữ lại, còn không thì xóa!
 
Upvote 0
Bài toán này nếu dùng vòng lập thì chẳng hay ho tí nào... Dùng Advanced Filter đi các bạn ơi, điều kiện lọc là: <>KKLUHPH1*
Lọc xong xóa luôn 1 nhát 1 những dòng Visible
Xem ví dụ:
PHP:
Sub Test()
  Dim Rng As Range
  Set Rng = [A1].CurrentRegion
  Rng.AdvancedFilter Action:=1, CriteriaRange:=[H1:H2]
  Rng.Offset(1).SpecialCells(12).EntireRow.Delete
  ActiveSheet.ShowAllData
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cám ơn các anh đã dạy bảo
File gốc rất nhiều cột (em đã thu macro và lọc bớt rồi)

Em xin gửi file mà em đã làm xong phần lọc bỏ những dòng tại cột A <>KKLUHPH1* (làm bằng tay)

Các anh chỉ giúp
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cám ơn các anh đã dạy bảo
File gốc rất nhiều cột (em đã thu macro và lọc bớt rồi)

Em xin gửi file mà em đã làm xong phần lọc bỏ những dòng tại cột A <>KKLUHPH1* (làm bằng tay)

Các anh chỉ giúp
Đã Auto Filter rồi thì chọn luôn
does not begin with KKLUHPH1
Xóa hết các dòng.
Hay dùng thử code này.
PHP:
Sub DeleteRow()
Dim rc As Long, iText As String, iLen As Long
rc = Cells(Cells.Rows.Count, 1).End(xlUp).Row
iText = "KKLUHPH1"
iLen = Len(iText)
Do
  If rc > 1 Then
    If StrComp(Left(Cells(rc, 1), iLen), iText) <> 0 Then
        Cells(rc, 1).EntireRow.Delete Shift:=xlUp
  End If: End If
  rc = rc - 1
Loop While rc > 1
End Sub
 
Upvote 0
Đã Auto Filter rồi thì chọn luôn
does not begin with KKLUHPH1
Uh nhỉ! Dùng AutoFilter mà quên mất vụ does not begin with
Xem ra chiêu này là nhanh nhất đây! Cảm ơn ThuNghi
Nhưng xin hỏi: Nghe đồn rằng AutoFilter không làm việc được với dử liệu > 1000 dòng, điều này đúng không nhỉ?
 
Upvote 0
Bộ máy tính các bạn không cài excel hay sao?
Đừng có lười & chờ sung rụng như vậy; Hãy tự giả lập với vài nghìm records là nhớ dai ngay thôi mà;
Nói vậy thôi, tớ cũng chưa thử, một khi chưa cần thử!
Đương nhiên tôi đã có thử mói hỏi chứ...
Là thế này: Tôi thử thì thấy AutoFilter không lọc được trên 1000 dòng, nhưng có người lại nói là được... Chả biết thế nào nên đành phải hỏi cho chắc!
Các bạn ai đã từng làm việc với dử liệu lớn xin cho biết ý kiến với! (hoang mang quá)
 
Upvote 0
Đương nhiên tôi đã có thử mói hỏi chứ...
Là thế này: Tôi thử thì thấy AutoFilter không lọc được trên 1000 dòng, nhưng có người lại nói là được... Chả biết thế nào nên đành phải hỏi cho chắc!
Các bạn ai đã từng làm việc với dử liệu lớn xin cho biết ý kiến với! (hoang mang quá)

Em làm excel với dữ liệu 4000-->7000 dòng, vẫn autoFliter vô tư. Lấy một ví dụ như sau:
Ô A2="a"
Ô A1200 = "a"
Đoạn giữa ta gán bất kỳ cái gì cũng được, miễn sau cho vùng đó có dữ liệu.
Sau đó Auto Filter cột A với giá trị Filter là "a" xem thử nó ra mấy dòng sẽ biết ngay?
Thậm chí 10.000 dòng hoặc hơn cũng lọc được mà. Tuy nhiên lưu ý trong vùng chọn để auto fliter, có thể có ô rỗng (Blank) và chính các ô này sẽ giới hạn việc autofliter. Muốn AutoFilter với data vừa chứa ô có dữ liệu vừa chứa ô rỗng thì ta phải chọn toàn bộ vùng cần Filter sau đó mới AutoFilter. Không đứng tại ô/hàng đầu tiên rồi dùng AutoFilter.

Cái duy nhất em chưa test được là: cái listbox xổ xuống lúc ta chọn autofilter (nút hình vuông có mũi tên chỉ xuống) chứa được tối đa bao nhiêu giá trị duy nhất trong vùng đang filter mà thôi!
 
Lần chỉnh sửa cuối:
Upvote 0
Em làm excel với dữ liệu 4000-->7000 dòng, vẫn autoFliter vô tư. Lấy một ví dụ như sau:
Ô A2="a"
Ô A1200 = "a"
Đoạn giữa ta gán bất kỳ cái gì cũng được, miễn sau cho vùng đó có dữ liệu.
Sau đó Auto Filter cột A với giá trị Filter là "a" xem thử nó ra mấy dòng sẽ biết ngay?
Thậm chí 10.000 dòng hoặc hơn cũng lọc được mà.

Cái duy nhất em chưa test được là: cái listbox xổ xuống lúc ta chọn autofilter (nút hình vuông có mũi tên chỉ xuống) chứa được tối đa bao nhiêu giá trị duy nhất trong vùng đang filter mà thôi!
Ah... vậy rất có thể là:
- AutoFilter vẩn làm việc được trên 1000 dòng
- Dropdown list thì không hiển thị quá 1000 dòng
Chắc vì lẽ đó mà mọi người nhầm tưởng nó không lọc được dử liệu > 1000 dòng chăng? (chọn list, hỏng thấy cái mình cần thì chọn gì đây? )
Chủ đề đã từng tranh luận tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=2964
Các bạn cho biết thêm ý kiến xem
 
Upvote 0
Đã Auto Filter rồi thì chọn luôn
does not begin with KKLUHPH1
Xóa hết các dòng....
Cho em hỏi: VD Với đoạn code của ndu96081631
PHP:
Sub Test()
  Dim Rng As Range
  Set Rng = [A1].CurrentRegion
  Rng.AdvancedFilter Action:=1, CriteriaRange:=[H1:H2]
  Rng.Offset(1).SpecialCells(12).EntireRow.Delete
  ActiveSheet.ShowAllData
End Sub
thì dùng does not begin with "KKLUHPH1"như thế nào ?
 
Upvote 0
Cho em hỏi: VD Với đoạn code của ndu96081631
PHP:
Sub Test()
  Dim Rng As Range
  Set Rng = [A1].CurrentRegion
  Rng.AdvancedFilter Action:=1, CriteriaRange:=[H1:H2]
  Rng.Offset(1).SpecialCells(12).EntireRow.Delete
  ActiveSheet.ShowAllData
End Sub
thì dùng does not begin with "KKLUHPH1"như thế nào ?
Rất đơn giãn là Record macro và xem "nó" viết thế nào? Nếu là tôi thì tôi cũng sẽ làm vậy (cú pháp sao nhớ hết nổi)
---------------------------
Thôi... làm luôn đây
PHP:
Sub Test()
  Dim Rng As Range
  Set Rng = [A1].CurrentRegion
  Rng.AutoFilter Field:=1, Criteria1:="<>KKLUHPH1*"
  Rng.Offset(1).SpecialCells(12).EntireRow.Delete
  ActiveSheet.AutoFilterMode = False
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom