Lọc dữ liệu không trùng trên nhiều danh sách (1 người xem)

  • Thread starter Thread starter ttqt30
  • Ngày gửi Ngày gửi

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

ttqt30

Thành viên chính thức
Tham gia
30/9/08
Bài viết
82
Được thích
2
Em có 1 file Excel gồm 5 cột từ DanhSach1(DS1) đến DanhSach5(DS5)
Giờ em muốn So sánh DS1 với DS2 nếu trùng thì bỏ (chỉ lấy những dòng không trùng với DS2)
Tiếp tục lấy những dòng không trùng đó So sánh với DS3, được kết quả không trùng tiếp tục so sánh với DS4,DS5.
Tóm lại lấy DS1 so sánh với 4 danh sách kia, lấy ra những dòng không trùng với 4 DS kia
NHỜ ANH CHỊ XEM FILE ĐÍNH KÈM DÙM EM!
 
Lần chỉnh sửa cuối:
Em có 1 file Excel gồm 5 cột từ DanhSach1(DS1) đến DanhSach5(DS5)
Giờ em muốn So sánh DS1 với DS2 nếu trùng thì bỏ (chỉ lấy những dòng không trùng với DS2)
Tiếp tục lấy những dòng không trùng đó So sánh với DS3, được kết quả không trùng tiếp tục so sánh với DS4,DS5.
Tóm lại lấy DS1 so sánh với 4 danh sách kia, lấy ra những dòng không trùng với 4 DS kia
NHỜ ANH CHỊ XEM FILE ĐÍNH KÈM DÙM EM!
File đính kèm đâu?????
 
Upvote 0
[h=2]Lọc dữ liệu không trùng trên nhiều danh sách[/h]
Em có 1 file Excel gồm 5 cột từ DanhSach1(DS1) đến DanhSach5(DS5)
Giờ em muốn So sánh DS1 với DS2 nếu trùng thì bỏ (chỉ lấy những dòng không trùng với DS2)
Tiếp tục lấy những dòng không trùng đó So sánh với DS3, được kết quả không trùng tiếp tục so sánh với DS4,DS5.
Tóm lại lấy DS1 so sánh với 4 danh sách kia, lấy ra những dòng không trùng với 4 DS kia
NHỜ ANH CHỊ XEM FILE ĐÍNH KÈM DÙM EM!​

Hiệu chỉnh lần cuối bởi ttqt30; 03-08-14 lúc 10:40 PM
 
Upvote 0
DẠ ĐÂY ANH
Em có 1 file Excel gồm 5 cột từ DanhSach1(DS1) đến DanhSach5(DS5)
Giờ em muốn So sánh DS1 với DS2 nếu trùng thì bỏ (chỉ lấy những dòng không trùng với DS2)
Tiếp tục lấy những dòng không trùng đó So sánh với DS3, được kết quả không trùng tiếp tục so sánh với DS4,DS5.
Tóm lại lấy DS1 so sánh với 4 danh sách kia, lấy ra những dòng không trùng với 4 DS kia
NHỜ ANH CHỊ XEM FILE ĐÍNH KÈM DÙM EM!
 

File đính kèm

Upvote 0
DẠ ĐÂY ANH
Em có 1 file Excel gồm 5 cột từ DanhSach1(DS1) đến DanhSach5(DS5)
Giờ em muốn So sánh DS1 với DS2 nếu trùng thì bỏ (chỉ lấy những dòng không trùng với DS2)
Tiếp tục lấy những dòng không trùng đó So sánh với DS3, được kết quả không trùng tiếp tục so sánh với DS4,DS5.
Tóm lại lấy DS1 so sánh với 4 danh sách kia, lấy ra những dòng không trùng với 4 DS kia
NHỜ ANH CHỊ XEM FILE ĐÍNH KÈM DÙM EM!
Kết quả lấy ra là 1 cột hay là 5 cột như file bạn gửi ???
Nếu kết quả cần lọc bạn cho ra 1 cột nào đó thì công thức như sau:
Mã:
=IF(COUNTIF($A$2:$E$15;A2)>1;"";A2)
Kéo fill xuống đến khi nào gặp số 0 thì dừng.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Chỉ lấy ra 1 cột của ds1 đó anh!
Cột ds1 đó có du liệu không trùng với 4 cột kia
 
Upvote 0
Cảm ơn ANh Chuot0106!

Nếu mỗi danh sách trên mỗi sheet thì mình viết sao anh nhỉ? hay là phải chép các DS lại với nhau?nhoờ anh xem cảm ơn anh!
 
