So sánh nội dung của 2 sheet, xuất kết quả không trùng sang sheet khác

Liên hệ QC

hanbro

Thành viên mới
Tham gia
2/5/12
Bài viết
6
Được thích
0
Xin chào các bạn, xin nhờ các bạn giúp mình so sánh ID hai sheet 1 và 2, nếu kết quả không trùng ở cả 2 sheet thì xuất sang sheet 3 như hình với.
Rất mong nhận được sự giúp đỡ từ mọi người.
Xin cảm ơn!
P/s: Mình cũng đã thử mấy bài gần giống giống trên diễn đàn nhưng không áp dụng được.

2022-04-29_130149.png
 

File đính kèm

  • SS ID.xlsx
    10.5 KB · Đọc: 19
Match với tham thứ 3 là 1 dùng phép dò nhị phân, rất nhanh. Nhưng vì nó dò gần đúng cho nên khi ra vị trí rồi thì phải lấy từ vị trí ấy ra để xét lại có chính xác. Tuy phải làm vậy nhưng vẫn hiệu quả hơn cách dò với tham là 0. Trừ phi dữ kiệu rất ít.
À em hiểu rồi.Thế còn cách nào tối ưu hơn nữa không anh.
 
Upvote 0
À em hiểu rồi.Thế còn cách nào tối ưu hơn nữa không anh.
Nếu ID là số nguyên thì dùng nó làm chỉ số mảng là ưu việt nhất. Không còn công cụ nào nhanh hơn mảng cả.
Trừ phi số ID rất thưa, lác đác từ 0000001 đến 1000000 chỉ có vài ID's. Khi ấy, lúc duyệt lại mảng, đọc cả triệu phần tử lấy ra được dăm cái.

Thuật toán, code tối ưu hay không còn tuỳ vào tình trạng, cơ chế dữ liệu mà nó phải làm việc. Những cái chúng ta nói "kiểu này nhanh hơn, vv..." chỉ là nói về trường hợp mà ta cho là thường gặp trên thực tế. Điều này tôi đề cập nhiều lần rồi.
 
Upvote 0
Dùng Sort của bảng tính
Mã:
Sub Excel_Sort()
  Dim arr(), res(), sR&, i&, k&
  With Sheet1
    i = .Range("B1000000").End(xlUp).Row
    arr = .Range("A2:B" & i).Value
  End With
  sR = UBound(arr)
  With Sheet2
    i = .Range("B1000000").End(xlUp).Row
    res = .Range("A2:B" & i + sR).Value
    .Range("A" & i + 1).Resize(sR, 2).Value = arr
    .Range("A2:B" & i + sR).Sort .Range("A2"), 1, Header:=xlNo
    arr = .Range("A1:B" & i + sR + 1).Value 'Lay du dong dau va dong cuoi
    .Range("A2:B" & i + sR).Value = res
  End With
  sR = UBound(arr) - 1
  ReDim res(1 To sR, 1 To 2)
  For i = 2 To sR
    If arr(i, 1) <> arr(i - 1, 1) And arr(i, 1) <> arr(i + 1, 1) Then
      k = k + 1
      res(k, 1) = arr(i, 1)
      res(k, 2) = arr(i, 2)
    End If
  Next i
  Sheet3.Range("A2").Resize(k, 2) = res
End Sub
Dùng mảng với thứ tự dòng là ID
Mã:
Sub Array_ID()
  Dim a, arr(), arr2(), res(), tmp&, iMin&, iMax&
  Dim sR&, sR2&, i&, k&
  With Sheet1
    i = .Range("B1000000").End(xlUp).Row
    arr = .Range("A2:B" & i).Value
    iMin = Application.Min(.Range("A2:B" & i))
    iMax = Application.Max(.Range("A2:B" & i))
  End With
  With Sheet2
    i = .Range("B1000000").End(xlUp).Row
    arr2 = .Range("A2:B" & i).Value
    tmp = Application.Min(.Range("A2:B" & i))
    If iMin > tmp Then iMin = tmp
    iMax = Application.Max(.Range("A2:B" & i))
    If iMax < tmp Then iMax = tmp
  End With
  sR = UBound(arr):     sR2 = UBound(arr2)
  ReDim a(iMin To iMax, 1 To 3)
  ReDim res(1 To sR + sR2, 1 To 2)
  For i = 1 To sR
    a(arr(i, 1), 1) = 1
    a(arr(i, 1), 2) = arr(i, 2)
  Next i
  For i = 1 To sR2
    a(arr2(i, 1), 1) = a(arr2(i, 1), 1) + 1
    a(arr2(i, 1), 2) = arr2(i, 2)
  Next i
  For i = iMin To iMax
    If a(i, 1) = 1 Then
      k = k + 1
      res(k, 1) = i
      res(k, 2) = a(i, 2)
    End If
  Next i
  With Sheet3.Range("A2").Resize(k, 2) = res
End Sub
Code với dữ liệu từng bảng không trùng, nếu trùng chỉnh lại vài lệnh
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom