dò tìm mã đơn hàng và mã hàng duy nhất

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

BinhTam

Thành viên thường trực
Tham gia
2/12/06
Bài viết
238
Được thích
30
Chào các bạn,

Mình gửi kèm file chi tiết đơn hàng

Rất mong các bạn hỗ trợ và viết công thức( tìm số đơn hàng và mã hàng không trùng nhau) giúp mình trong sheet "Summary", thanks!
 

File đính kèm

Bạn xem trong file có đúng ý bạn không nhé!
 

File đính kèm

Chào các bạn,

Mình gửi kèm file chi tiết đơn hàng

Rất mong các bạn hỗ trợ và viết công thức( tìm số đơn hàng và mã hàng không trùng nhau) giúp mình trong sheet "Summary", thanks!

Nhấn nút [Source] & [Item] và kiểm tra lại kết quả nhé
 

File đính kèm

Bài này dùng Dictionary Object là "bá chấy" luôn ---> Khỏi cột phụ hay name gì cả ---> Bảo đảm tốc độ nhanh
Các bạn thử xem
 
Bài này dùng Dictionary Object là "bá chấy" luôn ---> Khỏi cột phụ hay name gì cả ---> Bảo đảm tốc độ nhanh
Các bạn thử xem
Loại file này mà làm công thức thì hơi mệt đây, cả boyxin và hoangminhtien đều chưa làm hết yếu cầu, còn lấy dữ liệu vào cột A, B, C nữa. Riêng Boyxin mới chỉ lấy duy nhất theo source mà chưa cộng.
Cách theo NDU chỉ dùng CreateObject("Scripting.Dictionary") kết hợp với UDF TachSo cũng của NDU luôn, hy vọng sẽ nhanh hơn.
Tôi sẽ làm thử 1 code theo hướng của NDU, nhân tiện học hỏi.
Tôi viết thử code sau, và hình như sẽ có code không cần Dic nếu cột Source đã sort.
Các bạn xem thử.
PHP:
Dim endR As Long
Dim Arr(), ArrKQ(1 To 65000, 1 To 5), ArrXX(1 To 65000, 1 To 1)
Dim Dic As Object
Dim i As Long, s As Long, Src As String
Dim T
Sub TaoSource()
T = Timer
ThisWorkbook.Activate
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("T7-2010")
  endR = .Cells(65000, 1).End(xlUp).Row
  Arr = .Range(.Cells(2, 1), .Cells(endR, 7)).Value
End With
s = 0
For i = 1 To UBound(Arr)
  'Src = TachSo(Arr(i, 4))
  If Not Dic.Exists(Arr(i, 4)) Then
    s = s + 1
    ArrKQ(s, 1) = s
    ArrKQ(s, 2) = Arr(i, 1)
    ArrKQ(s, 3) = Arr(i, 3)
    ArrKQ(s, 4) = TachSo(Arr(i, 4))
    Dic.Add Arr(i, 4), s
  End If
  ArrKQ(s, 5) = ArrKQ(s, 5) + Arr(i, 6)
Next i
With Sheets("Summary")
  With .Range("M3")
    .Resize(s, 5) = ArrKQ
  End With
End With
Set Dic = Nothing
Erase Arr, ArrKQ
MsgBox Timer - T
End Sub
Và UDF TachSo
PHP:
Function TachSo(Cell) As String ' As Double
   Set Temp = CreateObject("VBScript.RegExp")
   Temp.Global = True
   Temp.Pattern = "[^0-9]"
   TachSo = Temp.Replace(Cell, "")
 End Function
Cám ơn!

Bổ sung, trường hợp lấy số này nên dùng replece sẽ nhanh hơn UDF. Và mình sẽ lấy toàn bộ thông tin source, sau đó tách lấy số sau thì sẽ nhanh hơn.
Code tham khảo
PHP:
Sub TaoSource3()
Dim endR As Long
Dim Arr(), ArrKQ(1 To 65000, 1 To 5), ArrXX(1 To 65000, 1 To 1)
Dim Dic As Object
Dim i As Long, s As Long, Src As String
Dim T
T = Timer
Dim arrTach(1 To 65000, 1 To 1)
ThisWorkbook.Activate
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("T7-2010")
  endR = .Cells(65000, 1).End(xlUp).Row
  Arr = .Range(.Cells(2, 1), .Cells(endR, 7)).Value
End With
s = 0
For i = 1 To UBound(Arr)
  If Not Dic.Exists(Arr(i, 4)) Then
    s = s + 1
    ArrKQ(s, 1) = s
    ArrKQ(s, 2) = Arr(i, 1)
    ArrKQ(s, 3) = Arr(i, 3)
    ArrKQ(s, 4) = Arr(i, 4)
    arrTach(s, 1) = ArrKQ(s, 4)
    Dic.Add Arr(i, 4), s
  End If
  ArrKQ(s, 5) = ArrKQ(s, 5) + Arr(i, 6)
Next i
With Sheets("Summary")
  With .Range("M3")
    .Resize(s, 5) = ArrKQ
  End With
End With
Erase ArrKQ
For i = 1 To UBound(arrTach)
  ArrKQ(i, 1) = Trim(Left(Replace(arrTach(i, 1), ".", Space(10)), 10))
Next i
With Sheets("Summary")
  With .Range("M3")
    .Offset(0, 3).Resize(i, 1) = ArrKQ
  End With