Upvote 0
Nếu mỗi danh sách trên mỗi sheet thì mình viết sao anh nhỉ? hay là phải chép các DS lại với nhau?nhoờ anh xem cảm ơn anh!
 
Upvote 0
Nếu mỗi danh sách trên mỗi sheet thì mình viết sao anh nhỉ? hay là phải chép các DS lại với nhau?nhoờ anh xem cảm ơn anh!
!
Nếu mỗi danh sách trên mỗi sheet thì mình viết sao anh nhỉ? hay là phải chép các DS lại với nhau?nhoờ anh xem cảm ơn anh!
 

File đính kèm

Upvote 0
!
Nếu mỗi danh sách trên mỗi sheet thì mình viết sao anh nhỉ? hay là phải chép các DS lại với nhau?nhoờ anh xem cảm ơn anh!
Muốn nhờ làm gì thì đưa dữ liệu giống thật từ đầu.
Bạn nhờ làm rồi, lại thay đổi cấu trúc dữ liệu, phải làm lại từ đầu, "khó chịu" cho người tốn công làm mà không xài được.
Bạn đặt tên sheet1 là "DS1"
Chạy code này thử xem:
[GPECODE=vb]Public Sub GPE()
Dim Dic As Object, sArr(), dArr(), I As Long, K As Long, Tem As String, Ws As Worksheet
Set Dic = CreateObject("Scripting.Dictionary")
For Each Ws In Worksheets
If Ws.Name <> "DS1" Then
sArr = Ws.Range(Ws.[A2], Ws.[A2].End(xlDown)).Value
For I = 1 To UBound(sArr, 1)
Tem = UCase(sArr(I, 1))
If Not Dic.Exists(Tem) Then
Dic.Add Tem, Empty
End If
Next I
End If
Next Ws
With Sheets("DS1")
sArr = .Range(.[A2], .[A2].End(xlDown)).Value
ReDim dArr(1 To UBound(sArr, 1), 1 To 1)
For I = 1 To UBound(sArr, 1)
Tem = UCase(sArr(I, 1))
If Not Dic.Exists(Tem) Then
K = K + 1
Dic.Add Tem, Empty
dArr(K, 1) = Tem
End If
Next I
If K Then .[G2].Resize(K) = dArr
End With
Set Dic = Nothing
End Sub[/GPECODE]
 

File đính kèm

Upvote 0
!
Nếu mỗi danh sách trên mỗi sheet thì mình viết sao anh nhỉ? hay là phải chép các DS lại với nhau?nhoờ anh xem cảm ơn anh!
Dùng tạm code củ chuối này xem sao.
Mã:
Public Sub loc()
Dim data(), kq(), i As Long, j As Long, rng As Range
Sheet1.Range("A2:A" & Sheet1.Range("A65500").End(xlUp).Row).Copy Sheet1.Range("O2")
Sheet2.Range("A2:A" & Sheet2.Range("A65500").End(xlUp).Row).Copy Sheet1.Range("P2")
Sheet3.Range("A2:A" & Sheet3.Range("A65500").End(xlUp).Row).Copy Sheet1.Range("Q2")
Sheet4.Range("A2:A" & Sheet4.Range("A65500").End(xlUp).Row).Copy Sheet1.Range("R2")
Sheet5.Range("A2:A" & Sheet5.Range("A65500").End(xlUp).Row).Copy Sheet1.Range("S2")

Set rng = Sheet1.Range("O2:S" & Sheet1.Range("S65500").End(xlUp).Row)
data = Sheet1.Range("O2:S" & Sheet1.Range("S65500").End(xlUp).Row)
ReDim kq(1 To UBound(data), 1 To 1)

For i = 1 To UBound(data)
    If Application.WorksheetFunction.CountIf(rng, Sheet1.Range("O" & i + 1)) = 1 Then
        j = j + 1
        kq(j, 1) = data(i, 1)
    End If
Next i
        Sheet1.Range("G2").Resize(j, 1) = kq
        rng.Borders.LineStyle = xlNone
        rng.ClearContents
End Sub
Mở File và nhấn nút "LỌC" xem kết quả nhé!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nhờ các anh giúp đỡ em đã làm dc rồi ah! !Thành thật Cảm ơn các Anh thật nhiều ! CHúc Các Anh chị trong diễn đàn 1 tuần làm việc hiệu quả !
 
