So sánh trùng và không trùng trên 2 cột.

Liên hệ QC
Lúc mở topic không nghĩ đến kết quả lại có thể đạt được như hiện nay. . . . Đã sử dụng file trong công việc hiện tại và kết quả là rất tuyệt. Xin cám ơn tất cả.
To VienDo : Nếu cột 'E' hay 2 cột 'C' & 'D' không cần chép ra mà cần tô màu tại chổ ('A' hay 'B') thì có cản trở gì đến công việc không vậy?
Mình thử không chép cột 'D', mà thay vô đó, ta tô màu các ô cột 'A' thỏa thì cũng nhanh hơn chút đó nha!
VD:
PHP:
    Else
         Cells(jZ, 1).Interior.ColorIndex = 5
' '       Range("E" & Range("E65432").End(xlUp).Row + 1) = Cells(jZ, 1)
        If jZ > jW + SoGiam Then jW = jZ - SoGiam
 
SA_DQ đã viết:
To VienDo : Nếu cột 'E' hay 2 cột 'C' & 'D' không cần chép ra mà cần tô màu tại chổ ('A' hay 'B') thì có cản trở gì đến công việc không vậy?
Mình thử không chép cột 'D', mà thay vô đó, ta tô màu các ô cột 'A' thỏa thì cũng nhanh hơn chút đó nha!
Không được đâu Sư phụ ơi, trong công việc phải lọc danh sách ra mới được. Sư phụ tận tình quá -\\/. Thanks

Chúc Sư phụ mạnh khỏe công tác tốt.
 
BAP này khởi sự cuộc chạy đua tốc độ, rồi đứng ngoài hưởng lợi nha!

Mr Okebab đã viết:
Em cũng muốn thử nhào vô, tuy nhiên vì các bác đã gần chạm đích rồi, mà mình bây giờ mới bắt đầu thì . . . còn lâu mới kịp. Vì thế lại thôi. Tuy nhiên . . . các bác như vậy thì học được nhiều rồi. Thôi, đành làm kẻ đứng ngoài, chờ các bác rơi vãi cái gì thì nhặt đem về nhà dùng vậy.
Be be be!!
Bằng chứng ư, đây thôi:
Dùng Countif quả thật nhanh hơn For (đã có bài về vấn đề này), tuy nhiên hàm MATCH sẽ nhanh hơn nhiều. Đơn giản bởi Countif luôn luôn phải quét hết mảng, còn MATCH thì không, đặc biệt là với mảng được sắp xếp.
Thân!
Dù sao cũng rất cảm ơn BAP ta nhiều, trong chuyển ra mồ hôi này!
(Nó lọc sạch tâm tư - như 1 nhà thơ đã nêu!)
Xin chào & hẹn gặp BAP sớm trong kỳ gần đây!)
Tạm biệt Topic luôn nha!
imagesCAHTB5FL.jpg
 
Lần chỉnh sửa cuối:
Xin cho hỏi, vấn đề này sao các anh không sử dụng vlookup???
 
Bọn này để giành cho bạn í chứ!!
Zui nha & đừng zận!
Bạn thử sức mình với í tưởng VLOOKUP() xem sao!
/)/hờ các MOD/SMOD ngang qua đây xóa giúp bài này!​
. . . . . . . .

Các bác xem thử file của em xem và góp ý nhé.
Việc sau đó là sắp xếp lại dữ liệu cho dễ nhìn (động tác này chẳng qua là advance filter và sort dữ liệu lại thôi, cái này các bác ràng hơn em là cái chắc) Em có tạo một cái nút để cho nó tự động làm cái việc này. Thanks các bác trước nhé.
 

File đính kèm

  • KiemTraSoSanh2List.rar
    19.2 KB · Đọc: 369
Lần chỉnh sửa cuối:
Các bác xem thử file của em xem và góp ý nhé.
Việc sau đó là sắp xếp lại dữ liệu cho dễ nhìn (động tác này chẳng qua là advance filter và sort dữ liệu lại thôi, cái này các bác ràng hơn em là cái chắc) Em có tạo một cái nút để cho nó tự động làm cái việc này. Thanks các bác trước nhé.
Bạn hảy thử với dử liệu lớn khoảng 10.000 dòng trở lên rồi mới nói chuyện tiếp nhé! Ở đây người ta đang quan tâm đến thuật toán về tốc độ đấy! Bạn nghiên cứu xem!
ANH TUẤN
 
