Nhờ viết code xóa dòng theo điều kiện (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

aries8214

Thành viên mới
Tham gia
11/3/09
Bài viết
23
Được thích
5
MÌnh đã tham khảo trên 4rum một số chủ đề tương tự, song vì trình có hạn nên vẫn không tự giải quyết được. Nhờ các bác cao thủ giúp một tay.
MÌnh có file excel (đính kèm), trong đó có 2 sheet. Sheet1 chứa 1 list từ A1:An; Sheet2 chứa một bảng dữ liệu từ A1:Bm (n,m thay đổi). MÌnh muốn so sánh Sheet2.(A1:Am) với Sheet1.(A1:An), nếu Sheet2.(Ai) (i=1:m) không thuộc Sheet1(A1:An) thì xóa dòng Ai.
Cám ơn mọi người!
 

File đính kèm

MÌnh đã tham khảo trên 4rum một số chủ đề tương tự, song vì trình có hạn nên vẫn không tự giải quyết được. Nhờ các bác cao thủ giúp một tay.
MÌnh có file excel (đính kèm), trong đó có 2 sheet. Sheet1 chứa 1 list từ A1:An; Sheet2 chứa một bảng dữ liệu từ A1:Bm (n,m thay đổi). MÌnh muốn so sánh Sheet2.(A1:Am) với Sheet1.(A1:An), nếu Sheet2.(Ai) (i=1:m) không thuộc Sheet1(A1:An) thì xóa dòng Ai.
Cám ơn mọi người!
Bạn copy vào Module rồi chạy nhé!
Mã:
Sub GPE()
    Dim sArr1, sArr2, Tmp, I As Long
    
    sArr1 = Application.Transpose(Sheet1.Range("A1", Sheet1.Range("A1").End(xlDown)))
    sArr2 = Sheet2.Range("A1", Sheet2.Range("A1").End(xlDown)).Value
    
    For I = UBound(sArr2, 1) To 1 Step -1
        Tmp = Filter(sArr1, sArr2(I, 1))
        If UBound(Tmp) < 0 Then
            Sheet2.Rows(I).Delete
        End If
    Next I
End Sub
 
Upvote 0
Dùng hàm Filter trước khi hỏi lại chủ thớt định nghĩa cho rõ "Sheet2.(Ai) (i=1:m) không thuộc Sheet1(A1:An)" có thể hơi chủ quan quá.

Câu hỏi cần đặt ra là "a1" bên Sheet2 có được coi như thuộc về "a10" bên Sheet1 hay không?

Hàm Filter mặc đinh rằng "a1" được chứa trong "a10"

Nếu không muốn mặc định như thế thì phải dùng hàm Match (array, sort nếu array lớn) hoặc hàm Find (Range)
 
Upvote 0
Dùng hàm Filter trước khi hỏi lại chủ thớt định nghĩa cho rõ "Sheet2.(Ai) (i=1:m) không thuộc Sheet1(A1:An)" có thể hơi chủ quan quá.

Câu hỏi cần đặt ra là "a1" bên Sheet2 có được coi như thuộc về "a10" bên Sheet1 hay không?

Hàm Filter mặc đinh rằng "a1" được chứa trong "a10"

Nếu không muốn mặc định như thế thì phải dùng hàm Match (array, sort nếu array lớn) hoặc hàm Find (Range)
Nhờ sự chỉ giáo của bác, em xin phép đưa lại 2 phương án như sau:
1. Sử dụng Match
Mã:
Sub GPE1()
    Dim sArr1, sArr2, Tmp, I As Long
    
    sArr1 = Application.Transpose(Sheet1.Range("A1", Sheet1.Range("A1").End(xlDown)))
    sArr2 = Sheet2.Range("A1", Sheet2.Range("A1").End(xlDown)).Value
    
    For I = UBound(sArr2, 1) To 1 Step -1
        Tmp = Application.Match(sArr2(I, 1), sArr1, 0)
        If IsNumeric(Tmp) = False Then
            Sheet2.Rows(I).Delete
        End If
    Next I
End Sub
2. Sử dụng Find
Mã:
Sub GPE2()
    Dim Rng1 As Range, Rng2 As Range, KQ As Range, I As Long
    
    Set Rng1 = Sheet1.Range("A1", Sheet1.Range("A1").End(xlDown))
    Set Rng2 = Sheet2.Range("A1", Sheet2.Range("A1").End(xlDown))
    
    For I = Rng2.Rows.Count To 1 Step -1
        Set KQ = Rng1.Find(what:=Rng2(I), LookIn:=xlValues, lookat:=xlPart)
        If KQ Is Nothing Then
            Rng2(I).EntireRow.Delete
        End If
    Next I
End Sub
Mong được bác chỉ bảo thêm ạ.
 
Upvote 0
Code của bạn dùng thêm 1 biến hơi dư.

Tmp = Filter(sArr1, sArr2(I, 1))
If UBound(Tmp) < 0 Then


If UBound(Filter(sArr1, sArr2(I, 1))) < 0 Then

If IsError(Application.Match(sArr2(I, 1), sArr1, 0)) = False Then

If Rng1.Find(what:=Rng2(I), LookIn:=xlValues, lookat:=xlPart) Is Nothing Then
 
Upvote 0
Code của bạn dùng thêm 1 biến hơi dư.

Tmp = Filter(sArr1, sArr2(I, 1))
If UBound(Tmp) < 0 Then


If UBound(Filter(sArr1, sArr2(I, 1))) < 0 Then

If IsError(Application.Match(sArr2(I, 1), sArr1, 0)) = False Then

If Rng1.Find(what:=Rng2(I), LookIn:=xlValues, lookat:=xlPart) Is Nothing Then
Vâng. Em cám ơn bác.
 
Upvote 0
Web KT

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

Back
Top Bottom