Upvote 0
Nếu đua tốc độ thì code này có thể mần thịt được Dictionary đây
PHP:
Sub LocKhongTrung()
Dim Data(), Res(1 To 65536, 1 To 1), i As Long
Dim sh As Worksheet, Chk As Boolean, k As Long, Tim As Range
With Sheet1
    Data = .Range(.[A2], .[A65536].End(3)).Value
    For i = 1 To UBound(Data)
        For Each sh In Worksheets
            If sh.Name <> "DS1" Then
                Set Tim = sh.[A:A].Find(Data(i, 1), , , 1)
                If Not Tim Is Nothing Then
                    Chk = True:  Exit For
                Else
                    Chk = False
                End If
            End If
        Next
        If Chk = False Then
            k = k + 1
            Res(k, 1) = Data(i, 1)
        End If
    Next
    [G2].Resize(k) = Res
End With
End Sub
 
Upvote 0
Nếu đua tốc độ thì code này có thể mần thịt được Dictionary đây
PHP:
Sub LocKhongTrung()
Dim Data(), Res(1 To 65536, 1 To 1), i As Long
Dim sh As Worksheet, Chk As Boolean, k As Long, Tim As Range
With Sheet1
    Data = .Range(.[A2], .[A65536].End(3)).Value
    For i = 1 To UBound(Data)
        For Each sh In Worksheets
            If sh.Name <> "DS1" Then
                Set Tim = sh.[A:A].Find(Data(i, 1), , , 1)
                If Not Tim Is Nothing Then
                    Chk = True:  Exit For
                Else
                    Chk = False
                End If
            End If
        Next
        If Chk = False Then
            k = k + 1
            Res(k, 1) = Data(i, 1)
        End If
    Next
    [G2].Resize(k) = Res
End With
End Sub
Đua bằng cách nào ta? Sheet1 10.000 dòng không trùng, các sheet khác 5.000 dòng?
 
Upvote 0
Biết ngay là anh không chịu nổi mà. hí hí hí

Dic: 10 + 10 =20
For Next lồng 10 x10 =100
anh nói vậy là không đúng. muốn đánh giá thuật toán có tối ưu không? người ta đánh giá trên rất nhiều mặt, độ phức tạp của thuật toán, các phép tính, độ lớn các biển.. sau đó người ta mới tổng hợp lại xem cái nào tối ưu hơn
1 bài toán với 1 vòng lặp và rất nhiều điều kiện chưa chắc tối ưu hơn 2 vòng lặp có ít điều kiện nha anh.
với lại trong đề tài này nếu anh sử dụng dic anh chỉ thấy có 1 vòng lập nên anh nói tối ưu. điều này là không đúng? vì dic chẳng qua nó là 1 đoạn chương trình người ta đã dóng gói sẳn, anh biết trong đó có bao nhiêu vòng lặp bao nhiêu chức năng không?nêus mình gọi dic mình phải xài tất cả những chức năng đó thì chương trình của mình theo như lý thuyết nó sẽ nhiều chức năng hơn, như vậy là đã thấy chậm hơn nhiều so với mình chỉ sử dụng 2 vòng lặp cơ bản rồi.
 
Upvote 0
Bạn chọn vùng cần lọc rồi làm theo hình nhe
 

File đính kèm

  • 1.jpg
    1.jpg
    67 KB · Đọc: 7
  • 2.jpg
    2.jpg
    69.9 KB · Đọc: 3
  • 3.jpg
    3.jpg
    63.1 KB · Đọc: 3
  • 4.jpg
    4.jpg
    69.3 KB · Đọc: 4
  • LOC DU LIEU KHONG TRUNG.xlsx
    LOC DU LIEU KHONG TRUNG.xlsx
    11.8 KB · Đọc: 6
Upvote 0
anh nói vậy là không đúng. muốn đánh giá thuật toán có tối ưu không? người ta đánh giá trên rất nhiều mặt, độ phức tạp của thuật toán, các phép tính, độ lớn các biển.. sau đó người ta mới tổng hợp lại xem cái nào tối ưu hơn
1 bài toán với 1 vòng lặp và rất nhiều điều kiện chưa chắc tối ưu hơn 2 vòng lặp có ít điều kiện nha anh.
với lại trong đề tài này nếu anh sử dụng dic anh chỉ thấy có 1 vòng lập nên anh nói tối ưu. điều này là không đúng? vì dic chẳng qua nó là 1 đoạn chương trình người ta đã dóng gói sẳn, anh biết trong đó có bao nhiêu vòng lặp bao nhiêu chức năng không?nêus mình gọi dic mình phải xài tất cả những chức năng đó thì chương trình của mình theo như lý thuyết nó sẽ nhiều chức năng hơn, như vậy là đã thấy chậm hơn nhiều so với mình chỉ sử dụng 2 vòng lặp cơ bản rồi.
Mình không quen lòng vòng. Cuối cùng bài 13 và 15 thì bài nào tối ưu hơn? Mình luôn đơn giản trực tiếp đi thẳng vào vấn đề chính thôi.

