Sửa đoạn code xóa dòng có điều kiện

Liên hệ QC

duong22000

Thành viên thường trực
Tham gia
8/5/13
Bài viết
322
Được thích
23
Em có 1 file muốn xóa dòng có điều kiện tại cột số 3 hàng 21 cho đến hết. Khi nhập dữ liệu "x" ở vùng điều kiện này, chạy code thì các hàng tương ứng sẽ được xóa đi. Em có làm thử 1 đoạn code nhưng mỗi lần chạy nó chỉ xóa được 1 vài hàng, bấm vài lần nó mới xóa hết.
Mã:
Public Sub xoahang()
For I = 21 To 120
If ActiveSheet.Cells(I, 3).Value = "x" Then
Rows(I).Delete
End If
Next
End Sub
Các bác sửa code giúp em để code chạy 1 lần thì xóa hết các hàng tương ứng với điều kiện ở cột 3. Em cảm ơn mọi người!
 

File đính kèm

  • Book1.xlsm
    15.6 KB · Đọc: 9
Em có 1 file muốn xóa dòng có điều kiện tại cột số 3 hàng 21 cho đến hết. Khi nhập dữ liệu "x" ở vùng điều kiện này, chạy code thì các hàng tương ứng sẽ được xóa đi. Em có làm thử 1 đoạn code nhưng mỗi lần chạy nó chỉ xóa được 1 vài hàng, bấm vài lần nó mới xóa hết.
Mã:
Public Sub xoahang()
For I = 21 To 120
If ActiveSheet.Cells(I, 3).Value = "x" Then
Rows(I).Delete
End If
Next
End Sub
Các bác sửa code giúp em để code chạy 1 lần thì xóa hết các hàng tương ứng với điều kiện ở cột 3. Em cảm ơn mọi người!
em vừa khởi động lại máy, giờ mở file lên chạy lại code thì nó chỉ xóa được các hàng có điều kiện "x" ở cột 3 cách ô, còn nếu nhiều điều kiện "x" liền nhau thì code lại chạy xóa mấy dòng, sau đó bấm tiếp thì code lại xóa tiếp, vẫn không xóa được cùng lúc.
 
Lần chỉnh sửa cuối:
Mình kiểm tra trên máy mình thì lại chạy bình thường mà bạn, mình dùng 365. Mình có sửa code của bạn tý.
 

File đính kèm

  • Book1_Del_Fix.xlsm
    18.1 KB · Đọc: 4
Lần chỉnh sửa cuối:
@Chủ bài đăng: Muốn xóa dòng theo điều kiện nào đó thì:
Cách 1: Duyệt từ dưới lên & xóa từng dòng thỏa điều kiện;
Cách 2: Duyệt theo hướng nào cũng được; Nếu dòng thỏa điều kiện ta nhét nó vô 1 tham biến;
Sau khi duyệt xong CSDL & nếu tồn tại vùng cần xóa thì tiến hành xóa cái rẹt; Chuyện này cần biết phương thức Union()
& chúc bạn thành công cả ở 2 cách mà mình gợi ý cho bạn!
 
@Chủ bài đăng: Muốn xóa dòng theo điều kiện nào đó thì:
Cách 1: Duyệt từ dưới lên & xóa từng dòng thỏa điều kiện;
Cách 2: Duyệt theo hướng nào cũng được; Nếu dòng thỏa điều kiện ta nhét nó vô 1 tham biến;
Sau khi duyệt xong CSDL & nếu tồn tại vùng cần xóa thì tiến hành xóa cái rẹt; Chuyện này cần biết phương thức Union()
& chúc bạn thành công cả ở 2 cách mà mình gợi ý cho bạn!
Bác ơi viết hộ cháu đi.Cách 2 đấy bác.Mà còn cách nào tối ưu hơn nữa không ạ.
Bài đã được tự động gộp:

@Chủ bài đăng: Muốn xóa dòng theo điều kiện nào đó thì:
Cách 1: Duyệt từ dưới lên & xóa từng dòng thỏa điều kiện;
Cách 2: Duyệt theo hướng nào cũng được; Nếu dòng thỏa điều kiện ta nhét nó vô 1 tham biến;
Sau khi duyệt xong CSDL & nếu tồn tại vùng cần xóa thì tiến hành xóa cái rẹt; Chuyện này cần biết phương thức Union()
& chúc bạn thành công cả ở 2 cách mà mình gợi ý cho bạn!
Bác ơi viết hộ cháu đi.Cách 2 đấy bác.Mà còn cách nào tối ưu hơn nữa không ạ.
 
Hic, bài này khó và code phải dài chứ ngắn thế kia sao được nhẩy? Phải viết văn nhiều trang mới điểm cao được.
Nếu biết chút về phần mềm Record macro và tham gia khóa sửa code cấp tốc thì sẽ ra được code dài như sau:

