Lọc dữ liệu có mặt ở tất cả các cột

Liên hệ QC

hcl_pt

Thành viên thường trực
Tham gia
21/10/10
Bài viết
208
Được thích
11
Mình có trường hợp mong GPE giúp đỡ: dữ liệu ở sheet1: mình cần lọc lấy ra những dữ liệu CÓ MẶT ở tất cả các cột => kết quả dán sang sheet2
- Ví dụ: dữ liệu 31 có mặt ở tất cả các cột ở trong sheet1 sẽ dán vào sheet2
....
Xin trân trọng cảm ơn!
 

File đính kèm

  • LOCDULIEUTRUNGNHAUCACCOT.xlsx
    45.4 KB · Đọc: 51
Bạn muốn dán kiểu gì? Tất cả các vị trí xuất hiện số 31 là giữ nguyên vị trí?
Hay ở cột nào thì dồn lại tại cột đấy
Hay tất cả các số 31 tại các cột dồn về 1 cột?
 
Bạn muốn dán kiểu gì? Tất cả các vị trí xuất hiện số 31 là giữ nguyên vị trí?
Hay ở cột nào thì dồn lại tại cột đấy
Hay tất cả các số 31 tại các cột dồn về 1 cột?
Cảm ơn bạn, tất cả các số 31 tại các cột dồn về 1 cột nhưng chỉ cần dán 1 lần kết quả 31 thôi để mình biết là dữ liệu 31 là có mặt ở tất cả các cột!
 
Cảm ơn bạn, tất cả các số 31 tại các cột dồn về 1 cột nhưng chỉ cần dán 1 lần kết quả 31 thôi để mình biết là dữ liệu 31 là có mặt ở tất cả các cột!

Chưa nhìn thấy cách nào "gom" hơn. Bạn tạm chạy thử code "củ chuối" này xem sao nhé.
PHP:
Public Sub GPE()
Dim Dic As Object, Dem As Object, sArr(), tArr(), dArr(), Tem As String, Tem2 As String
Dim I As Long, J As Long, K As Long, C As Long, N As Long, R As Long, Rws As Long
Set Dic = CreateObject("Scripting.Dictionary")
Set Dem = CreateObject("Scripting.Dictionary")
With Sheet1
    C = .Range("A1").SpecialCells(xlLastCell).Column - 1
    R = .Range("A1").SpecialCells(xlLastCell).Row
    sArr = .Range("B5:B" & R).Resize(, C).Value
End With
ReDim tArr(1 To UBound(sArr), 1 To 2)
ReDim dArr(1 To UBound(sArr), 1 To 1)
    For I = 1 To UBound(sArr)
        If sArr(I, 1) <> Empty Then
            Tem = sArr(I, 1)
            If Not Dic.Exists(Tem) Then
                    K = K + 1: Dic.Add Tem, K
                    tArr(K, 1) = sArr(I, 1)
                    tArr(K, 2) = 1
            End If
        End If
    Next I
    For J = 2 To UBound(sArr, 2)
    Dem.RemoveAll
        For I = 1 To UBound(sArr)
            If sArr(I, J) <> Empty Then
                Tem = sArr(I, J)
                If Dic.Exists(Tem) Then
                    If Not Dem.Exists(sArr(I, J)) Then
                        Dem.Add sArr(I, J), ""
                        Rws = Dic.Item(Tem)
                        tArr(Rws, 2) = tArr(Rws, 2) + 1
                    End If
                End If
            End If
        Next I
    Next J
    For I = 1 To K
        If tArr(I, 2) = C Then
            N = N + 1
            dArr(N, 1) = tArr(I, 1)
        End If
    Next I
With Sheet2
    '.Range("E5").Resize(K, 2) = tArr'    'Chi de quan sat'
    .Range("B5").Resize(N) = dArr
    .Range("B5").Resize(N).Sort Key1:=.Range("B5")
End With
Set Dic = Nothing
Set Dem = Nothing
End Sub
 
