Giúp sửa code trích lọc dữ liệu trùng giữa 2 sheet (2 người xem)

Liên hệ QC

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

bigbabol89

Thành viên thường trực
Tham gia
15/10/12
Bài viết
226
Được thích
34
Dear các anh (chị ),

Em có sưu tầm được 1 file trích lọc dữ liệu trùng giữa 2 sheet, tuy nhiên, em cần sửa chút ít để phục vụ công việc của em. Mong các anh giúp đỡ :
- Khi chạy macro thì dữ liệu trùng chỉ hiện ở cột E => Em muốn dữ liệu điều kiện để lọc trùng vẫn là cột E nhưng khi kết quả có hiện thêm các thông tin ( kết quả sẽ bao gồm cột : A,B,C,D,E,F,V,W,X )
- Em cần so sánh 2 cặp sheet là : Active FT & Resign FT và Act PT & Reg PT ==> Nếu em muốn như vậy thì em phải làm 2 cái module và chỉnh tên sheet, có cách nào chỉ cần 1 module ko ạ.
Em đính kèm 1 file dữ liệu và 1 file kq mong muốn.

Em cám ơn
 

File đính kèm

Cái này dùng code làm gì cho nó mệt ra, dùng công thức, hàm match kết hợp với lọc là được, chịu khó copy bằng tay là được, vô cùng nhanh mà không phụ thuộc code.
 
Cái này dùng code làm gì cho nó mệt ra, dùng công thức, hàm match kết hợp với lọc là được, chịu khó copy bằng tay là được, vô cùng nhanh mà không phụ thuộc code.
Làm tay cái này thì em cũng biết làm mà, nhưng mà em thấy vba nhanh, tiện dụng...nên hào hứng hơn
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn thử Code này xem
PHP:
Sub Compare()
    Dim Ws As Worksheet, Arr, Col, N As Long, Pth, Rng As Range
    Dim Dic As Object, Tem As String
    Dim sArr(), dArr(), I As Long, J As Long, K As Long
Arr = Array("Active FT", "Resign FT", "Act PT", "Reg PT")
Col = Array(2, 3, 4, 5, 6, 22, 23, 24)
Pth = ActiveWorkbook.Path
Set Dic = CreateObject("Scripting.Dictionary")
Set Rng = Sheets(Arr(0)).Cells(1, 1)
For J = LBound(Col) To UBound(Col)
    Set Rng = Union(Rng, Sheets(Arr(0)).Cells(1, Col(J)))
Next J
ReDim dArr(1 To 65535, 1 To UBound(Col) + 2)
For N = LBound(Arr) To UBound(Arr)
    With Sheets(Arr(N))
        sArr = .Range("A2", .Range("A" & Rows.Count).End(xlUp)).Resize(, 24).Value
        For I = 1 To UBound(sArr)
            Tem = sArr(I, 5)
            If Not Dic.Exists(Tem) Then
                K = K + 1
                Dic.Add Tem, ""
                dArr(K, 1) = K
                For J = LBound(Col) To UBound(Col)
                    dArr(K, J + 2) = sArr(I, Col(J))
                Next J
            End If
        Next I
    End With
Next N
Application.Workbooks.Add
Set Ws = Application.ActiveSheet
Rng.Copy
Ws.Range("A1").PasteSpecial xlPasteColumnWidths
Ws.Range("A1").PasteSpecial xlPasteValues
Ws.Range("A1").PasteSpecial xlPasteFormats
Ws.Range("A2").Resize(K, UBound(dArr, 2)) = dArr
Ws.Range("A1").Resize(K + 1, UBound(dArr, 2)).Borders.LineStyle = 1
ActiveWorkbook.Close True, Pth & "\" & "KQ." & Format(Now(), "dd.mmm.yyyy") & ".xlsx"
Set Dic = Nothing
MsgBox "Xong!"
End Sub
Anh xem lại giúp em với :
- Em chỉ cần lọc ra dữ liệu bị trùng giữa 2 cặp sheet : Active FT vs Resign FTAct PT vs Reg PT. ( ý là so sánh sheet active ft và resign ft xem có giá trị trùng nào thì lọc ra, đk trùng là cột E ), tương tự với cặp sheet kia —> em chạy thấy kết quả ko ra giá trị trùng mà ra tất cả luôn.
- Nếu có thể thì 1 lần chạy code so sánh 2 cặp sheet trên thành 2 bảng riêng, phân tách bằng 1 hàng trống cũng đc ah.
- Anh cho em trích dữ liệu ra 1 workbook mới như kiểu tạm thời ( book1, book2,...) đc ko ạ. Ko cần đặt tên đâu ạ
 