Mã:
Sub Macro2()

    chay = MsgBox(vbCrLf & vbCrLf & vbCrLf & vbCrLf & vbCrLf & vbCrLf & vbCrLf & _
                  "!!! NEU KHONG CO xxx LA MAT SACH DU LIEU !!!" _
                & vbCrLf & vbCrLf & vbCrLf & vbCrLf & vbCrLf & vbCrLf & vbCrLf, vbOKCancel)

    If chay = vbCancel Then GoTo thoat

    On Error GoTo thoat

    Set acRange = Application.InputBox(vbCrLf & vbCrLf & vbCrLf & vbCrLf & vbCrLf & vbCrLf & vbCrLf & _
                                       "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! CHI DUOC CHON DONG TIEU DE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" _
                                     & vbCrLf & vbCrLf & vbCrLf & vbCrLf & vbCrLf & vbCrLf & vbCrLf, _
                                       "", , , , , , 8)

    acRange.AutoFilter Field:=3, Criteria1:="x"
    
    Set selRange = Range(acRange.Offset(1, 0), acRange.End(xlDown))
    If selRange.Cells.Count = 1 Then
        selRange.EntireRow.Delete
    Else
        selRange.SpecialCells(xlCellTypeVisible).Select
        Selection.EntireRow.Delete
    End If
    
    acRange.Select
    ActiveSheet.AutoFilterMode = False
    
thoat:
    Exit Sub
End Sub

ĐỌC KỸ THÔNG BÁO TRƯỚC KHI XUỐNG CHUỘT.
 
Em có làm thử 1 đoạn code nhưng mỗi lần chạy nó chỉ xóa được 1 vài hàng, bấm vài lần nó mới xóa hết.
Bạn hiểu đoạn code là khi xóa 1 dòng thỏa mãn điều kiên, Ví dụ xóa dòng 10 thì dòng 11 sẽ trờ thành dòng 10 trong khi vòng lặp sẽ tiếp tục với i= 11 tương ứng với dòng 12 trước khi xóa và đã bỏ qua dòng 11. Có thể duyệt vòng lặp theo thứ tự từ dưới lên hoặc thêm i=i-1 sau đoạn Rows(I).Delete.
 
Xóa với điền kiện đơn giản như vậy thì dùng Advanced Filter, hoặc dùng Auto Filter và copy phần visible, xóa phần còn lại. Cả hai cách đều có thể record macro.
 
Sub test()
Dim i As Long
i = Sheet1.Cells(Rows.Count, 2).End(xlUp).Row
If WorksheetFunction.CountIf(Sheet1.Range("C21:C" & i), "x") >= 1 Then
Sheet1.Range("C21:C" & i).Select
Selection.SpecialCells(xlCellTypeConstants, 2).Select
Selection.EntireRow.Delete
End If
End Sub

bạn thấy hợp lí có thể sử dụng ,cách này là dùng record macro
 
Public Sub an_phon()

ActiveSheet.Unprotect
For I = 120 To 21 Step -1
If ActiveSheet.Cells(I, 3).Value = "x" Then
Rows(I).Delete
End If
Next
End Sub
sửa lại code của bạn
 
Em có 1 file muốn xóa dòng có điều kiện tại cột số 3 hàng 21 cho đến hết. Khi nhập dữ liệu "x" ở vùng điều kiện này, chạy code thì các hàng tương ứng sẽ được xóa đi. Em có làm thử 1 đoạn code nhưng mỗi lần chạy nó chỉ xóa được 1 vài hàng, bấm vài lần nó mới xóa hết.
Mã:
Public Sub xoahang()
For I = 21 To 120
If ActiveSheet.Cells(I, 3).Value = "x" Then
Rows(I).Delete
End If
Next
End Sub
Các bác sửa code giúp em để code chạy 1 lần thì xóa hết các hàng tương ứng với điều kiện ở cột 3. Em cảm ơn mọi người!
Theo gọi ý của Anh @ SQ_DA.
Bạn thay dòng
Mã:
Rows(i).delete
Thành
Mã:
Dim Rng as Range
If Rng is nothing then
 set Rng=Rows(i)
Else
Set Rng =Union(Rng,Rows(i))
End if
Và thêm dòng nay sau khi thoát khỏi vòng lặp
Mã:
Rng.EntireRow.Delete
Khai bút đầu năm. Hy vọng đúng
Bài đã được tự động gộp:

Em có 1 file muốn xóa dòng có điều kiện tại cột số 3 hàng 21 cho đến hết. Khi nhập dữ liệu "x" ở vùng điều kiện này, chạy code thì các hàng tương ứng sẽ được xóa đi. Em có làm thử 1 đoạn code nhưng mỗi lần chạy nó chỉ xóa được 1 vài hàng, bấm vài lần nó mới xóa hết.
Mã:
Public Sub xoahang()
For I = 21 To 120
If ActiveSheet.Cells(I, 3).Value = "x" Then
Rows(I).Delete
End If
Next
End Sub
Các bác sửa code giúp em để code chạy 1 lần thì xóa hết các hàng tương ứng với điều kiện ở cột 3. Em cảm ơn mọi người!
Theo gọi ý của Anh @ SQ_DA.
Bạn thay dòng
Mã:
Rows(i).delete
Thành
Mã:
Dim Rng as Range
If Rng is nothing then
 set Rng=Rows(i)
