Lấy giá trị trùng ở các cột trong excel

  • Thread starter Thread starter umikare
  • Ngày gửi Ngày gửi
Liên hệ QC

umikare

Thành viên mới
Tham gia
25/12/10
Bài viết
10
Được thích
0
Hi các bác,
Em có 1 câu hỏi thể này: Giả sử em có 3 cột trong excel. Trong mỗi cột có nhiều các giá trị gồm dạng số và chữ vd là W001, W002. Các giá trị này lẫn lộn ở các hàng khác nhau, bây giờ em muốn lấy giá trị trùng của 3 cột để ra 1 cột khác thì phải làm thế nào. Ví dụ thế này
Cột 1 Cột 2 Cột 3
W001 W002 W003
W002 W003 W002
vậy giờ em muốn lấy giá trị trùng W002 thì làm sao ah.
 
Hi các bác,
Em có 1 câu hỏi thể này: Giả sử em có 3 cột trong excel. Trong mỗi cột có nhiều các giá trị gồm dạng số và chữ vd là W001, W002. Các giá trị này lẫn lộn ở các hàng khác nhau, bây giờ em muốn lấy giá trị trùng của 3 cột để ra 1 cột khác thì phải làm thế nào. Ví dụ thế này
Cột 1 Cột 2 Cột 3
W001 W002 W003
W002 W003 W002
vậy giờ em muốn lấy giá trị trùng W002 thì làm sao ah.
Ví dụ bằng file đính kèm, thêm kết quả muốn có cụ thể xem thế nào.
 

File đính kèm

Các bạn giỏi quá, mình kiến thức còn cùi quá, nên đọc công thức của bạn chưa hiểu gì cả. Thank bạn rất nhiều.
 
Hi các bác,
Em có 1 câu hỏi thể này: Giả sử em có 3 cột trong excel. Trong mỗi cột có nhiều các giá trị gồm dạng số và chữ vd là W001, W002. Các giá trị này lẫn lộn ở các hàng khác nhau, bây giờ em muốn lấy giá trị trùng của 3 cột để ra 1 cột khác thì phải làm thế nào. Ví dụ thế này
Cột 1 Cột 2 Cột 3
W001 W002 W003
W002 W003 W002

vậy giờ em muốn lấy giá trị trùng W002 thì làm sao ah.
tôi đang phân vân ý của bạn, là lấy giá trị duy nhất, hay cứ có 2 mã trở lên thì lấy sang cột khác?
 
Bản Excel của bác mhung1205, chưa đúng với ý của em, vì em thấy có những giá trị chi trùng ở 2 cột mà bác đã lấy cho sang cột khác rồi. Cái em cần là trùng cả ở 3 cột cơ.
 
Bản Excel của bác mhung1205, chưa đúng với ý của em, vì em thấy có những giá trị chi trùng ở 2 cột mà bác đã lấy cho sang cột khác rồi. Cái em cần là trùng cả ở 3 cột cơ.
Với dữ liệu lớn có thể bạn dùng VBA, đồng ý thì xem file
 

File đính kèm

Bản Excel của bác mhung1205, chưa đúng với ý của em, vì em thấy có những giá trị chi trùng ở 2 cột mà bác đã lấy cho sang cột khác rồi. Cái em cần là trùng cả ở 3 cột cơ.

Sorry bạn, mình chưa hiểu ý bạn lắm. Bạn xem file đính kèm xem đã đúng chưa nhé.
 

File đính kèm

@umikare : Cho mình hỏi cột C của bạn luôn là cột có nhiều giá trị nhất, nếu trong file thật cột A hoặc B có giá trị dài nhất thì nên chú ý ứng dụng công thức của bạn mhung12005 - 1 cách linh hoạt nhé không kết quả trả về sẽ bị sai, trong file bạn mhung12005 lấy cột C làm chuẩn...

@anh viehoai : Nếu lọc duy nhất của n cột thì mình phải tạo n+1 cái Dic hả anh??? Nhờ anh chỉ dẫn, cái món Dic này em vẫn gà mờ quá.
 
Lần chỉnh sửa cuối:
@umikare : Cho mình hỏi cột C của bạn luôn là cột có nhiều giá trị nhất, nếu trong file thật cột A hoặc B có giá trị dài nhất thì nên chú ý ứng dụng công thức của bạn mhung12005 - 1 cách linh hoạt nhé không kết quả trả về sẽ bị sai, trong file bạn mhung12005 lấy cột C làm chuẩn...

Gửi bạn hoamattroicoi !

Theo mình thì cột C có dữ liệu ngắn nhất cũng không anh hưởng gì chứ nhỉ ? Vì nếu dữ liệu ở cột C không trùng với cả hai cột A và B thì không lọc ra mà.
 
Gửi bạn hoamattroicoi !