End With
Set Dic = Nothing
Erase Arr, ArrKQ, arrTach
MsgBox Timer - T
End Sub
Nếu cột Source đã sort thì dùng code sau sẽ nhanh hơn nữa, cái này học của Bác PTM0412
PHP:
Sub TaoSource02()
Dim endR As Long
Dim Arr(), ArrKQ(1 To 65000, 1 To 5), ArrXX(1 To 65000, 1 To 1)
Dim T
T = Timer
ThisWorkbook.Activate
With Sheets("T7-2010")
  endR = .Cells(65000, 1).End(xlUp).Row
  Arr = .Range(.Cells(2, 1), .Cells(endR + 1, 7)).Value
End With
s = 1
For i = 1 To UBound(Arr) - 1
   ArrKQ(s, 1) = s
   ArrKQ(s, 2) = Arr(i, 1)
   ArrKQ(s, 3) = Arr(i, 3)
   ArrXX(s, 1) = Arr(i, 4)
   ArrKQ(s, 4) = Trim(Left(Replace(Arr(i, 4), ".", Space(10)), 10))
   ArrKQ(s, 5) = ArrKQ(s, 5) + Arr(i, 6)
   If Arr(i + 1, 4) <> ArrXX(s, 1) Then s = s + 1
Next i
With Sheets("Summary")
  With .Range("S3")
    .Resize(s, 5) = ArrKQ
  End With
End With
Erase Arr, ArrKQ, ArrXX
MsgBox Timer - T
End Sub
Các bạn tham khảo và cho vài nhận xét về dùng Dic, Array, AdFi nhé.
 
Lần chỉnh sửa cuối:
Thanks.

mình không nói rõ trong bài trước, trong sheet "summary" còn một số cột khác : date, location, total volume, qty-vnch20,qty-vncs20
 
mình kéo công thức xuống thì thấy cột source thì thấy ko hiện kết quả.
riêng cột item thì kéo xuống thì bị lặp lại

---------------
Bạn xem trong file có đúng ý bạn không nhé!​
paperclip.png
Tập tin đính kèm


Skype: minhtien.hoang
Gmail : minhtien.hoang
Phone : 0983912383

Công thức hàm Excel
Những tuyệt chiêu Excel
 
Hi Thu Nghi,

Ban sửa lại công thức cột qty-vnch20 và qty-vncs20

vì quantity bên sheet "t7-2010" nhưng khi qua sheet "summary" thì là số dương?

Thanks
 
mình kéo công thức xuống thì thấy cột source thì thấy ko hiện kết quả.
riêng cột item thì kéo xuống thì bị lặp lại

Theo ngu ý của thảo dân, giải pháp dùng "PivotTables" để quản lý bảng 2 sẽ đơn giản và không hề kéo dài thời gian xử lý dữ liệu
(Mong chờ cao kiến của các bác ...--=0)

-----------------
Bảng 1 quản lý Source theo code ThuNghi cung cấp
 

File đính kèm

Lần chỉnh sửa cuối:
Cải tiến code của Thu Nghi:

Code TaoSource3 nếu thay đoạn code này:
PHP:
For i = 1 To UBound(arrTach)
  ArrKQ(i, 1) = Trim(Left(Replace(arrTach(i, 1), ".", Space(10)), 10))
Next i
With Sheets("Summary")
  With .Range("M3")
    .Offset(0, 3).Resize(i, 1) = ArrKQ
  End With
End With

Bằng cách gán thẳng vào ArrKQ(i, 4) và dùng Instr() thay cho replace, sẽ giảm 1/3 thời gian:

PHP:
ArrKQ(s, 4) = Left(Arr(i, 4), InStr(1, Arr(i, 4), ".") - 1)

Tương tự Code TaoSource02 cũng dùng Instr(), giảm 1/6 thời gian. Taosource02 dùng toàn Array, vẫn nhanh hơn Taosource3 dùng Array phối hợp Dict:

Taosource3 Thu Nghi: 0.875s
Taosource3 ptm: 0.5475s
Taosource02 ThuNghi: 0.54s
Taosource02 ptm: 0.48s
 
Lần chỉnh sửa cuối:
Cải tiến code của Thu Nghi:

Code TaoSource3 nếu thay đoạn code này:
PHP:
For i = 1 To UBound(arrTach)
  ArrKQ(i, 1) = Trim(Left(Replace(arrTach(i, 1), ".", Space(10)), 10))
Next i
With Sheets("Summary")
  With .Range("M3")
    .Offset(0, 3).Resize(i, 1) = ArrKQ
  End With
End With

Bằng cách gán thẳng vào ArrKQ(i, 4) và dùng Instr() thay cho replace, sẽ giảm 1/3 thời gian:

PHP:
ArrKQ(s, 4) = Left(Arr(i, 4), InStr(1, Arr(i, 4), ".") - 1)

Tương tự Code TaoSource02 cũng dùng Instr(), giảm 1/6 thời gian. Taosource02 dùng toàn Array, vẫn nhanh hơn Taosource3 dùng Array phối hợp Dict:

Taosource3 Thu Nghi: 0.875s
Taosource3 ptm: 0.5475s
Taosource02 ThuNghi: 0.54s
Taosource02 ptm: 0.48s

Lại lươm được thêm kiến thức, Cảm ơn anh :)
 
Web KT

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

Back
Top Bottom