Mình có trường hợp mong GPE giúp đỡ: dữ liệu ở sheet1: mình cần lọc lấy ra những dữ liệu CÓ MẶT ở tất cả các cột => kết quả dán sang sheet2
- Ví dụ: dữ liệu 31 có mặt ở tất cả các cột ở trong sheet1 sẽ dán vào sheet2
....
Xin trân trọng cảm ơn!
-------------------------
 
Lần chỉnh sửa cuối:
Mình có trường hợp mong GPE giúp đỡ: dữ liệu ở sheet1: mình cần lọc lấy ra những dữ liệu CÓ MẶT ở tất cả các cột => kết quả dán sang sheet2
- Ví dụ: dữ liệu 31 có mặt ở tất cả các cột ở trong sheet1 sẽ dán vào sheet2
....
Xin trân trọng cảm ơn!
góp thêm code
Mã:
Sub SoTrung()
Dim Dic As Object
With Sheets("sheet1")
dArr = Range(.Cells(5, 2), .Cells(5, 2).End(xlDown))
Set Dic = CreateObject("Scripting.Dictionary")
ReDim arr(1 To UBound(dArr), 1 To 1)
lastcot = .Cells(5, 2).End(2).Column
On Error Resume Next
For I = 1 To UBound(dArr)
    If Not Dic.Exists(dArr(I, 1)) Then
        Dic.Add dArr(I, 1), ""
        Tmp = 0
        For J = 3 To lastcot
            tim = Range(.Cells(5, J), .Cells(5, J).End(xlDown)).Find(dArr(I, 1), LookIn:=xlValues).Row
            If tim > 0 Then Tmp = Tmp + 1
            tim = 0
        Next
        If Tmp = lastcot - 2 Then
            K = K + 1
            arr(K, 1) = dArr(I, 1)
        End If
    End If
Next
End With
Sheets("sheet2").Cells(3, 2).Resize(K, 1) = arr
End Sub
 
Chỉnh code lại 1 chút đỡ được 1 Dic. Ngắn hơn được 1 chút.
Chuyện tốc độ thì không tính nhé.
PHP:
Public Sub GPE_2()
Dim Dic As Object, sArr(), tArr(), Tem As String
Dim I As Long, J As Long, K As Long, C As Long, R As Long, Rws As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    C = .Range("A1").SpecialCells(xlLastCell).Column - 1
    R = .Range("A1").SpecialCells(xlLastCell).Row
    sArr = .Range("B5:B" & R).Resize(, C).Value
End With
ReDim tArr(1 To UBound(sArr), 1 To 2)
    For I = 1 To UBound(sArr)
        If sArr(I, 1) <> Empty Then
            Tem = sArr(I, 1)
            If Not Dic.Exists(Tem) Then
                K = K + 1:              Dic.Add Tem, K
                tArr(K, 1) = sArr(I, 1)
                tArr(K, 2) = 1
            End If
        End If
    Next I
        For J = 2 To UBound(sArr, 2)
            For I = 1 To UBound(sArr)
                If sArr(I, J) <> Empty Then
                    Tem = sArr(I, J)
                    If Dic.Exists(Tem) Then
                        Rws = Dic.Item(Tem)
                        If tArr(Rws, 2) + 1 = J Then
                            tArr(Rws, 2) = J
                        ElseIf tArr(Rws, 2) + 1 < J Then
                            Dic.Remove Tem
                        End If
                    End If
                End If
            Next I
        Next J
With Sheet2
    .Range("B5:B200").ClearContents
    Rws = Dic.Count
    If Rws Then
        .Range("B5").Resize(Rws) = Application.WorksheetFunction.Transpose(Dic.Keys)
        .Range("B5").Resize(Rws).Sort Key1:=.Range("B5"), Order1:=xlAscending
    End If