Anh xem lại giúp em với :
- Em chỉ cần lọc ra dữ liệu bị trùng giữa 2 cặp sheet : Active FT vs Resign FTAct PT vs Reg PT. ( ý là so sánh sheet active ft và resign ft xem có giá trị trùng nào thì lọc ra, đk trùng là cột E ), tương tự với cặp sheet kia —> em chạy thấy kết quả ko ra giá trị trùng mà ra tất cả luôn.
- Nếu có thể thì 1 lần chạy code so sánh 2 cặp sheet trên thành 2 bảng riêng, phân tách bằng 1 hàng trống cũng đc ah.
- Anh cho em trích dữ liệu ra 1 workbook mới như kiểu tạm thời ( book1, book2,...) đc ko ạ. Ko cần đặt tên đâu ạ
Bạn thử lại với cái Code này nha
PHP:
Sub Compare()
    Dim Ws As Worksheet, Arr, Col, N As Long, Pth, Rng As Range
    Dim Dic As Object, Tem As String
    Dim sArr(), dArr(), I As Long, J As Long, K As Long, Stt As Long, Ir As Long
Arr = Array("Active FT", "Resign FT", "Act PT", "Reg PT")
Col = Array(2, 3, 4, 5, 6, 22, 23, 24)
Pth = ActiveWorkbook.Path
Set Dic = CreateObject("Scripting.Dictionary")
Set Rng = Sheets(Arr(0)).Cells(1, 1)
For J = LBound(Col) To UBound(Col)
    Set Rng = Union(Rng, Sheets(Arr(0)).Cells(1, Col(J)))
Next J
ReDim dArr(1 To 65535, 1 To UBound(Col) + 2)
For N = LBound(Arr) To UBound(Arr)
    If N = 2 Then
        Dic.RemoveAll: K = K + 1: Ir = K + 1: Stt = 0
    End If
    With Sheets(Arr(N))
        sArr = .Range("A2", .Range("A" & Rows.Count).End(xlUp)).Resize(, 24).Value
        For I = 1 To UBound(sArr)
            Tem = sArr(I, 5)
            If Not Dic.Exists(Tem) Then
                Dic.Add Tem, ""
            Else
                K = K + 1: Stt = Stt + 1: dArr(K, 1) = Stt
                For J = LBound(Col) To UBound(Col)
                    dArr(K, J + 2) = sArr(I, Col(J))
                Next J
            End If
        Next I
    End With
Next N
If K Then
    Application.Workbooks.Add
    Set Ws = Application.ActiveSheet
    Rng.Copy
    With Ws
        .Range("A1").PasteSpecial xlPasteColumnWidths
        .Range("A1").PasteSpecial xlPasteValues
        .Range("A1").PasteSpecial xlPasteFormats
        .Range("A2").Resize(K, UBound(dArr, 2)) = dArr
        .Range("A1").Resize(K + 1, UBound(dArr, 2)).Borders.LineStyle = 1
        With Range("A" & Ir).Resize(, UBound(dArr, 2))
            .Interior.Color = 5287936
            .Borders(xlInsideVertical).LineStyle = xlNone
        End With
    End With
    Set Dic = Nothing
    MsgBox "Xong!"
Else
    MsgBox "Nothing"
End If
End Sub
 
Lần chỉnh sửa cuối:
Anh xem lại giúp em với :
- Em chỉ cần lọc ra dữ liệu bị trùng giữa 2 cặp sheet : Active FT vs Resign FTAct PT vs Reg PT. ( ý là so sánh sheet active ft và resign ft xem có giá trị trùng nào thì lọc ra, đk trùng là cột E ), tương tự với cặp sheet kia —> em chạy thấy kết quả ko ra giá trị trùng mà ra tất cả luôn.
- Nếu có thể thì 1 lần chạy code so sánh 2 cặp sheet trên thành 2 bảng riêng, phân tách bằng 1 hàng trống cũng đc ah.
- Anh cho em trích dữ liệu ra 1 workbook mới như kiểu tạm thời ( book1, book2,...) đc ko ạ. Ko cần đặt tên đâu ạ
Tạo 1 sheet mới tên GPE rồi chạy thử Sub này:
PHP:
Public Sub s_Gpe()
Dim Dic As Object, I As Long, J As Long, K As Long, K2 As Long
Dim sArr(), ArrFT(1 To 100, 1 To 10), ArrPT(1 To 100, 1 To 10)
Set Dic = CreateObject("Scripting.Dictionary")
'----------------------------------------------
sArr = Sheets("Active FT").Range("A2", Sheets("Active FT").Range("A2").End(xlDown)).Resize(, 24).Value
    For I = 1 To UBound(sArr)
        Dic.Item(sArr(I, 5)) = ""
    Next I
