HỎI: Code xóa dòng có điều kiện

Liên hệ QC

anhtb82

Thành viên mới
Tham gia
11/11/15
Bài viết
45
Được thích
9
Xin chào tất cả mọi người, mình có 1 code xóa dòng như thể này, nhưng chỉ xóa được với số lượng dữ liệu nhỏ (khoảng <100 dòng mới sử dụng được). Mình cũng có thể xóa từng dòng như mình đã thử rồi, lượng dữ liệu mình rất lớn nên xóa rất lâu. Mình muốn xóa 1 lúc hết tất cả theo điều kiện như dưới. Mọi người xem và sửa giúp mình nhé.
Mình cảm ơn!

Mô tả code: Nếu giá trị ô N2 KHÁC V4B hoặc V4D thì sẽ xóa hàng 2 đi.

Sub Xoadong()
Dim i As Long, rng As String
i = Range("A2").CurrentRegion.Rows.Count
For j = 2 To i
If Range("N" & j) <> "V4B" And Range("N" & j) <> "V4D" Then
rng = rng & "A" & j & ","
End If
Next j
If Len(rng) > 0 Then
Range(Left(rng, Len(rng) - 1)).EntireRow.Delete
Else
Exit Sub
End If
End Sub
 
Một khi muốn xóa dòng bằng macro ta phải:

1./ Duyệt từ dòng dữ liệu cuối lên dòng đầu

2./ Gặp dòng thỏa điều kiện đề ra thì
2.1: Xóa ngay dòng đó
2.2: Đưa dòng đó vô biến có thể chứa dòng đó
3./ Tiến hành
3.1: (Xóa dòng) đã thực hiện ở 2.1
3.2: Xóa các dòng chứa trong biến

Còn muốn xóa từ dòng đầu đến dòng cuối thì đòi hỏi trình VBA phải cao siêu hơn mới khỏi lỗi không mong muốn.

Chúc bạn thành công!
 
Upvote 0
Bạn gửi file lên đi. Trên diễn đàn nhiều người giúp mà
 
Upvote 0
Một khi muốn xóa dòng bằng macro ta phải:

1./ Duyệt từ dòng dữ liệu cuối lên dòng đầu

2./ Gặp dòng thỏa điều kiện đề ra thì
2.1: Xóa ngay dòng đó
2.2: Đưa dòng đó vô biến có thể chứa dòng đó
3./ Tiến hành
3.1: (Xóa dòng) đã thực hiện ở 2.1
3.2: Xóa các dòng chứa trong biến

Còn muốn xóa từ dòng đầu đến dòng cuối thì đòi hỏi trình VBA phải cao siêu hơn mới khỏi lỗi không mong muốn.

Chúc bạn thành công!
Cảm ơn góp ý của bạn, nhưng mình ms tập tọe VBA thôi, k biết nhiều đâu nên mình chưa biết làm thế nào
 
Upvote 0
Mình đã gửi rồi đó bạn

"Khác" thì xóa có nghĩa là "Giống" thì lấy?
PHP:
Public Sub GPE()
Dim sArr(), dArr(), I As Long, J As Long, K As Long, R As Long
sArr = Range("A2", Range("A2").End(xlDown)).Resize(, 14).Value
R = UBound(sArr)
ReDim dArr(1 To R, 1 To 14)
For I = 1 To R
    If sArr(I, 14) = "V4B" Or sArr(I, 14) = "V4D" Then
        K = K + 1
        For J = 1 To 14
            dArr(K, J) = sArr(I, J)
        Next J
    End If
Next I
Range("A2").Resize(R, 14).ClearContents
Range("A2").Resize(K, 14) = dArr
End Sub
 
Upvote 0
"Khác" thì xóa có nghĩa là "Giống" thì lấy?
PHP:
Public Sub GPE()
Dim sArr(), dArr(), I As Long, J As Long, K As Long, R As Long
sArr = Range("A2", Range("A2").End(xlDown)).Resize(, 14).Value
R = UBound(sArr)
ReDim dArr(1 To R, 1 To 14)
For I = 1 To R
    If sArr(I, 14) = "V4B" Or sArr(I, 14) = "V4D" Then
        K = K + 1
        For J = 1 To 14
            dArr(K, J) = sArr(I, J)
        Next J
    End If
Next I
Range("A2").Resize(R, 14).ClearContents
Range("A2").Resize(K, 14) = dArr
End Sub
Cảm ơn bạn rất nhiều, mình làm được rồi, nhân tiện cho mình hỏi trường hợp ngược lại thì sao nhỉ?
"Khác" thì lấy có nghĩa là "Giống" thì xóa?
 
Upvote 0
Mình đã gửi rồi đó bạn
Bạn có thể ghi Macro như sau:
PHP:
Sub ABC2()
    Range("N1").AutoFilter
    ActiveSheet.Range("A1:A" & Range("A" & Rows.Count).End(3).Row).AutoFilter Field:=14, Criteria1:="V42"
    Range("A2:A" & Range("A" & Rows.Count).End(3).Row).SpecialCells(12).EntireRow.Delete
    ActiveSheet.AutoFilterMode = False
    Range("N1").AutoFilter
    ActiveSheet.Range("A1:A" & Range("A" & Rows.Count).End(3).Row).AutoFilter Field:=14, Criteria1:="V4N"
    Range("A2:A" & Range("A" & Rows.Count).End(3).Row).SpecialCells(12).EntireRow.Delete
    ActiveSheet.AutoFilterMode = False
    Range("N1").AutoFilter
    ActiveSheet.Range("A1:A" & Range("A" & Rows.Count).End(3).Row).AutoFilter Field:=14, Criteria1:="V4W"
    Range("A2:A" & Range("A" & Rows.Count).End(3).Row).SpecialCells(12).EntireRow.Delete
    ActiveSheet.AutoFilterMode = False