End With
Set Dic = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Đông vui
PHP:
Sub Loc()
Dim ArrData, ArrCheck() As Boolean, I As Long, J As Long
ArrData = Sheet1.Range("B5").CurrentRegion.Value
ReDim ArrCheck(0 To 99, 1 To UBound(ArrData, 2))
For J = 1 To UBound(ArrData, 2)
    For I = 1 To UBound(ArrData, 1)
        If ArrData(I, J) = "" Then GoTo NextCol Else ArrCheck(CLng(ArrData(I, J)), J) = True
    Next
NextCol:
Next
Sheet2.Range("B2:B101").ClearContents
For I = 0 To 99
    For J = 1 To UBound(ArrCheck, 2)
        If Not ArrCheck(I, J) Then GoTo NextNum
    Next
    Sheet2.Cells(101, 2).End(xlUp).Offset(1).Value = I
NextNum:
Next
End Sub
 
Mình cũng xin góp 1 code
Mã:
Sub choi()
Dim I As Integer, Query As String
    For I = 2 To 33
        Query = Query & " SELECT distinct f" & I - 1 & " FROM [B5:AK250] union all"
    Next
    Query = Left(Query, Len(Query) - 10)
    Query = "select f1, count(f1) from (" & Query & ") group by f1 having count(f1) = 36"
    Set cn = CreateObject("ADODB.Connection")
    cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=NO"";")
    Set rs = cn.Execute(Query)
    Sheets(2).Range("D1").CopyFromRecordset rs
End Sub
 
Lần chỉnh sửa cuối:
Mình có trường hợp mong GPE giúp đỡ: dữ liệu ở sheet1: mình cần lọc lấy ra những dữ liệu CÓ MẶT ở tất cả các cột => kết quả dán sang sheet2
- Ví dụ: dữ liệu 31 có mặt ở tất cả các cột ở trong sheet1 sẽ dán vào sheet2
....
Xin trân trọng cảm ơn!
Mình chỉnh lại CT, lần này ok rồi, CT tại A1 sheet2:
Mã:
A1=IFERROR(IF(SUM(LOOKUP(ROW($1:$36),SMALL(IF((--Sheet1!$B$5:$AK$245=ROW(A1)),COLUMN($A$4:$AJ$4)),ROW(INDIRECT("1:"&SUM((--Sheet1!$B$5:$AK$245=ROW(A1))*1))))))=666,ROW(A1),""),"")
CTrl+Shift+Enter rồi fill xuống 100, sau đó bạn filter cột A lấy <> ""!!
 
Lần chỉnh sửa cuối:
Mình có trường hợp mong GPE giúp đỡ: dữ liệu ở sheet1: mình cần lọc lấy ra những dữ liệu CÓ MẶT ở tất cả các cột => kết quả dán sang sheet2
- Ví dụ: dữ liệu 31 có mặt ở tất cả các cột ở trong sheet1 sẽ dán vào sheet2
....
Xin trân trọng cảm ơn!
Mã:
=INDEX(Sheet1!B:B;LARGE((MMULT(--(COUNTIF(OFFSET(Sheet1!B$5:B$245;;COLUMN(Sheet1!B:AK)-COLUMN(Sheet1!B:B));IF(MATCH(Sheet1!B$5:B$245;Sheet1!B:B;0)=ROW(Sheet1!B$5:B$245);Sheet1!B$5:B$245))>0);--TRANSPOSE(COLUMN(Sheet1!B:AK)>0))=COLUMNS(Sheet1!B:AK))*ROW(Sheet1!B$5:B$245);ROW(1:1)))
ctrl+shift+enter ???
 