'----------------------------------------------
sArr = Sheets("Resign FT").Range("A2", Sheets("Resign FT").Range("A2").End(xlDown)).Resize(, 24).Value
    For I = 1 To UBound(sArr)
        If Dic.Exists(sArr(I, 5)) Then
            K = K + 1
            ArrFT(K, 1) = K
            ArrFT(K, 2) = sArr(I, 2)
            For J = 3 To 6
                ArrFT(K, J) = sArr(I, J)
                ArrFT(K, J + 4) = sArr(I, J + 18)
            Next J
        End If
    Next I
'---------------------------------------------
Dic.RemoveAll
sArr = Sheets("Act PT").Range("A2", Sheets("Act PT").Range("A2").End(xlDown)).Resize(, 24).Value
    For I = 1 To UBound(sArr)
        Dic.Item(sArr(I, 5)) = ""
    Next I
'----------------------------------------------
sArr = Sheets("Reg PT").Range("A2", Sheets("Reg PT").Range("A2").End(xlDown)).Resize(, 24).Value
    For I = 1 To UBound(sArr)
        If Dic.Exists(sArr(I, 5)) Then
            K2 = K2 + 1
            ArrPT(K2, 1) = K2
            ArrPT(K2, 2) = sArr(I, 2)
            For J = 3 To 6
                ArrPT(K2, J) = sArr(I, J)
                ArrPT(K2, J + 4) = sArr(I, J + 18)
            Next J
        End If
    Next I
'---------------------------------------------------
With Sheets("GPE")
    .Range("A2").Resize(1000, 10).ClearContents
    .Range("A2").Resize(K, 10) = ArrFT
    .Range("A2").Offset(K + 2).Resize(K2, 10) = ArrPT
End With
End Sub
 
Tạo 1 sheet mới tên GPE rồi chạy thử Sub này:
PHP:
Public Sub s_Gpe()
Dim Dic As Object, I As Long, J As Long, K As Long, K2 As Long
Dim sArr(), ArrFT(1 To 100, 1 To 10), ArrPT(1 To 100, 1 To 10)
Set Dic = CreateObject("Scripting.Dictionary")
'----------------------------------------------
sArr = Sheets("Active FT").Range("A2", Sheets("Active FT").Range("A2").End(xlDown)).Resize(, 24).Value
    For I = 1 To UBound(sArr)
        Dic.Item(sArr(I, 5)) = ""
    Next I
'----------------------------------------------
sArr = Sheets("Resign FT").Range("A2", Sheets("Resign FT").Range("A2").End(xlDown)).Resize(, 24).Value
    For I = 1 To UBound(sArr)
        If Dic.Exists(sArr(I, 5)) Then
            K = K + 1
            ArrFT(K, 1) = K
            ArrFT(K, 2) = sArr(I, 2)
            For J = 3 To 6
                ArrFT(K, J) = sArr(I, J)
                ArrFT(K, J + 4) = sArr(I, J + 18)
            Next J
        End If
    Next I
'---------------------------------------------
Dic.RemoveAll
sArr = Sheets("Act PT").Range("A2", Sheets("Act PT").Range("A2").End(xlDown)).Resize(, 24).Value
    For I = 1 To UBound(sArr)
        Dic.Item(sArr(I, 5)) = ""
    Next I
'----------------------------------------------
sArr = Sheets("Reg PT").Range("A2", Sheets("Reg PT").Range("A2").End(xlDown)).Resize(, 24).Value
    For I = 1 To UBound(sArr)
        If Dic.Exists(sArr(I, 5)) Then
            K2 = K2 + 1
            ArrPT(K2, 1) = K2
            ArrPT(K2, 2) = sArr(I, 2)
            For J = 3 To 6
                ArrPT(K2, J) = sArr(I, J)
                ArrPT(K2, J + 4) = sArr(I, J + 18)
            Next J
        End If
    Next I
'---------------------------------------------------
With Sheets("GPE")
    .Range("A2").Resize(1000, 10).ClearContents
    .Range("A2").Resize(K, 10) = ArrFT
    .Range("A2").Offset(K + 2).Resize(K2, 10) = ArrPT
End With
End Sub
Chịu cha nội này thật, viết ra một cái sub con gồm hai tham số, rồi gọi cái sub con đó từ sub chính, vừa viết ngắn mà lại cơ đông, thích bao nhiêu cặp sheet cũng được.
 
Tạo 1 sheet mới tên GPE rồi chạy thử Sub này:
PHP:
Public Sub s_Gpe()
Dim Dic As Object, I As Long, J As Long, K As Long, K2 As Long
Dim sArr(), ArrFT(1 To 100, 1 To 10), ArrPT(1 To 100, 1 To 10)
Set Dic = CreateObject("Scripting.Dictionary")
'----------------------------------------------
sArr = Sheets("Active FT").Range("A2", Sheets("Active FT").Range("A2").End(xlDown)).Resize(, 24).Value
    For I = 1 To UBound(sArr)
        Dic.Item(sArr(I, 5)) = ""
    Next I