*********
Mình viết bài 15 là vì muốn viết khác cách viết của bài 13 và 14 để cho những người bập bẹ VBA như mình có thể thấy được thuật toán khác nhau khi cùng xử lý 1 vấn đề. Chứ nếu ứng dụng thì chẳng dại gì mà không dùng Dictionary
 
Lần chỉnh sửa cuối:
Upvote 0
anh nói vậy là không đúng. muốn đánh giá thuật toán có tối ưu không? người ta đánh giá trên rất nhiều mặt, độ phức tạp của thuật toán, các phép tính, độ lớn các biển.. sau đó người ta mới tổng hợp lại xem cái nào tối ưu hơn
1 bài toán với 1 vòng lặp và rất nhiều điều kiện chưa chắc tối ưu hơn 2 vòng lặp có ít điều kiện nha anh.
với lại trong đề tài này nếu anh sử dụng dic anh chỉ thấy có 1 vòng lập nên anh nói tối ưu. điều này là không đúng? vì dic chẳng qua nó là 1 đoạn chương trình người ta đã dóng gói sẳn, anh biết trong đó có bao nhiêu vòng lặp bao nhiêu chức năng không?nêus mình gọi dic mình phải xài tất cả những chức năng đó thì chương trình của mình theo như lý thuyết nó sẽ nhiều chức năng hơn, như vậy là đã thấy chậm hơn nhiều so với mình chỉ sử dụng 2 vòng lặp cơ bản rồi.

Theo tôi hiểu thì người ta chỉ nói "hơn". Khi dùng từ này, người ta có quyền chủ quan.
Đối với đa số ở đây, tốc độ được coi là đứng hàng đầu. Cho nên chỉ cần đo mặt đó thôi. Code chạy nhanh đến một mức độ nào đó thì có quyền coi là tối ưu.

Vả lại, VBA không phải là ngôn ngữ chuyên lập trình và tổng quan như Java. Những tiêu chuẩn bạn đưa ra đó không áp dụng.
 
Upvote 0
... vì dic chẳng qua nó là 1 đoạn chương trình người ta đã dóng gói sẳn, anh biết trong đó có bao nhiêu vòng lặp bao nhiêu chức năng không?nêus mình gọi dic mình phải xài tất cả những chức năng đó thì chương trình của mình theo như lý thuyết nó sẽ nhiều chức năng hơn, như vậy là đã thấy chậm hơn nhiều so với mình chỉ sử dụng 2 vòng lặp cơ bản rồi.

Hôm nay rảnh, nói chuyện thêm về cái này với bạn.
Tương tự như Java có Java Beans, C có Macros và C++ có STL; VBA sử dụng cái Object Dictionary của bộ máy Scripting đã được tác giả hệ thống (MS và Windows) tối ưu hoá đến mức có thể coi như hoàn thiện rồi. Những công cụ này rất hiệu quả cho nên cứ việc sử dụng thoải mái. Chỉ cần để ý 2 điểm:

1. Hàm CreateObject cần một chút thì giờ để tạo đối tượng. Cho nên lưu ý cách tạo đối tượng một chút thì sẽ hiệu quả hơn. Có thể chạy lần đầu tiên hơi chậm vì Windows phải load API/DLL vào. Nhưng những lần sau rất nhanh vì đã có sẵn trong bộ nhớ. Khi test tốc độ, phải chú ý điểm này. Dùng hàm CreateObject là cách kết nối trễ (Late Binding), có thể không 100% hiệu quả. Nếu dùng cái này nhiều lần thì nên vào option-Reference để nối Scritping vào. Khi sử dụng kiểu này thì các phương thức sẽ được gọi theo kiểu kết nối sớm (Early Binding), và nhanh hơn nhiều (theo lời MS)

2. Một trong những ngoại lệ là bộ máy Regular Expression (Regex). Bộ máy này chính cơ bản của nó rất nặng cho nên sử dụng phải cẩn thận. Một ngoại lệ khác là ADO, có những trường hợp ADO không trả lại bộ nhớ sau khi đã sử dụng cho nên gọi kết nối nhiều lần trong một lần tính có thể bị kẹt bộ nhớ (memory locked -> crash)
 
Upvote 0

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

Back
Top Bottom