Mình chỉnh lại CT, lần này ok rồi, CT tại A1 sheet2:
Mã:
A1=IFERROR(IF(SUM(LOOKUP(ROW($1:$36),SMALL(IF((--Sheet1!$B$5:$AK$245=ROW(A1)),COLUMN($A$4:$AJ$4)),ROW(INDIRECT("1:"&SUM((--Sheet1!$B$5:$AK$245=ROW(A1))*1))))))=666,ROW(A1),""),"")
CTrl+Shift+Enter rồi fill xuống 100, sau đó bạn filter cột A lấy <> ""!!
Công thức này có lẽ nhanh hơn một tí
Mã:
=IF(MAX(FREQUENCY(COLUMN($B$5:$AK$5),($B$5:$AK$219=TEXT(ROW(A1)-1,"00"))*COLUMN($B$5:$AK$5)))=1,ROW(A1)-1,"")
P/S: Hình như bạn quên kiểm tra số 00
 
Chia sẻ thêm một code nữa với Dictionary, bạn có thể tham khảo nếu muốn :

Mã:
Public Sub XuatHien_AllColumn()    

    Dim sArr, dArr
    Dim t, Tmp
    Dim n As Long, i As Long, j As Long, k As Long, m As Long
    Dim Dic As Object
    t = Timer
    Set Dic = CreateObject("scripting.dictionary")
    
    m = Sheet1.[IV5].End(xlToLeft).Column - 1
    With Sheet1
        k = .[B65000].End(xlUp).Row
        For j = 2 To m
            i = .[B65000].Offset(0, j - 1).End(xlUp).Row
            If k < i Then k = i
        Next j
        sArr = .[B5].Resize(k - 4 + 1, m)
    End With
    n = UBound(sArr)


    j = 1
    For i = 1 To UBound(sArr)
        If sArr(i, j) <> "" Then
            If Not Dic.Exists(sArr(i, j)) Then Dic.Add sArr(i, j), 1
        End If
    Next i


    For j = 2 To m
        For i = 1 To UBound(sArr)
            If sArr(i, j) <> "" Then
                If Dic.Exists(sArr(i, j)) Then
                    If Dic.Item(sArr(i, j)) = j - 1 Then Dic.Item(sArr(i, j)) = Dic.Item(sArr(i, j)) + 1
                End If
            End If
        Next i
    Next j
    
    ReDim dArr(1 To k, 1 To 1)
    j = 0
    For Each Tmp In Dic.Keys
        If Dic.Item(Tmp) = m Then
            j = j + 1
            dArr(j, 1) = Tmp
        End If
    Next
    
    Set Dic = Nothing
    
    Sheet2.[C3:C5000].ClearContents
    Sheet2.[C3].Resize(j, 1) = dArr
    
    MsgBox Round(Timer - t, 5)

End Sub
 
Lần chỉnh sửa cuối:
Cảm ơn GPE rất nhiều! Mình vẫn dùng file đó mong GPE xem giúp trường hợp này : cần kiểm tra xem từng dữ liệu từ 00 đến 99 ở sheet1 xuất hiện ở bao nhiêu cột (đếm số cột dữ liệu xuất hiện)=> kết quả dán sang sheet2
Ví dụ: dữ liệu 03 xuất hiện ở 36 cột, 11 xuất hiện ở 36 cột => kết quả dán vào ô tương ứng ở sheet2
Xin trân trọng cảm ơn!
 

File đính kèm

  • LOCDULIEUTRUNGNHAUCACCOT.xlsx
    43.4 KB · Đọc: 17
Cảm ơn GPE rất nhiều! Mình vẫn dùng file đó mong GPE xem giúp trường hợp này : cần kiểm tra xem từng dữ liệu từ 00 đến 99 ở sheet1 xuất hiện ở bao nhiêu cột (đếm số cột dữ liệu xuất hiện)=> kết quả dán sang sheet2
Ví dụ: dữ liệu 03 xuất hiện ở 36 cột, 11 xuất hiện ở 36 cột => kết quả dán vào ô tương ứng ở sheet2
Xin trân trọng cảm ơn!
bạn chạy code
Mã:
Sub SoTrung()
Dim Dic As Object, Arr, Darr(), i As Integer, j As Integer, tim As Integer, tmp As Integer
With Sheets("sheet2")
Range("C2:C101").ClearContents
Darr = Range(.Cells(2, 2), .Cells(2, 2).End(xlDown)).Resize(, 2)
ReDim Arr(1 To UBound(Darr), 1 To 1)
End With
With Sheets("sheet1")
lastcot = .Cells(5, 2).End(2).Column
On Error Resume Next
For i = 1 To UBound(Darr)
    tmp = 0
    For j = 2 To lastcot
        tim = 0
        tim = Range(.Cells(5, j), .Cells(5, j).End(xlDown)).Find(Darr(i, 1), LookIn:=xlValues).Row
        If tim > 0 Then tmp = tmp + 1
    Next
    Arr(i, 1) = tmp