Theo mình thì cột C có dữ liệu ngắn nhất cũng không anh hưởng gì chứ nhỉ ? Vì nếu dữ liệu ở cột C không trùng với cả hai cột A và B thì không lọc ra mà.
Gửi bạn mhung12005! Yêu cầu của tác giả là dữ liệu xuất hiện ở cả 3 cột thì trích xuất sang cột khác???
Vậy giờ mhung12005 thử đổi vị trí dữ liệu 2 cột B và C cho nhau xem kết quả thế nào nhé??? Copy dữ liệu cột C sang cột B và từ cột B sang cột C và kiểm tra kết quả hiển thị.
- Với dữ liệu cũ giá trị thỏa mãn : 88
- Sau khi đổi vị trí giá trị thỏa mãn sẽ là : 109 (có vài cái trùng nữa, có lọc duy nhất nữa không???) hoa mắt quá...hic
- ?????????????????????????????????????????
 
Lần chỉnh sửa cuối:
Gửi bạn mhung12005! Yêu cầu của tác giả là dữ liệu xuất hiện ở cả 3 cột thì trích xuất sang cột khác???
Vậy giờ mhung12005 thử đổi vị trí dữ liệu 2 cột B và C cho nhau xem kết quả thế nào nhé??? Copy dữ liệu cột C sang cột B và từ cột B sang cột C và kiểm tra kết quả hiển thị.
- Với dữ liệu cũ giá trị thỏa mãn : 88
- Sau khi đổi vị trí giá trị thỏa mãn sẽ là : 109 (có vài cái trùng nữa, có lọc duy nhất nữa không???) hoa mắt quá...hic
- ?????????????????????????????????????????

Cảm ơn bạn hoamattroicoi nhiều nhé !

Mình không trừ trường hợp: Dữ liệu trong 1 cột có trường hợp trùng. Hy vọng là tác giả có test lại. Chắc phải như vầy mới đúng.
 

File đính kèm

@anh viehoai : Nếu lọc duy nhất của n cột thì mình phải tạo n+1 cái Dic hả anh??? Nhờ anh chỉ dẫn, cái món Dic này em vẫn gà mờ quá.
n+1 là bao nhiêu hả Bé ??? Giả sử 10 cột đi thì dùng Mãng chẳng hề có vấn đề gì, nếu dùng công thức chắc chờ mõi mòn con mắc
Nhờ anh chỉ dẫn, cái món Dic này em vẫn gà mờ quá.
Mình học cái đó ở Đây nè
 
@anh viehoai : Nếu lọc duy nhất của n cột thì mình phải tạo n+1 cái Dic hả anh??? Nhờ anh chỉ dẫn, cái món Dic này em vẫn gà mờ quá.
Với bài này & dùng Dic thì có nhiều cách giải
Vì bạn VietHoai dùng 4 Dic nên bé Còi mới hỏi thế
Bài này có thể dùng 2 Dic cũng được:
Mã:
Public Sub TrungBaCot()
    Dim Vung, iHang, I, J, dic, dic1, dic2, K, Mg
    Set dic = CreateObject("scripting.dictionary")
    Set dic1 = CreateObject("scripting.dictionary")
    Vung = Sheets("sheet1").UsedRange
        For I = 4 To UBound(Vung)
            If Vung(I, 1) <> "" Then
                 If Not dic.exists(Vung(I, 1)) Then dic.Add Vung(I, 1), ""
            End If
                If Vung(I, 2) <> "" Then
                    If Not dic1.exists(Vung(I, 2)) Then dic1.Add Vung(I, 2), ""
            End If
        Next I
        ReDim Mg(1 To UBound(Vung), 1 To 1)
            For I = 4 To UBound(Vung)
                If Vung(I, 3) <> "" Then
                    If dic.exists(Vung(I, 3)) Then
                        If dic1.exists(Vung(I, 3)) Then
                            K = K + 1
                            Mg(K, 1) = Vung(I, 3)
                        End If
                    End If
                End If
            Next I
    [E4:E5000].ClearContents
    [E4].Resize(K, 1) = Mg
End Sub
Nếu đề bài thay đổi, thí dụ trùng trong N cột & không muốn tạo N-1 Dic thì vẫn có thể dùng 2 Dic
Dic 1 để add dữ liệu cột 1
Dic 2 add dữ liệu thỏa điều kiện của 2 cột 1 & 2
Tiếp tục dùng Dic 2 add dữ liệu thỏa điều kiện từ cột 3 ==> cột N
Khi chạy hết cột cuối cùng thì Dic 2 chính là kết quả
Hihi, nghĩ thế thôi chứ chưa thử ( lúc nào rảnh bé Còi thì thử xem sao)
:=\+Híc:=\+
 
Lần chỉnh sửa cuối:
Dạng bài này bao nhiêu cột dùng 1 Dic cũng được:
Mã:
Public Sub TrungBaCotB()
    Dim Vung, iHang, I, J, dic, K, kK, Mg, M, Kq
    Set dic = CreateObject("scripting.dictionary")
    Vung = Sheets("sheet1").UsedRange
    ReDim Mg(1 To UBound(Vung), 1 To 2)
        For J = 1 To 3
            For I = 4 To UBound(Vung)
                If J = 1 Then
                    If Vung(I, 1) <> "" Then
                        If Not dic.exists(Vung(I, 1)) Then
                            K = K + 1
                            dic.Add Vung(I, 1), K
                            Mg(K, 1) = Vung(I, 1): Mg(K, 2) = 1
                        End If
                    End If
                Else
                     If Vung(I, J) <> "" Then
                            If dic.exists(Vung(I, J)) Then
                                kK = dic.Item(Vung(I, J))
                                Mg(kK, 2) = Mg(kK, 2) + 1
                            End If
                     End If
                End If
            Next I
       Next J
                ReDim Kq(1 To UBound(Mg), 1 To 1)
                For I = 1 To K
                    If Mg(I, 2) = 3 Then
                        M = M + 1
                        Kq(M, 1) = Mg(I, 1)
                    End If
                Next I
    [G4:G5000].ClearContents
    [G4].Resize(M, 1) = Kq