'----------------------------------------------
sArr = Sheets("Resign FT").Range("A2", Sheets("Resign FT").Range("A2").End(xlDown)).Resize(, 24).Value
    For I = 1 To UBound(sArr)
        If Dic.Exists(sArr(I, 5)) Then
            K = K + 1
            ArrFT(K, 1) = K
            ArrFT(K, 2) = sArr(I, 2)
            For J = 3 To 6
                ArrFT(K, J) = sArr(I, J)
                ArrFT(K, J + 4) = sArr(I, J + 18)
            Next J
        End If
    Next I
'---------------------------------------------
Dic.RemoveAll
sArr = Sheets("Act PT").Range("A2", Sheets("Act PT").Range("A2").End(xlDown)).Resize(, 24).Value
    For I = 1 To UBound(sArr)
        Dic.Item(sArr(I, 5)) = ""
    Next I
'----------------------------------------------
sArr = Sheets("Reg PT").Range("A2", Sheets("Reg PT").Range("A2").End(xlDown)).Resize(, 24).Value
    For I = 1 To UBound(sArr)
        If Dic.Exists(sArr(I, 5)) Then
            K2 = K2 + 1
            ArrPT(K2, 1) = K2
            ArrPT(K2, 2) = sArr(I, 2)
            For J = 3 To 6
                ArrPT(K2, J) = sArr(I, J)
                ArrPT(K2, J + 4) = sArr(I, J + 18)
            Next J
        End If
    Next I
'---------------------------------------------------
With Sheets("GPE")
    .Range("A2").Resize(1000, 10).ClearContents
    .Range("A2").Resize(K, 10) = ArrFT
    .Range("A2").Offset(K + 2).Resize(K2, 10) = ArrPT
End With
End Sub
A ơi anh, do file em dùng là file ko đc phép thêm sheet ( do yêu cầu công việc ). Em dùng code để kiểm tra nên anh cho em kết quả ở workbook mới đc ko ạ ( book1, book2...).
Bạn thử lại với cái Code này nha
PHP:
Sub Compare()
    Dim Ws As Worksheet, Arr, Col, N As Long, Pth, Rng As Range
    Dim Dic As Object, Tem As String
    Dim sArr(), dArr(), I As Long, J As Long, K As Long, Stt As Long, Ir As Long
Arr = Array("Active FT", "Resign FT", "Act PT", "Reg PT")
Col = Array(2, 3, 4, 5, 6, 22, 23, 24)
Pth = ActiveWorkbook.Path
Set Dic = CreateObject("Scripting.Dictionary")
Set Rng = Sheets(Arr(0)).Cells(1, 1)
For J = LBound(Col) To UBound(Col)
    Set Rng = Union(Rng, Sheets(Arr(0)).Cells(1, Col(J)))
Next J
ReDim dArr(1 To 65535, 1 To UBound(Col) + 2)
For N = LBound(Arr) To UBound(Arr)
    If N = 2 Then
        K = K + 1: Ir = K + 1: Stt = 0
    End If
    With Sheets(Arr(N))
        sArr = .Range("A2", .Range("A" & Rows.Count).End(xlUp)).Resize(, 24).Value
        For I = 1 To UBound(sArr)
            Tem = sArr(I, 5)
            If Not Dic.Exists(Tem) Then
                Dic.Add Tem, ""
            Else
                K = K + 1: Stt = Stt + 1
                dArr(K, 1) = Stt
                For J = LBound(Col) To UBound(Col)
                    dArr(K, J + 2) = sArr(I, Col(J))
                Next J
            End If
        Next I
    End With
Next N
If K Then
    Application.Workbooks.Add
    Set Ws = Application.ActiveSheet
    Rng.Copy
    With Ws
        .Range("A1").PasteSpecial xlPasteColumnWidths
        .Range("A1").PasteSpecial xlPasteValues
        .Range("A1").PasteSpecial xlPasteFormats
        .Range("A2").Resize(K, UBound(dArr, 2)) = dArr
        .Range("A1").Resize(K + 1, UBound(dArr, 2)).Borders.LineStyle = 1
        With Range("A" & Ir).Resize(, UBound(dArr, 2))
            .Interior.Color = 5287936
            .Borders(xlEdgeRight).LineStyle = xlNone
            .Borders(xlInsideVertical).LineStyle = xlNone
            .Borders(xlInsideHorizontal).LineStyle = xlNone
        End With
    End With
    Set Dic = Nothing
    MsgBox "Xong!"
Else
    MsgBox "Nothing"
End If
End Sub
Do muộn rồi nên em onl bằng điện thoại nên cũng chưa thử đc. Nhưng em cũng rất cám ơn mn đã giúp đỡ.
 
Web KT

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

Back
Top Bottom