Bạn hảy thử với dử liệu lớn khoảng 10.000 dòng trở lên rồi mới nói chuyện tiếp nhé! Ở đây người ta đang quan tâm đến thuật toán về tốc độ đấy! Bạn nghiên cứu xem!
ANH TUẤN

Em cũng không rành về việc đo thời gian. Tuy nhiên em thử với dữ liệu 30.000 dòng, sau khi copy công thức xuống và click nút thì mất khoản 10 giây. cấu hình máy em là Core2Duo 1.6Ghz ram 1Gb.
 
To: Bác SA,
Em đã test file của Bác với cấu hình
CauHinhMay.jpg


Và kết quả sẽ là:
BacSA1.jpg


Nếu Bác thêm vào
Mã:
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
ở đầu thủ tục, và cuối thủ tục
Mã:
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Thì kết quả là:
BacSA2.jpg


LVD
 
Lọc tìm số liệu theo điều kiện tương ứng

Chào cả nhà. Mình có hai sheep muốn tìm số liệu của sheep này đưa sang sheep khác với điều kiện lấy tương ứng đúng theo 2 cột số liệu cho trước.
Kèm theo file nhờ mọi người giúp đỡ
Cám ơn rất nhiều!.
 
Chào cả nhà. Mình có hai sheep muốn tìm số liệu của sheep này đưa sang sheep khác với điều kiện lấy tương ứng đúng theo 2 cột số liệu cho trước.
Kèm theo file nhờ mọi người giúp đỡ
Cám ơn rất nhiều!.
Bài này ta dùng VLOOKUP thôi (lý nào bạn chưa biết)
Gõ vào cell G6 công thức:
=VLOOKUP($A6,A201S!$A$6:$G$161,7,0)
 
Từ VD của bác viendo, tôi viết code theo suy luận của bác dmtdmtbb và dùng hàm match như gợi ý của bác OkeBab, thấy thời gian để cho ra kết quả là chưa đầy 1 phút (cấu hình máy của tôi: Intel Pentium 3.0GHz x 2, Ram 1.0GB).
PHP:
Sub LocDs()
Dim i As Integer
Dim Rnum1 As Integer, Rnum2 As Integer, m, n, Ti
On Error Resume Next
Rnum1 = Cells(Rows.Count, 1).End(xlUp).Row
Rnum2 = Cells(Rows.Count, 2).End(xlUp).Row
m = 1
n = 1
Ti = Timer
For i = 1 To Rnum1
    If WorksheetFunction.Match(Cells(i, 1), Range("B1:B" & Rnum2), 0) = 0 Then
        Cells(m, 3) = Cells(i, 1)
        m = m + 1
    Else
        Cells(n, 5) = Cells(i, 1)
        n = n + 1
    End If
Next
m = 0
For i = 1 To Rnum2
    If WorksheetFunction.Match(Cells(i, 2), Range("A1:A" & Rnum1), 0) = 0 Then
        Cells(m, 4) = Cells(i, 2)
        m = m + 1
    End If
Next
Cells(1, 7) = Timer - Ti
End Sub

Sửa chút xíu thế này sẽ cải thiện tốc độ đáng kể (đã test 20 000 dòng trong file đính kèm)
PHP:
Option Explicit

Sub GPE()
Dim Tmp, List1 As Range, List2 As Range, clls As Range
Dim Tg, i As Long, j As Long, t As Long
    Set List1 = Range([a3], [a3].End(xlDown))
    Set List2 = Range([b3], [b3].End(xlDown))
Tg = Timer
For i = 3 To 5
    Range(Cells(3, i), Cells(3, i).End(xlDown)).ClearContents
Next
Tmp = [c3].Resize(60000, 3).Value
i = 0: j = 0: t = 0
For Each clls In List1
    If Application.IsNA(Application.Match(clls, List2, 0)) Then
        i = i + 1: Tmp(i, 1) = clls
    End If
Next
For Each clls In List2
    If Application.IsNA(Application.Match(clls, List1, 0)) Then
        j = j + 1: Tmp(j, 2) = clls
    Else
        t = t + 1: Tmp(t, 3) = clls
    End If
Next
    [c3].Resize(Application.Max(i, j, t), 3) = Tmp
    [g1] = Timer - Tg
End Sub
 

File đính kèm

  • Ktra SoSanh 2List.rar
    94.6 KB · Đọc: 516
CÓ bác nào có file êxcel chuẩn của cái trên chưa cho em xin với, hoặc chỉ cần Lọc dữ liệu trùng cột A và B cũng đc, em cảm ơn rất nhiều !
 
Theo em câu lệnh : =IF(ISERROR(MATCH(E2,$A$2:$A$22601,0)),"","Có ở vị trí "&MATCH(E2,$A$2:$A$22601,0))

Là nhanh nhất, chính xác.

Tuy nhiên chỉ áp dụng cho so sánh 2 cột, dữ liệu trùng thì báo.
 
Những người ở bài viết này còn sống ko nhỉ ? Thấy tên Phạm Duy Long ( Thành Viên đã mất ) ko biết ý nghĩa này là gì , hiểu sao cho đúng nữa . Tính hỏi mà thấy vậy ... quỳ lạy luôn .
Trường hợp các bạn đang đề cập ở chủ đề này dường như chỉ nói đến 2 list = nhau thì fai . Khác nhau thì sao ???
Mãi mới kiếm được bài viết giống giống . Tiếc là đã sinh ra mười mấy năm trời . Ko biết lôi đầu lên có bị la mắng ko nữa .
Bài đã được tự động gộp:

CÓ bác nào có file êxcel chuẩn của cái trên chưa cho em xin với, hoặc chỉ cần Lọc dữ liệu trùng cột A và B cũng đc, em cảm ơn rất nhiều !
Bạn này hỏi từ năm đó tới năm nay vẫn chưa có ai hồi đáp . Tới mình chắc xanh cỏ luôn rồi quá . Bởi mới nói cái câu hỏi tưởng chừng đơn giản mà chưa đâu vào đâu
 
Lần chỉnh sửa cuối:
Những người ở bài viết này còn sống ko nhỉ ? Thấy tên Phạm Duy Long ( Thành Viên đã mất ) ko biết ý nghĩa này là gì , hiểu sao cho đúng nữa . Tính hỏi mà thấy vậy ... quỳ lạy luôn .
Trường hợp các bạn đang đề cập ở chủ đề này dường như chỉ nói đến 2 list = nhau thì fai . Khác nhau thì sao ???
Mãi mới kiếm được bài viết giống giống . Tiếc là đã sinh ra mười mấy năm trời . Ko biết lôi đầu lên có bị la mắng ko nữa .
Bài đã được tự động gộp:


Bạn này hỏi từ năm đó tới năm nay vẫn chưa có ai hồi đáp . Tới mình chắc xanh cỏ luôn rồi quá . Bởi mới nói cái câu hỏi tưởng chừng đơn giản mà chưa đâu vào đâu
Hỏi gì gửi file lên coi.
 
Hỏi gì gửi file lên coi.
có ngay . Ở đâu mà dậy sớm vậy bạn ?
Với mình , chỉ cần chọn những dữ liệu của B ko có ở A . Nghĩa là lấy dữ liệu của A mà ko có ở B . Vậy thôi , ko lấy trùng , vì dữ liệu của B đã có trong A rồi , nên chỉ lấy cái ở A ko có ở B . Hy vọng gặp cao nhân chỉ giáo . Thanks . Ko cần nhanh hay chậm . Cứ đúng là đc :D
 

File đính kèm

  • Book1.xlsx
    1.8 MB · Đọc: 8
có ngay . Ở đâu mà dậy sớm vậy bạn ?
Với mình , chỉ cần chọn những dữ liệu của B ko có ở A . Nghĩa là lấy dữ liệu của A mà ko có ở B . Vậy thôi , ko lấy trùng , vì dữ liệu của B đã có trong A rồi , nên chỉ lấy cái ở A ko có ở B . Hy vọng gặp cao nhân chỉ giáo . Cảm ơn . Ko cần nhanh hay chậm . Cứ đúng là đc :D
Ban dung code nay xem nhe.
Mã:
Sub laygiatri()
Dim arr, arr1
Dim lr As Long, a As Long, i As Long
Dim dic As Object, dk As String
Set dic = CreateObject("scripting.dictionary")
With Sheets(1)
    lr = .Range("B" & Rows.Count).End(xlUp).Row
    arr = .Range("b2:b" & lr).Value
    For i = 1 To UBound(arr, 1)
        dk = Trim(arr(i, 1))
        If Not dic.exists(dk) Then
            dic.Add dk, ""
        End If
    Next i
    lr = .Range("a" & Rows.Count).End(xlUp).Row
    arr = .Range("a2:a" & lr).Value
    ReDim arr1(1 To UBound(arr, 1), 1 To 1)
    For i = 1 To UBound(arr, 1)
        dk = Trim(arr(i, 1))
        If Not dic.exists(dk) Then
           dic.Add dk, ""    'cai nay la lay duy nhat neu khong can thi bo di
           a = a + 1
           arr1(a, 1) = arr(i, 1)
        End If
    Next i
    lr = .Range("C" & Rows.Count).End(xlUp).Row
    If lr > 1 Then .Range("C1:C" & lr).ClearContents
    If a Then .Range("C2").Resize(a, 1).Value = arr1
End With
End Sub
 

File đính kèm

  • Book1.xlsm
    1.9 MB · Đọc: 17
Ban dung code nay xem nhe.
Mã:
Sub laygiatri()
Dim arr, arr1
Dim lr As Long, a As Long, i As Long
Dim dic As Object, dk As String
Set dic = CreateObject("scripting.dictionary")
With Sheets(1)
    lr = .Range("B" & Rows.Count).End(xlUp).Row
    arr = .Range("b2:b" & lr).Value
    For i = 1 To UBound(arr, 1)
        dk = Trim(arr(i, 1))
        If Not dic.exists(dk) Then
            dic.Add dk, ""
        End If
    Next i
    lr = .Range("a" & Rows.Count).End(xlUp).Row
    arr = .Range("a2:a" & lr).Value
    ReDim arr1(1 To UBound(arr, 1), 1 To 1)
    For i = 1 To UBound(arr, 1)
        dk = Trim(arr(i, 1))
        If Not dic.exists(dk) Then
           dic.Add dk, ""    'cai nay la lay duy nhat neu khong can thi bo di
           a = a + 1
           arr1(a, 1) = arr(i, 1)
        End If
    Next i
    lr = .Range("C" & Rows.Count).End(xlUp).Row
    If lr > 1 Then .Range("C1:C" & lr).ClearContents
    If a Then .Range("C2").Resize(a, 1).Value = arr1
End With
End Sub
Cảm ơn bạn nhiều lắm . Lâu nay tìm mãi cách làm nhưng dường như dùng mấy công thức so sánh không được . Có lẽ chỉ có thế này mới ra được kết quả đúng .
 
Trường hợp này mình làm thế nào vậy bạn ? Vừa rồi lấy ví dụ , dẫn đến việc có lời giải của bạn , sau đó áp dụng ko được . Tôi cũng có thấy trong này có người hỏi về nội dung này . Tiếc là câu trả lời của Ndu96081631 chỉ đúng với trường hợp chuyển sheet và nó có định dạng tương đương nhau. Trường hợp của mình nó khác nhau về số lượng của 2 cột và khác cả số " LEN " ( Lần đầu thấy chữ này ) . Vậy nên hy vọng có được đáp án đúng để vận dụng vào công việc . Cảm ơn bạn nhiều .
 

File đính kèm

  • Sổ làm việc1.xlsm
    14.1 KB · Đọc: 14
Lần chỉnh sửa cuối:
Trường hợp này mình làm thế nào vậy bạn ? Vừa rồi lấy ví dụ , dẫn đến việc có lời giải của bạn , sau đó áp dụng ko được . Tôi cũng có thấy trong này có người hỏi về nội dung này . Tiếc là câu trả lời của Ndu96081631 chỉ đúng với trường hợp chuyển sheet và nó có định dạng tương đương nhau. Trường hợp của mình nó khác nhau về số lượng của 2 cột và khác cả số " LEN " ( Lần đầu thấy chữ này ) . Vậy nên hy vọng có được đáp án đúng để vận dụng vào công việc . Cảm ơn bạn nhiều .
Bạn nói chi tiết xem nào.Mình đọc không hiểu lắm.Cái nào là dữ liệu cái nào bạn cần trả về kết quả như thế nào.
 
Web KT
Back
Top Bottom