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!
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.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
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
Cám ơn!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
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
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
Bạn xem file sau thử nhé.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
-
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
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
ArrKQ(s, 4) = Left(Arr(i, 4), InStr(1, Arr(i, 4), ".") - 1)
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