End Sub
 
Upvote 0
Thử thay điều kiện = thành <>, OR thành AND xem sao.
Mình làm thành công rồi, code bạn hay quá, bây h mình muốn sử dụng code của bạn để lọc điều kiện cho cột I. Nếu cột I là Dynapac hoặc Ojitex sẽ xóa đi.
Mình thay code thành ntn: 14 -> 9
Mã:
Dim sArr(), dArr(), I As Long, J As Long, K As Long, R As Long
sArr = Range("A2", Range("A2").End(xlDown)).Resize(, 9).Value
R = UBound(sArr)
ReDim dArr(1 To R, 1 To 9)
For I = 1 To R
    If sArr(I, 9) <> "OJITEX HAIPHONG CO., LTD." And sArr(I, 9) <> "DYNAPAC (HAIPHONG) CO.,LTD" Then
        K = K + 1
        For J = 1 To 9
            dArr(K, J) = sArr(I, J)
        Next J
    End If
Next I
Range("A2").Resize(R, 9).ClearContents
Range("A2").Resize(K, 9) = dArr
Nhưng nó lại không xóa được hết, để thừa lại các giá trị tại cột thứ 10 -> 14.
Bạn xem giúp mình với
 
Upvote 0
Bạn có thể ghi Macro như sau:
PHP:
Sub ABC2()
    Range("N1").AutoFilter
    ActiveSheet.Range("A1:A" & Range("A" & Rows.Count).End(3).Row).AutoFilter Field:=14, Criteria1:="V42"
    Range("A2:A" & Range("A" & Rows.Count).End(3).Row).SpecialCells(12).EntireRow.Delete
    ActiveSheet.AutoFilterMode = False
    Range("N1").AutoFilter
    ActiveSheet.Range("A1:A" & Range("A" & Rows.Count).End(3).Row).AutoFilter Field:=14, Criteria1:="V4N"
    Range("A2:A" & Range("A" & Rows.Count).End(3).Row).SpecialCells(12).EntireRow.Delete
    ActiveSheet.AutoFilterMode = False
    Range("N1").AutoFilter
    ActiveSheet.Range("A1:A" & Range("A" & Rows.Count).End(3).Row).AutoFilter Field:=14, Criteria1:="V4W"
    Range("A2:A" & Range("A" & Rows.Count).End(3).Row).SpecialCells(12).EntireRow.Delete
    ActiveSheet.AutoFilterMode = False
End Sub
Bởi vì mình lọc là bắt buộc sẽ có V4D hoặc V4B. Vẫn còn những giá trị V* ngoài V42, V4n, V4W. nên mình thấy cách này k khả thi được
 
Upvote 0
Bởi vì mình lọc là bắt buộc sẽ có V4D hoặc V4B. Vẫn còn những giá trị V* ngoài V42, V4n, V4W. nên mình thấy cách này k khả thi được
Nhân bài toán xóa những dòng trong cột N của bạn với ĐK:V4B &<>V4D. Tôi đã sử dụng Code ngắn gọn hơn, nhưng sau khi chạy Code chỉ nhận được các giá trị trong cột N ="V4D".
Code:
PHP:
Sub xyz()
    Range("N1").Select
    Selection.AutoFilter
    ActiveSheet.Range("A1:A" & Range("A" & Rows.Count).End(3).Row).AutoFilter Field:=14, Criteria1:="<>V4B", _
                                                                              Operator:=xlAnd
    ActiveSheet.Range("A1:A" & Range("A" & Rows.Count).End(3).Row).AutoFilter Field:=14, Criteria1:="<>V4D"
     Range("A2:A" & Range("A" & Rows.Count).End(3).Row).SpecialCells(12).EntireRow.Delete
End Sub
Không rõ tại sao, ai đó có thể chỉ giúp tôi?
Xin cảm ơn.
 
Upvote 0
Nhân bài toán xóa những dòng trong cột N của bạn với ĐK:V4B &<>V4D. Tôi đã sử dụng Code ngắn gọn hơn, nhưng sau khi chạy Code chỉ nhận được các giá trị trong cột N ="V4D".
Code:
PHP:
Sub xyz()
    Range("N1").Select
    Selection.AutoFilter
    ActiveSheet.Range("A1:A" & Range("A" & Rows.Count).End(3).Row).AutoFilter Field:=14, Criteria1:="<>V4B", _
                                                                              Operator:=xlAnd
    ActiveSheet.Range("A1:A" & Range("A" & Rows.Count).End(3).Row).AutoFilter Field:=14, Criteria1:="<>V4D"
     Range("A2:A" & Range("A" & Rows.Count).End(3).Row).SpecialCells(12).EntireRow.Delete
End Sub
Không rõ tại sao, ai đó có thể chỉ giúp tôi?
Xin cảm ơn.
Code này là 2 lần thực hiện autofilter trên 1 cột
Lần 1 là ="<>V4B" và rỗng.
Lần 2 là ="<>V4D"
Lần 2 chỉ lọc dữ liệu theo điều kiện lần 2, điều kiện lần 1 không được lọc
--> Lệnh xóa dòng thực hiện cho lần lọc sau cùng --> chỉ còn V4D
Đoán vậy không chắc có đúng không, bạn kiểm tra thử xem
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom