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

Liên hệ QC
Phần này đã sửa lại một số như sau :
- So sánh 2 cột A và B để lấy số dòng nhiều nhất.
- Cùng lúc kiểm tra (A=B),(A<>B) và (B<> A) sẽ cải thiện tốc độ đáng kể.
- Nếu A nhiều hơn B hoặc ngược lại đều cho ra kết quả như sau : (A=B),(A<>B) và (B<> A).
Bác Viendo test lại dùm thời gian còn bao lâu.
Mã:
Dim i, rNum, tNum As Integer
Dim tVal As String
[COLOR=blue]Sub Loc()[/COLOR]
On Error Resume Next
Application.ScreenUpdating = False
Range("C3:E65536").ClearContents
[COLOR=seagreen]'So sanh cot A va B  de lay so dong nhieu nhat[/COLOR]
rNum = Range("A:A").Find(what:=vbNullString).Row - 1
tNum = Range("B:B").Find(what:=vbNullString).Row - 1
If rNum < tNum Then rNum = tNum
[COLOR=seagreen]''''''''''''''''''''''''''''''''''
[/COLOR]For i = 3 To rNum
[COLOR=seagreen]'Tim` A<>B & A=B[/COLOR]
  If Cells(i, 1) <> vbNullString Then
     tVal = Range("B:B").Find(what:=Cells(i, 1)).Value
     If Err.Number > 0 Then
       Range("C:C").Find(what:=vbNullString).Value = Cells(i, 1).Value
     Else
       Range("E:E").Find(what:=vbNullString).Value = tVal
     End If
     Err.Number = 0
  End If
[COLOR=seagreen]'Tim B<>A[/COLOR]
  If Cells(i, 2) <> vbNullString Then
     tVal = Range("A:A").Find(what:=Cells(i, 2)).Value
     If Err.Number > 0 Then Range("D:D").Find(what:=vbNullString).Value = Cells(i, 2).Value
     Err.Number = 0
  End If
Next i
Application.ScreenUpdating = True
[COLOR=blue]End Sub[/COLOR]
 

File đính kèm

  • SoSanh2List.rar
    24.9 KB · Đọc: 217
Lần chỉnh sửa cuối:
Trong quá trình đi tìm tốc độ cho các con macro, mình cũng đã thử với phương thức Find() ; Kết quả như sau:
trong câu lệnh
Mã:
    If WorksheetFunction.Match(Cells(jZ, 1), Range("B3:B" & lRowB)) = lRowB - 2 Then
        Range("C" & Range("C65432").End(xlUp).Row + 1) = Cells(jZ, 1)
    End If
Mình dùng thay bằng các câu sau:
PHP:
    If Range("B3:B" & lRowB).Find(what:=Cells(jZ, 1)) Is Nothing Then
        Range("C" & Range("C65432").End(xlUp).Row + 1) = Cells(jZ, 1)
    End If
Kết quả, thời gian tiêu hao hiện ra là: 0.5156 ''
Cho nên mình cho rằng áp dụng phương thức Find() sẽ chậm hơn, ngay cả trường hợp dùng COUNTIF();
Bạn có thể dùng hàm định thời TIMER() trong VBA kiểm việc này mà (!?)
 
Tôi nhận xét thấy rằng cái vụ tìm kiếm này thì chưa chắc có code nào nhanh bằng Conditional Formating... ấy vậy mà thử trên dử liệu 60.000 nó còn ì ạch huống chi là dùng code...
Bạn xem lại.. tôi nghĩ giãi quyết kiểu này ko ăn rồi...
Ta nên chọn 2 cách sau đây:
1> Nếu dử liệu trong từng List có trùng (trùng càng nhiều càng tốt) thì trước tiên nên lọc nó ra 1 danh sách duy nhất, sau đó mới nói đến chuyện TÌM KIẾM... như vậy bạn sẽ tiết kiệm dc rất nhiều thời gian
2> Nếu dử liệu trong từng cột gần như ko trùng nhau (hoặc trùng rất ít) thì bạn nên nghĩ đến hướng chia nhỏ danh sách ra mà tìm...
Vài ý kiến chủ quan... các cao thủ khác thì sao?
ANH TUẤN
 
SA_DQ đã viết:
đặt thù của dữ liệu tại cột 'A' & 'B' NTN (!)
Tiện đây, cho hỏi về dữ liệu của VD luôn, hàng tháng thường sẽ NTN?
Dữ liệu 2 cột 'A' và 'B' gần như bằng nhau, dữ liệu lấy ra ở cột 'C', 'D' không nhiều, nhưng ở cột 'E' thì nhiều. Để tiện kiểm tra đệ gửi dữ liệu thật của 1 tháng lên luôn. Chưa test được code của sư phụ làm hồi sáng.
dmtdmtbb đã viết:
Phần này đã sửa lại một số như sau :
- So sánh 2 cột A và B để lấy số dòng nhiều nhất.
- Cùng lúc kiểm tra (A=B),(A<>B) và (B<> A) sẽ cải thiện tốc độ đáng kể.
- Nếu A nhiều hơn B hoặc ngược lại đều cho ra kết quả như sau : (A=B),(A<>B) và (B<> A).
Bác Viendo test lại dùm thời gian còn bao lâu.
Do đang ở cty nên để chiều tối về mới test được, Sư phụ thông cảm nhé. Àh nhờ sư phụ chỉ bỏ cái hàm Time() vào code của sư phụ chỗ nào, hôm qua chỉ bỏ hàm Time() vào được file của Thầy Long, còn khi chạy file sư phụ thì dùng đồng hồ bấm giờ ở ngoài.

Thực ra 1 tháng chạy kiểm tra 1 lần với số dòng lớn và với thời gian chờ 5' hoặc 8' thì đệ tử nghĩ là đã đạt lắm rồi, vì trước thì làm tốn thời gian hơn rất nhiều đấy. Rất cám ơn các Sư phụ đã tận tình.
 

File đính kèm

  • DuLieuKiemTraThang.rar
    128.1 KB · Đọc: 245
Ý tôi muốn biết dử liệu trong từng list có trùng hay ko thôi (còn nó có trùng với list khác ta ko quan tâm)...
Tôi xem file bạn, dùng Advanced Filter để lọc Unique Only thì thấy quả thật list chẳng có trùng (đúng ra là có 1 cái trùng, cái này chắc nhầm lẩn).... Vậy thì dùng code để lọc ko ăn thua rồi...
Bạn cứ thử dùng Conditional Formating để tô màu theo đúng ý bạn sẽ biết liền... CF nhanh như thế mà còn xỉu lên xỉu xuống nữa chứ đừng nói là code...
Có lẽ như tôi đã nói, phải chia nhỏ dử liệu ra thành nhiều phần thôi... (theo tôi nhận định thì trong trường hợp của bạn phải chia ra mổi sheet ko quá 6000 dòng.. như thế mới cải thiện dc tốc độ)
5' hay 10'.. thậm chí là vài giờ, miển nó chạy dc thì còn tốt... chỉ sợ nó đơ luôn mất công bạn bấm Reset máy ấy chứ
ANH TUẤN
 
Lần chỉnh sửa cuối:
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
 
/(/hờ các MOD/SMOD xóa giúp bài này, Xin Cảm Ơn Nhiều

/(/hờ các MOD/SMOD xóa giúp bài này, Xin Cảm Ơn Nhiều
Lí do: Trùng lắp bài bên dưới!​

Qynh5.jpg
 
Lần chỉnh sửa cuối:
Test lại các file theo dữ liệu thật ~15.000 dòng với máy Intel(R) Pentium(R) 4 CPU 3.00GHz (2CPUs), Memory 256MB RAM.
  • SA_DQ : hình như code bị sai gì đó nên ra kết quả không đúng, cột C ra có 1 kết quả và cột D không có kết quả nào, cột E thì nhiều quá không kiểm tra, chỉ chạy xong mất 09 giây.
  • Thầy Long : chạy xong mất 62 giây.
  • Dmtdmtbb : chạy xong mất 125 giây. (code mới nhất)
  • Minhlev : chạy xong mất 42 giây.

    Xin gửi lên file thành quả của tập thể các Sư phụ đã bàn luận trao đổi gợi ý và cuối cùng đúc kết nên, xin chân thành cám ơn rất nhiều.
 

File đính kèm

  • KiemTraSoSanh2List.rar
    180.2 KB · Đọc: 376
Đọc Topic này thấy các bác so kè với nhau từng phần ngàn phút, cứ y như là thì Chạy 100m thế giới. Thú vị thật.

Mình nghĩ bạn viendo nên đưa File thực tế của bạn (đừng lấy VD vì VD sẽ không thể hiện hết được cái bạn yêu cầu), qua đấy cũng thấy sức sáng tạo của các cao thủ thật đa dạng.

Bội phục!

Thân!
 
viendo đã viết:
Test lại các file theo dữ liệu thật ~15.000 dòng với máy Intel(R) Pentium(R) 4 CPU 3.00GHz (2CPUs), Memory 256MB RAM.
  • SA_DQ : hình như code bị sai gì đó nên ra kết quả không đúng, cột C ra có 1 kết quả và cột D không có kết quả nào, cột E thì nhiều quá không kiểm tra, chỉ chạy xong mất 09 giây.
  • Thầy Long : chạy xong mất 62 giây.
  • Dmtdmtbb : chạy xong mất 125 giây. (code mới nhất)
  • Minhlev : chạy xong mất 42 giây.

    Xin gửi lên file thành quả của tập thể các Sư phụ đã bàn luận trao đổi gợi ý và cuối cùng đúc kết nên, xin chân thành cám ơn rất nhiều.

oh, đôi khi nhâm nhi li cafe mất đến 15' -- 30' trong khi đo ta đợi máy tính mấy giây thì bực mình - lạ wa

đôi khi thuật toán có thời nhanh phải phụ thuộc vào Dl cụ thể - khả năng bao quát của ng lập trình, và quan trọng hơn cách đặt vấn đề bài toán và phạm vi ứng dụng của nó
.
 
Từ VD của VienDo & sửa lại xíu code của Minhlev
Kết quả có giảm thời gian: do mình giảm dần vùng tìm kiếm:
VienDo & các bạn kiểm thử nha; Mình có ghi lại thời lượng máy của mình thực thi tại 'G1'

PHP:
Option Explicit

Public Timer_ As Double
Dim jZ As Long

Sub SearchColumnS()
Dim lrow As Long, lRowB As Long
Dim lTemp As Long

On Error Resume Next
lrow = Cells(Rows.Count, 1).End(xlUp).Row
lRowB = Cells(Rows.Count, 2).End(xlUp).Row

 Range("C3:E" & (lrow + lRowB)).ClearContents
 Sort1Col Range("A2:A" & lrow), Range("A3")
 Sort1Col Range("B2:B" & lrow), Range("B3")
 Range("C2") = "List1<>List2":                      Range("E2") = "List1=List2"
 Range("D2") = "List2<>List1":              Application.ScreenUpdating = False

Timer_ = Timer:             lTemp = 3
For jZ = 3 To lrow
    If Application.Match(Cells(jZ, 1), Range("B" & lTemp & ":B" & lRowB), 0) = 0 Then
        Range("C" & Range("C65432").End(xlUp).Row + 1) = Cells(jZ, 1)
    Else
        Range("E" & Range("E65432").End(xlUp).Row + 1) = Cells(jZ, 1)
2        If jZ > lTemp + 9 Then lTemp = jZ - 9
    End If
Next
lTemp = 3
For jZ = 3 To lRowB
    If Application.Match(Cells(jZ, 2), Range("A" & lTemp & ":A" & lrow), 0) = 0 Then
        Range("D" & Range("D65432").End(xlUp).Row + 1) = Cells(jZ, 1)
9        If jZ > lTemp + 9 Then lTemp = jZ - 1
    End If
Next
Cells(1, 7) = Timer - Timer_
 With Range("G1").Interior
    If .ColorIndex > 40 Or .ColorIndex < 34 Then .ColorIndex = 34 Else _
        .ColorIndex = .ColorIndex + 1
 End With
End Sub
PHP:
 Public Sub Sort1Col(Rng As Range, Clls As Range)
  Rng.Sort Key1:=Clls, Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal
End Sub
 

File đính kèm

  • SaDQ.rar
    185.6 KB · Đọc: 335
Lần chỉnh sửa cuối:
viendo đã viết:
Do đang ở cty nên để chiều tối về mới test được, Sư phụ thông cảm nhé. Àh nhờ sư phụ chỉ bỏ cái hàm Time() vào code của sư phụ chỗ nào, hôm qua chỉ bỏ hàm Time() vào được file của Thầy Long, còn khi chạy file sư phụ thì dùng đồng hồ bấm giờ ở ngoài.
.

Mình quên đặt Timer cho bạn :
Vào module chương trình ở dòng Option Explicit thêm khai báo
Dim myTime as double
.....
myTime = Timer
For .......
Next .....
Range("F10").value = Timer - myTime
 
Mr Okebab đã viết:
Mình nghĩ bạn viendo nên đưa File thực tế của bạn (đừng lấy VD vì VD sẽ không thể hiện hết được cái bạn yêu cầu), qua đấy cũng thấy sức sáng tạo của các cao thủ thật đa dạng.
Lúc đầu nghĩ rằng chỉ đưa dữ liệu giả lập để làm vì đưa dữ liệu thật nó nặng quá, nhưng sau đó cũng đã đưa lên dữ liệu thật ở bài #24. Rất cám ơn và xin rút kinh nghiệm lần sau.
tigertiger đã viết:
oh, đôi khi nhâm nhi li cafe mất đến 15' -- 30' trong khi đo ta đợi máy tính mấy giây thì bực mình - lạ wa
đôi khi thuật toán có thời nhanh phải phụ thuộc vào Dl cụ thể - khả năng bao quát của ng lập trình, và quan trọng hơn cách đặt vấn đề bài toán và phạm vi ứng dụng của nó
Xin cám ơn sự góp ý, khi giải quyết dưới 10phút thì đã thấy ok rồi nhưng Anh thấy đấy các bậc Sư phụ chưa chịu hài lòng mà vẫn cố gắng làm tiếp và kết quả tuyệt vời đến không ngờ là xử lý dưới 1 phút. Qua đấy 1 lần nữa chứng tỏ lòng nhiệt tình của các Thầy các Sư phụ, cũng như là 1 nét văn hoá đoàn kết tận tình của GPE.

File So sánh kiểm tra này rất hữu dụng với tôi trong công việc, thiết nghĩ nó cũng có 1 phạm vi ứng dụng nào đó cho các công việc khác nữa.

Một lần nữa xin cám ơn tất cả mọi người.

To Sư phụ SA_DQ : Code cuối cùng quá tuyệt luôn, chính xác và chỉ mất 18 giây. Xin cám ơn Sư phụ đã tận tình trong mấy ngày qua, bữa nào phải offline kính mấy Sư phụ vài ly quá--=0
 
Lần chỉnh sửa cuối:
viendo đã viết:
Một lần nữa xin cám ơn tất cả mọi người.
To SA_DQ : Code cuối cùng quá tuyệt luôn, chính xác và chỉ mất 18 giây. Xin cám ơn Sư phụ đã tận tình trong mấy ngày qua, bữa nào phải offline kính mấy Sư phụ vài ly quá--=0

VienDo chú í các con số cuối cùng của các dòng lệnh mà mình vửa đánh số.

Nếu dữ liệu nhiều dòng trùng liên tục thì phải tăng lên để khỏi sai kết quả;

(Trong DL của bạn cột 'B' có 4 records trùng nhau liên tục đó!)
(Máy của mình chạy dưới 14''!)--=0
 
Thưa bác Sa_DQ, trong code của bác vẫn đưa ra kết quả chưa chính xác do bác thay đổi lTemp trong vòng lặp.
PHP:
....
If jZ > lTemp + 9 Then lTemp = jZ - 1
....
Em viết lại code cho các vòng lặp như sau:
PHP:
....
For jZ = 3 To lrow
    If Application.Match(Cells(jZ, 1), Range("B" & lTemp & ":B" & lRowB), 0) = 0 Then
        Range("C" & Range("C65432").End(xlUp).Row + 1) = Cells(jZ, 1)
    Else
        Range("E" & Range("E65432").End(xlUp).Row + 1) = Cells(jZ, 1)
        'If jZ > lTemp + 9 Then lTemp = jZ - 1
        lTemp = Application.Match(Cells(jZ, 1), Range("B1:B" & lRowB), 1)
    End If
Next
lTemp = 3
For jZ = 3 To lRowB
    If Application.Match(Cells(jZ, 2), Range("A" & lTemp & ":A" & lrow), 0) = 0 Then
        Range("D" & Range("D65432").End(xlUp).Row + 1) = Cells(jZ, 1)
        'If jZ > lTemp + 9 Then lTemp = jZ - 1
    Else
        lTemp = Application.Match(Cells(jZ, 2), Range("A1:A" & lrow), 1)
    End If
Next

....
Với cách này, thời gian tuy có lâu hơn một chút nhưng tránh được bỏ sót.
-----
Lúc trước tôi có hơi nhầm trong việc tìm lTemp. Nay đã sửa lại, thấy kết quả vẫn đúng và thời gian lại nhanh hơn.
 

File đính kèm

  • DuLieuKiemTraThang.rar
    193.3 KB · Đọc: 218
Lần chỉnh sửa cuối:
Tiếp tục cho đến khi cạn!

minhlev đã viết:
Thưa bác Sa_DQ, trong code của bác vẫn đưa ra kết quả chưa chính xác do bác thay đổi lTemp trong vòng lặp.
Với cách mới này, thời gian tuy có lâu hơn một chút nhưng tránh được bỏ sót.
-----
Lúc trước tôi có hơi nhầm trong việc tìm lTemp. Nay đã sửa lại, thấy kết quả vẫn đúng và thời gian lại nhanh hơn.
Đúng là í tưởng cùng gặp nhau!
Rất cảm ơn bạn vì những nhắc nhỡ ( & cũng là ~ thúc ép tôi tiếp tục cải thiện điều kiện làm việc cho tốt hơn!)
Tuy nhiên, trước đó mình đã nghĩ đến cách tìm lTemp này 1 cách chính xác luôn;
Mình đã thử cách của bạn rồi, thời gian sẽ phải tăng lên 1,6 lần so với trước, nếu không muốn nói là tăng gấp đôi;
Tiếp sau đây bạn thử đoạn mã này. Trong đó mình xác định chính xác 1 lần duy nhất cho 1 cột 'A' hay 'B' giá trị 'lTemp' ứng với nó nói trên;
Về thời gian thì các bạn tự chiêm nghiệm, nha! Một lần nữa xin cảm ơn!
PHP:
Option Explicit
Dim lrow As Long, lRowB As Long
Public Timer_ As Double
Dim jZ As Long

Sub SearchColumnS()

Dim jW As Integer, SoGiam As Integer

On Error Resume Next
lrow = Cells(Rows.Count, 1).End(xlUp).Row
lRowB = Cells(Rows.Count, 2).End(xlUp).Row

 Range("C3:E" & (lrow + lRowB)).ClearContents
 Sort1Col Range("A2:A" & lrow), Range("A3")
 Sort1Col Range("B2:B" & lrow), Range("B3")
 Range("C2") = "List1<>List2":                      Range("E2") = "List1=List2"
 Range("D2") = "List2<>List1":              Application.ScreenUpdating = False

Timer_ = Timer:             jW = 3:         SoGiam = TimTrung(1)
For jZ = 3 To lrow
    If Application.Match(Cells(jZ, 1), Range("B" & jW & ":B" & lRowB), 0) = 0 Then
        Range("C" & Range("C65432").End(xlUp).Row + 1) = Cells(jZ, 1)
    Else
        Range("E" & Range("E65432").End(xlUp).Row + 1) = Cells(jZ, 1)
        If jZ > jW + SoGiam Then jW = jZ - SoGiam
    End If
Next
jW = 3:                                 SoGiam = TimTrung(2)
For jZ = 3 To lRowB
    If Application.Match(Cells(jZ, 2), Range("A" & jW & ":A" & lrow), 0) = 0 Then
        Range("D" & Range("D65432").End(xlUp).Row + 1) = Cells(jZ, 1)
        If jZ > jW + SoGiam Then jW = jZ - SoGiam
    End If
Next

Cells(1, 7) = Timer - Timer_
 With Range("G1").Interior
    If .ColorIndex > 40 Or .ColorIndex < 34 Then .ColorIndex = 34 Else _
        .ColorIndex = .ColorIndex + 1
 End With
End Sub
Mã:
[B]Function TimTrung(Cot As Byte)[/B] 

Dim SoR As Long, Wz As Long
 Dim bDem As Byte, bMax As Byte
 
 SoR = lrow + lRowB
 For Wz = 4 To SoR
    With Cells(Wz, Cot)
        If .Value = "" Then Exit For
        If .Offset(-1) = .Value Then
            bDem = bDem + 1
            If bMax < bDem Then bMax = bDem
        Else
            bDem = 0
        End If
    End With
 Next Wz
 TimTrung = bMax + 1
[B]End Function [/B]
PHP:
 Public Sub Sort1Col(Rng As Range, Clls As Range)
  Rng.Sort Key1:=Clls, Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal
End Sub
VienDo chú í: Để hàm mới tạo hiểu được 2 biến lRow & lRowB, mình đã chuyển lên khai báo dùng chung, đó nha!
 

File đính kèm

  • SaDQ.rar
    190.5 KB · Đọc: 256
Lần chỉnh sửa cuối:
SA_DQ đã viết:
Mình đã thử cách của bạn rồi, thời gian sẽ phải tăng lên 1,6 lần so với trước, nếu không muốn nói là tăng gấp đôi;

Thưa bác Sa, chắc là bác thử cái file cũ rồi ạ. Cái file mới em gửi lại chạy ở máy của em hết có 6 giây thôi ạ. Tuy nhiên em mới xem lại bài đó thấy bị sai 1 dòng code trong vòng lặp thứ 2.
Code cũ
PHP:
....
        Range("D" & Range("D65432").End(xlUp).Row + 1) = Cells(jZ, 1)
....
Code đúng
PHP:
....
        Range("D" & Range("D65432").End(xlUp).Row + 1) = Cells(jZ, 2)
....
 
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 thấy 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!!
 
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.
Không biết đến khi nào mới chạm được đích???!$@!! !$@!!


Tôi nhận thấy nếu trong cột có nhiều dữ liệu trùng nhau thì sẽ phải chạy nhiều vòng lặp. Chính vì vậy trước khi chạy vòng lặp cần phải lọc ra các cột danh sách duy nhất (dùng Advanced Filter). Sau đó mới so sánh 2 cột danh sách duy nhất này với nhau để tìm ra kết quả. Tuy nhiên tời gian thực hiện lệnh lại lâu hơn 1 chút (khoảng vài phần chục giây).
To: bác viendo
Nếu trong file của bác ít bị trùng dữ liệu trong cột thì không nên dùng cách này.
--------
Như vậy cũng chẳng cần phải Sort cột.
 

File đính kèm

  • DuLieuKiemTraThang.rar
    189.6 KB · Đọc: 255
Lần chỉnh sửa cuối:
minhlev đã viết:
Không biết đến khi nào mới chạm được đích???!$@!! !$@!!
Đệ tử đã báo tới rồi tới rồi lúc đạt 3 phút mà các Sư phụ có để ý đâu, đến khi nhìn lại thì các Sư phụ đã cho đếm bằng "giây", lúc mở topic không nghĩ đến kết quả lại có thể đạt được như hiện nay. Chỉ tiếc rằng mình kém quá không hiểu được các góp ý bàn luận của các Sư phụ cũng như các tinh hoa của các code.
Tôi nhận thấy nếu trong cột có nhiều dữ liệu trùng nhau thì sẽ phải chạy nhiều vòng lặp. Chính vì vậy trước khi chạy vòng lặp cần phải lọc ra các cột danh sách duy nhất (dùng Advanced Filter). Sau đó mới so sánh 2 cột danh sách duy nhất này với nhau để tìm ra kết quả.
Danh sách so sánh là danh sách duy nhất nên không cần dùng Adv. Filter đâu, dữ liệu đệ tử đưa lên #24 do sai sót nên có trùng 1 mã mà AnhTuan đã báo thôi.
Đã 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ả.
 
Web KT
Back
Top Bottom