Next
End With
Sheets("sheet2").Cells(2, 3).Resize(i - 1) = Arr
End Sub
 
Cảm ơn GPE rất nhiều! Mình vẫn dùng file đó mong GPE xem giúp trường hợp này : cần kiểm tra xem từng dữ liệu từ 00 đến 99 ở sheet1 xuất hiện ở bao nhiêu cột (đếm số cột dữ liệu xuất hiện)=> kết quả dán sang sheet2
Ví dụ: dữ liệu 03 xuất hiện ở 36 cột, 11 xuất hiện ở 36 cột => kết quả dán vào ô tương ứng ở sheet2
Xin trân trọng cảm ơn!
Thay đổi code cũ theo y/c của bạn. code # để bạn tham khảo
Mã:
Sub choi()
Dim I As Integer, Query As String
    For I = 2 To 33
        Query = Query & " SELECT distinct f" & I - 1 & " FROM [B5:AK250] union all"
    Next
    Query = "select f1, count(f1) from (" & Left(Query, Len(Query) - 10) & ") group by f1"
    Set cn = CreateObject("ADODB.Connection")
    cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=NO"";")
    Set rs = cn.Execute(Query)
    Sheets(2).Range("D1").CopyFromRecordset rs
End Sub
 
Lần chỉnh sửa cuối:
Cảm ơn GPE rất nhiều! Mình vẫn dùng file đó mong GPE xem giúp trường hợp này : cần kiểm tra xem từng dữ liệu từ 00 đến 99 ở sheet1 xuất hiện ở bao nhiêu cột (đếm số cột dữ liệu xuất hiện)=> kết quả dán sang sheet2
Ví dụ: dữ liệu 03 xuất hiện ở 36 cột, 11 xuất hiện ở 36 cột => kết quả dán vào ô tương ứng ở sheet2
Xin trân trọng cảm ơn!
CT tại C2 sheet2:
Mã:
C2=SUM((IFERROR(LOOKUP(ROW($1:$36),SMALL(IF(Sheet1!$B$5:$AG$245=B2,COLUMN($A$5:$AF$5)),ROW(INDIRECT("1:"&SUM((Sheet1!$B$5:$AG$245=B2)*1))))),0)=ROW($1:$36))*1)
Ctrl+Shift+Enter rồi fill xuống!!!
P/s: dữ liệu bạn có 32 cột mà bạn!!!
 
Cảm ơn GPE rất nhiều! Mình vẫn dùng file đó mong GPE xem giúp trường hợp này : cần kiểm tra xem từng dữ liệu từ 00 đến 99 ở sheet1 xuất hiện ở bao nhiêu cột (đếm số cột dữ liệu xuất hiện)=> kết quả dán sang sheet2
Ví dụ: dữ liệu 03 xuất hiện ở 36 cột, 11 xuất hiện ở 36 cột => kết quả dán vào ô tương ứng ở sheet2
Xin trân trọng cảm ơn!
Thêm lựa chọn cho bạn (công thức mảng)
Mã:
=SUM(--(MMULT(--TRANSPOSE(Sheet1!$B$5:$AG$245=B2),ROW(OFFSET($A$1,,,ROWS(Sheet1!$B$5:$AG$245))))>0))
 
Web KT

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

Back
Top Bottom