Else
Set Rng =Union(Rng,Rows(i))
End if
Và thêm dòng nay sau khi thoát khỏi vòng lặp
Mã:
Rng.EntireRow.Delete
Khai bút đầu năm. Hy vọng đúng
 
Lần chỉnh sửa cuối:
Mình kiểm tra trên máy mình thì lại chạy bình thường mà bạn, mình dùng 365. Mình có sửa code của bạn tý.
Mình cảm ơn bạn, mình đã chạy thử code mà đã xóa được hết
Bài đã được tự động gộp:

Mình kiểm tra trên máy mình thì lại chạy bình thường mà bạn, mình dùng 365. Mình có sửa code của bạn tý.
Mình cảm ơn bạn, mình đã chạy thử code mà đã xóa được hết
@Chủ bài đăng: Muốn xóa dòng theo điều kiện nào đó thì:
Cách 1: Duyệt từ dưới lên & xóa từng dòng thỏa điều kiện;
Cách 2: Duyệt theo hướng nào cũng được; Nếu dòng thỏa điều kiện ta nhét nó vô 1 tham biến;
Sau khi duyệt xong CSDL & nếu tồn tại vùng cần xóa thì tiến hành xóa cái rẹt; Chuyện này cần biết phương thức Union()
& chúc bạn thành công cả ở 2 cách mà mình gợi ý cho bạn!
Cảm ơn bạn nhiều
Bài đã được tự động gộp:

Mình kiểm tra trên máy mình thì lại chạy bình thường mà bạn, mình dùng 365. Mình có sửa code của bạn tý.
Mình cảm ơn bạn, mình đã chạy thử code mà đã xóa được hết
@Chủ bài đăng: Muốn xóa dòng theo điều kiện nào đó thì:
Cách 1: Duyệt từ dưới lên & xóa từng dòng thỏa điều kiện;
Cách 2: Duyệt theo hướng nào cũng được; Nếu dòng thỏa điều kiện ta nhét nó vô 1 tham biến;
Sau khi duyệt xong CSDL & nếu tồn tại vùng cần xóa thì tiến hành xóa cái rẹt; Chuyện này cần biết phương thức Union()
& chúc bạn thành công cả ở 2 cách mà mình gợi ý cho bạn!
Cảm ơn bạn nhiều
Theo gọi ý của Anh @ SQ_DA.
Bạn thay dòng
Mã:
Rows(i).delete
Thành
Mã:
Dim Rng as Range
If Rng is nothing then
 set Rng=Rows(i)
Else
Set Rng =Union(Rng,Rows(i))
End if
Và thêm dòng nay sau khi thoát khỏi vòng lặp
Mã:
Rng.EntireRow.Delete
Khai bút đầu năm. Hy vọng đúng
Bài đã được tự động gộp:


Theo gọi ý của Anh @ SQ_DA.
Bạn thay dòng
Mã:
Rows(i).delete
Thành
Mã:
Dim Rng as Range
If Rng is nothing then
 set Rng=Rows(i)
Else
Set Rng =Union(Rng,Rows(i))
End if
Và thêm dòng nay sau khi thoát khỏi vòng lặp
Mã:
Rng.EntireRow.Delete
Khai bút đầu năm. Hy vọng đúng
Cảm ơn bạn nhiều
Bài đã được tự động gộp:

Mình kiểm tra trên máy mình thì lại chạy bình thường mà bạn, mình dùng 365. Mình có sửa code của bạn tý.
Mình cảm ơn bạn, mình đã chạy thử code mà đã xóa được hết
@Chủ bài đăng: Muốn xóa dòng theo điều kiện nào đó thì:
Cách 1: Duyệt từ dưới lên & xóa từng dòng thỏa điều kiện;
Cách 2: Duyệt theo hướng nào cũng được; Nếu dòng thỏa điều kiện ta nhét nó vô 1 tham biến;
Sau khi duyệt xong CSDL & nếu tồn tại vùng cần xóa thì tiến hành xóa cái rẹt; Chuyện này cần biết phương thức Union()
& chúc bạn thành công cả ở 2 cách mà mình gợi ý cho bạn!
Cảm ơn bạn nhiều
Theo gọi ý của Anh @ SQ_DA.
Bạn thay dòng
Mã:
Rows(i).delete
Thành
Mã:
Dim Rng as Range
If Rng is nothing then
 set Rng=Rows(i)
Else
Set Rng =Union(Rng,Rows(i))
End if
Và thêm dòng nay sau khi thoát khỏi vòng lặp
Mã:
Rng.EntireRow.Delete
Khai bút đầu năm. Hy vọng đúng
Bài đã được tự động gộp:


Theo gọi ý của Anh @ SQ_DA.
Bạn thay dòng
Mã:
Rows(i).delete
Thành
Mã:
Dim Rng as Range
If Rng is nothing then
 set Rng=Rows(i)
Else
Set Rng =Union(Rng,Rows(i))
End if
Và thêm dòng nay sau khi thoát khỏi vòng lặp
Mã:
Rng.EntireRow.Delete
Khai bút đầu năm. Hy vọng đúng
Cảm ơn bạn nhiều
 
Web KT
Back
Top Bottom