End Sub
:=\+Híc:=\+
 
Thêm 1 cách không dùng dict, góp vui. Với dữ liệu lớn khoảng 50000 dòng hình như việc add vào dict có thể chậm hơn.
(trong file đính kèm có so sánh tốc độ 4 dict của anh VieHoai)
Không hiểu sao code của Bác ConCoGia chạy thiếu giá trị
 

File đính kèm

Lần chỉnh sửa cuối:
Dạng bài này bao nhiêu cột dùng 1 Dic cũng được:
Mã:
Public Sub TrungBaCotB()
    Dim Vung, iHang, I, J, dic, K, kK, Mg, M, Kq
    Set dic = CreateObject("scripting.dictionary")
    Vung = Sheets("sheet1").UsedRange
    ReDim Mg(1 To UBound(Vung), 1 To 2)
        For J = 1 To 3
            For I = 4 To UBound(Vung)
                If J = 1 Then
                    If Vung(I, 1) <> "" Then
                        If Not dic.exists(Vung(I, 1)) Then
                            K = K + 1
                            dic.Add Vung(I, 1), K
                            Mg(K, 1) = Vung(I, 1): Mg(K, 2) = 1
                        End If
                    End If
                Else
                     If Vung(I, J) <> "" Then
                            If dic.exists(Vung(I, J)) Then
                                kK = dic.Item(Vung(I, J))
                                Mg(kK, 2) = Mg(kK, 2) + 1
                            End If
                     End If
                End If
            Next I
       Next J
                ReDim Kq(1 To UBound(Mg), 1 To 1)
                For I = 1 To K
                    If Mg(I, 2) = 3 Then
                        M = M + 1
                        Kq(M, 1) = Mg(I, 1)
                    End If
                Next I
    [G4:G5000].ClearContents
    [G4].Resize(M, 1) = Kq
End Sub
:=\+Híc:=\+
Bác Cò không để dành sân cho bé Còi đá nữa, he he
Thanks bác Cò nhiều ạ!!!!
 
Không hiểu sao code của Bác ConCoGia chạy thiếu giá trị
Lấy kết quả thiếu là vì Cò viết ...trật một tý (If Mg(I, 2) > 2 Then)
Mã:
Public Sub TrungBaCotB()
    Dim Vung, iHang, I, J, dic, K, kK, Mg, M, Kq
    t = Timer
    Set dic = CreateObject("scripting.dictionary")
    Vung = Sheets("sheet1").Range("A4:C50000") '.UsedRange
    ReDim Mg(1 To UBound(Vung), 1 To 2)
        For J = 1 To 3
            For I = 1 To UBound(Vung)
                If J = 1 Then
                    If Vung(I, J) <> "" Then
                        If Not dic.exists(Vung(I, J)) Then
                            K = K + 1
                            dic.Add Vung(I, J), K
                            Mg(K, 1) = Vung(I, J): Mg(K, 2) = 1
                        End If
                    End If
                Else
                     If Vung(I, J) <> "" Then
                            If dic.exists(Vung(I, J)) Then
                                kK = dic.Item(Vung(I, J))
                                Mg(kK, 2) = Mg(kK, 2) + 1
                            End If
                     End If
                End If
            Next I
       Next J
                ReDim Kq(1 To UBound(Mg), 1 To 1)
                For I = 1 To K
                    If Mg(I, 2) > 2 Then
                        M = M + 1
                        Kq(M, 1) = Mg(I, 1)
                    End If
                Next I
    [G4:G5000].ClearContents
    [G4].Resize(M, 1) = Kq
    MsgBox Round(Timer - t, 5)
End Sub
Bạn cũng ....trật một tý vì mình chạy từ 4 ( sử dụng UsedRange) bạn khai báo Vùng dữ liệu ([A4:C5000]) thì phải cho nó chạy từ 1 chứ
Mình chỉ nghĩ bài này có thể dùng một Dic nên làm thử nhanh nhanh còn đi nhậu nên chưa kiểm tra kỹ thôi
Thân
:=\+Híc:=\+
 
Chào cả nhà.

Tôi có một câu hỏi sau mà chưa tìm thấy đáp án. Mong mọi người chỉ giáo, cũng là tìm dữ liệu trùng thôi.

Tôi có một cột chứa nhiều ô có giá trị giống nhau nhưng cập nhật liên tục không theo quy luật nào cả. Dùng công thức nào tôi biết được ô cuối cùng mà nó đang ở là ô nào trong cột?
 
Web KT

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

Back
Top Bottom