Chỉnh tốc độ cho file trích lọc nhiều điều kiện (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

phihndhsp

Thành viên gạo cội
Tham gia
26/12/09
Bài viết
3,363
Được thích
2,488
Giới tính
Nam
Nghề nghiệp
Giáo Viên
Thấy Anh Hải than phiền là ghiền code mà không có bài nào để xem nên em gởi lên diễn đàn yêu cầu sau để chỉnh lại tốc độ cho file này trong sheet So Tien: Em viết file này tốc độ chạy là 1'35 giây, chạy 1 phen gồm 8,9 cái sub gì đó, bây giờ nhờ các anh xem có giải quyết được thời gian ngắn hơn nữa không?
hầu như tất cả các module em điều sử dụng mảng để xử lý, sau khi sử lý xong mới dán xuống sheet
(File này em đã xóa hầu như tất cả chỉ để lại 4 sheet cần tới)

Tất cả các sub nằm trong module5, dữ liệu có tất cả trong sheet database:

Sheet So Tien, là thống kê 1 số điện thoại, mua số lượng bao nhiêu, số tiền bao nhiêu, mua trong giai đoạn nào hay cả 2, liệt kê những ngày mua, liệt kê mặt hàng và số lượng mua.(theo nhóm điều kiện bên trên sheet) em có ví dụ sẳn trong sheet So tien
(xin phép ban quản trị cho phép tôi gỡ file xuống)
 

File đính kèm

Lần chỉnh sửa cuối:
Sub DIEUKIENSOTIEN có dùng miếng mảng nào đâu.
Thậm chí không dùng mảng, nhưng bỏ hết mấy lệnh select, mấy câu selection là đã giảm 1 miếng.
Cũng trong sub đó, thay vì record macro copy paste special, thử dùng method filldown và .Value = .Value

(Chưa coi các sub khác)
 
Upvote 0
Thấy Anh Hải than phiền là ghiền code mà không có bài nào để xem nên em gởi lên diễn đàn yêu cầu sau để chỉnh lại tốc độ cho file này trong sheet So Tien: Em viết file này tốc độ chạy là 1'35 giây, chạy 1 phen gồm 8,9 cái sub gì đó, bây giờ nhờ các anh xem có giải quyết được thời gian ngắn hơn nữa không?
hầu như tất cả các module em điều sử dụng mảng để xử lý, sau khi sử lý xong mới dán xuống sheet
(File này em đã xóa hầu như tất cả chỉ để lại 4 sheet cần tới)

Tất cả các sub nằm trong module5, dữ liệu có tất cả trong sheet database:

Sheet So Tien, là thống kê 1 số điện thoại, mua số lượng bao nhiêu, số tiền bao nhiêu, mua trong giai đoạn nào hay cả 2, liệt kê những ngày mua, liệt kê mặt hàng và số lượng mua.(theo nhóm điều kiện bên trên sheet) em có ví dụ sẳn trong sheet So tien
Cũng có hơi ghiền nhưng khi xem cái file chứa hơn 10 Module, mỗi Module chứ vài cái Sub, mỗi Sub chứa 1 rừng code thì hết ghiền rồi.

Happy New Year
 
Upvote 0
Cũng có hơi ghiền nhưng khi xem cái file chứa hơn 10 Module, mỗi Module chứ vài cái Sub, mỗi Sub chứa 1 rừng code thì hết ghiền rồi

Tôi lười tải file về xem. Nhưng nghe con số thì cảm thấy cách thiết kế hơi bất bình thường.
Theo bình thường thì vài modules, mỗi mudule hơn chục subs mới đúng.
1 module chứa các hàm căn bản, tức là loại hàm thư viện, dùng chung mọi nơi.
1-3 modules chứa các hàm đặc biệt chỉ sử dụng cho vấn đề này - sỡ dĩ chia ra là tuỳ theo nhiệm vụ, chẳng hạn như các con toán liên quan đến ado thì để riêng, các hàm chuyên kiểu cọ mẫu mã bảng tính để riêng.
(Nếu dùng class modules thì con số này không tính)
 
Upvote 0
Cũng có hơi ghiền nhưng khi xem cái file chứa hơn 10 Module, mỗi Module chứ vài cái Sub, mỗi Sub chứa 1 rừng code thì hết ghiền rồi.

Happy New Year
Cái đó là code của em, vì em viết cho khách hàng khi viết xong họ thay đổi cái này thay đổi yêu cầu kia nên cứ chim vô chim vô. Anh có thể thêm vào sheet mới mà tự anh code trong sheet mới. Khi học thì cái nào ra cái đó, khi làm việc thì code không nên quá rõ ràng mong các anh thông cảm
 
Upvote 0
Tại sao lại không nên?
Mấy thằng đệ tử tôi giao code cho khách hàng không rõ ràng tôi còn bắt viết lại.

Híc!
Hồi chiều găp bài của quanghai1969 "quăng dép", tôi cũng thất nghiệp nên cũng "săm soi" thành cái này
HongChay.jpg
Nhưng đọc thấy bài trên (#5) cũng hơi oải
 
Lần chỉnh sửa cuối:
Upvote 0
Hôm nay hơi rảnh một tí, tính xem thử thì cái file đã gỡ mất!!!

Tình thiệt mà nói thì code chạy vài giây đối với tôi chả ăn nhằm gì. Khi tôi làm việc với dữ liệu, điểm quan trọng nhất tôi muốn chú ý là "nếu kết quả có thể sai thì có nhận ra hay không? những chỗ không tính được thì code có cách nào báo cho người dùng biết?" Vì vậy tôi sẵn sàng để cho code chạy, đi uống cà phê rồi về xem kết quả. Nhưng sau đó thì tôi muốn trong vòng 1/2 giờ phải biết được kết quả có đáng tin cậy hay không. Cái loại mà nộp báo cáo xong rồi nửa ngày sau mới "xin lỗi sếp, dữ liệu bị sai ở..." là loại bỏ đi.

Ý tôi tò mò muốn xem code để tìm những chỗ có thể làm cho code đáng tin cậy hơn. Còn việc cải thiện cho nhanh hơn là thứ yếu.

Nếu bạn đưa file lên lại thì chịu khó, it nhất là ở đầu hàm/phương thức, ghi một vài dùng chú thích cho biết hàm này làm cái gì. Đọc code khôg khó lắm, cái khó nhất là những chỗ thấy code là lạ thì khó đoán ra là do cố tình viết như thế hay do lỗi.
 
Upvote 0
Hôm nay hơi rảnh một tí, tính xem thử thì cái file đã gỡ mất!!!

Tình thiệt mà nói thì code chạy vài giây đối với tôi chả ăn nhằm gì. Khi tôi làm việc với dữ liệu, điểm quan trọng nhất tôi muốn chú ý là "nếu kết quả có thể sai thì có nhận ra hay không? những chỗ không tính được thì code có cách nào báo cho người dùng biết?" Vì vậy tôi sẵn sàng để cho code chạy, đi uống cà phê rồi về xem kết quả. Nhưng sau đó thì tôi muốn trong vòng 1/2 giờ phải biết được kết quả có đáng tin cậy hay không. Cái loại mà nộp báo cáo xong rồi nửa ngày sau mới "xin lỗi sếp, dữ liệu bị sai ở..." là loại bỏ đi.

Ý tôi tò mò muốn xem code để tìm những chỗ có thể làm cho code đáng tin cậy hơn. Còn việc cải thiện cho nhanh hơn là thứ yếu.

Nếu bạn đưa file lên lại thì chịu khó, it nhất là ở đầu hàm/phương thức, ghi một vài dùng chú thích cho biết hàm này làm cái gì. Đọc code khôg khó lắm, cái khó nhất là những chỗ thấy code là lạ thì khó đoán ra là do cố tình viết như thế hay do lỗi.
dạ để em ghi chú lại rồi gởi file cho anh. file này nhân viên nhập số điện thoại có thể sai xót nên mới chuyển về database cho chuẩn lại dữ liệu rồi lấy dữ liệu đó làm dữ liệu gốc
Quy trình làm tìm số đt mua bao nhiêu số lượng bao nhiêu lần trong thời gian nào và liệt kê những ngày mua hàng và các món hàng
(Ở đây trong 1 ngày khách có thể mua nhiều lần cùng 1 mặc hàng, nhưng chỉ tính 1 lần mà thôi)
ví dụ 0918843213 đến cửa hàng mua 3 lần cùng 1 mặc hàng trong 1 ngày. Nhưng kết quả chỉ tính 1 lần
 
Lần chỉnh sửa cuối:
Upvote 0
File này chỉ có 5 sheet, vậy theo tôi thì: Tác giả nên mô tả cần làm những gì trong file này rồi ta làm lại từ đầu còn nhanh hơn
Nãy giờ "dò" code mà ngán quá: Cứ link từ sheet này qua sheet kia, từ sub này qua sub khác khiến tôi rối tung cái đầu
Nói thật bạn đừng buồn: Code của bạn... dở ẹc hà
 
Upvote 0
Dữ liệu có tất cả trong sheet database:
từ cột A đến cột AA
mình chỉ làm sheet So Tien(với 1 đống đk)

Kết quả mong muốn là những trường hợp đúng đk
thống kê 1 số điện thoại, mua số lần bao nhiêu, số tiền bao nhiêu, mua trong giai đoạn nào hay cả 2, liệt kê những ngày mua, liệt kê mặt hàng và số lượng mua. (Chú ý là 1 khách hàng có thể mua 1 mặt hàng trong 1 ngày nhiều lần, Nhưng chỉ được tính 1 lần mà thôi). Chủ yếu là em đang học hỏi để nâng cao trình độ VBA. Thật sự khách hàng đưa yêu cầu hầu như em giải quyết gọn nhưng vẫn chưa hài lòng nên mới học hỏi từ các vị tiền bối đi trước và có nhiều kinh nghiệm
 
Lần chỉnh sửa cuối:
Upvote 0
... nhân viên nhập số điện thoại có thể sai xót nên mới chuyển về database cho chuẩn lại dữ liệu rồi lấy dữ liệu đó làm dữ liệu gốc
Quy trình làm tìm số đt mua bao nhiêu số lượng bao nhiêu lần trong thời gian nào và liệt kê những ngày mua hàng và các món hàng
(Ở đây trong 1 ngày khách có thể mua nhiều lần cùng 1 mặc hàng, nhưng chỉ tính 1 lần mà thôi)
ví dụ 0918843213 đến cửa hàng mua 3 lần cùng 1 mặc hàng trong 1 ngày. Nhưng kết quả chỉ tính 1 lần

Theo quy trình này thì tôi dùng CSDL chuyên nghiệp, ví dụ như Access.
Nếu bắt buộc phải dùng Excel thì tôi cũng dùng Access để thiết kế CSDL cho chuẩn rồi mới chuyển các bảng ra thành sheets trong Excel. (thực ra tôi chuyên về SQL Server hơn nên tôi sẽ làm ở phần mềm này)

Theo như ndu98081631 nói ở bài #10 thì tôi càng tin rằng bài của bạn tốc độ không quan trọng bằng khả năng đáng tin cậy của dữ liệu.
 
Upvote 0
Mới viết lại xong Module5 , theo như hiểu biết của tôi trong ngôn ngữ VBA, cái này là viết theo trình độ thật của tôi,
ngắn gọn hơn , nhưng tốc độ vẫn không cải thiện được(bài này chưa được test) ( trong file này có 2 modlue gần giống nhau, nhưng tôi vẫn viết 2 cái module cho rõ ràng thôi, chứ nếu gộp lại 1 cái và truyền tham số thì cũng ok)
Đã làm được côt D,E,F,G, I, và một nữa của cột K, tôi nghĩ nếu cột K hoàn chỉnh thì tốc độ sẽ chậm hơn nữa
(File trước khi xử lý dữ liệu, dữ liệu đúng 100% đó các anh)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mới viết lại xong Module5 , theo như hiểu biết của tôi trong ngôn ngữ VBA, cái này là viết theo trình độ thật của tôi,
ngắn gọn hơn , nhưng tốc độ vẫn không cải thiện được(bài này chưa được test) ( trong file này có 2 modlue gần giống nhau, nhưng tôi vẫn viết 2 cái module cho rõ ràng thôi, chứ nếu gộp lại 1 cái và truyền tham số thì cũng ok)
Đã làm được côt D,E,F,G, I, và một nữa của cột K, tôi nghĩ nếu cột K hoàn chỉnh thì tốc độ sẽ chậm hơn nữa
(File trước khi xử lý dữ liệu, dữ liệu đúng 100% đó các anh)

File này tôi viết từ chiều hôm qua như đã nói trên bài #7.
Không biết bạn tạo ra sheet Database bằng những quy tắc nào. Chuyện đó tính sau.
Tôi chỉ lấy dữ liệu từ Database sang sheet Sotien thôi.
Bạn xem thử xem sao.
 

File đính kèm

Upvote 0
Mới xem code trong bài 13 là ớn tận xương luôn
Phân tích vui 1 Sub nhé
1. Trong file cốc có tìm thấy sheet nào là sheet6
2. Cái số 60005 không thuận theo tự nhiên gì cả, sao không là 65536, hoặc 60000
3. Sao lại resize 35 chi cho nặng nề
4. K=K+1 để làm gì, có dk gì đâu mà tăng thêm 1, lấy luôn biến J cho nhanh
Nói chung là mình pó toàn thân luôn.
PHP:
Public Sub LayDuLieu()
Dim Rngs(), Arr(), I As Long, J As Long, K As Long, y As Long
On Error Resume Next
With Sheets("Original 1")
    Rngs = .Range(.[A2], .[A60005].End(xlUp)).Resize(, 35).Value
End With
Dim T As String
ReDim Arr(1 To UBound(Rngs, 1), 1 To 8)
For J = 1 To 1000
   T = ""
   K = K + 1
      For I = 1 To UBound(Rngs, 1)
         If Rngs(I, 5) = Sheet6.Range("A" & 7 + J).Value Then
            T = T & Rngs(I, 2) & ","
         End If
      Next I
   Arr(K, 1) = T
Next J
Sheets("Sheet1").Range("B8:Z10000").ClearContents
Sheets("Sheet1").Range("B8").Resize(K, 1).Value = Arr
End Sub
 
Upvote 0
File này tôi viết từ chiều hôm qua như đã nói trên bài #7.
Public Sub GPE_Bate()
Dim Dic As Object, sArr(), dArr(), tArr(), Tem As String, I As Long, J As Long, K As Long, Gd As String
Dim DK1 As Variant, DK2 As String, DK3 As String, DK4 As String, DK5 As String, R As Long, Mh As String, Ngay As String
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Database")
sArr = .Range(.[A8], .[A8].End(xlDown)).Resize(, 37).Value
End With


tArr = [A14:J14].Value
ReDim dArr(1 To UBound(sArr, 1), 1 To 11)
For I = 1 To UBound(sArr, 1)
If sArr(I, 28) = True Then
Tem = sArr(I, 36)
Gd = "Gd" & sArr(I, 27)
Mh = IIf(Len(sArr(I, 11)) > 6, Left(Right(sArr(I, 11), 7), 6), sArr(I, 11))
If Not Dic.Exists(Tem) Then
K = K + 1
Dic.Add Tem, K
For J = 1 To 6
If tArr(1, J) <> Empty Then dArr(K, J) = sArr(I, tArr(1, J))
Next J
dArr(K, 7) = sArr(I, 16) - sArr(I, 18)
dArr(K, 9) = Format(sArr(I, 37), "dd/mm/yyyy")
dArr(K, 10) = Gd
dArr(K, 11) = Mh & "-" & sArr(I, 12) & "-SL-" & sArr(I, 14)
Else
R = Dic.Item(Tem)
dArr(R, 5) = dArr(R, 5) + sArr(I, 14)
dArr(R, 6) = dArr(R, 6) + sArr(I, 16)
dArr(R, 7) = dArr(R, 7) + sArr(I, 16) - sArr(I, 18)
Ngay = Format(sArr(I, 37), "dd/mm/yyyy")
If InStr(dArr(R, 9), Ngay) = 0 Then dArr(R, 9) = dArr(R, 9) & ";" & Ngay
If dArr(R, 10) <> Gd Then dArr(R, 10) = "2 Gd"
dArr(R, 11) = dArr(R, 11) & "; " & Mh & "-" & sArr(I, 12) & "-SL-" & sArr(I, 14)
End If
End If
Next I
[A17:K10000].ClearContents
If K Then
Range("A17").Resize(K, 11) = dArr
Range("A17").Resize(K, 11).Sort Key1:=Range("J17"), Order1:=xlAscending, Key2:=Range("A17"), Order2:=xlAscending, Key3:=Range("G17"), Order3:=xlDescending
Else
MsgBox "Khong tim thay du lieu dung dieu kien"
End If
Set Dic = Nothing
Application.ScreenUpdating = True
End Sub
chỉ cần nhiêu đó thôi, áp dụng DIC toàn tập có khác, Em cảm ơn Anh nhiều
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
anh chỉ xem module 5 chơi thôi, mấy cái khác bỏ đi anh
...

Module5:

Theo nhìn sơ qua thì trong suốt thời gian chạy LAY_DUYNHAT_DT, dữ liệu sheet3 không hề thay đối.
Bên trong LAY_DUYNHAT_DT, có một vòng lặp, code bên trong vòng lặp gọi LAYNGAY_DUYNHAT và LAYMATHANG_DUYNHAT.
Hai hàm này, mỗi lần chạy lại dùng biến SArr để lấy một vùng dữ liệu.
Nếu dùng biến static hoặc global thì chỉ phải lấy môt lần.

Đấy là bạn nói chỉ chú trọng vào module này. Hàm UniqueList không ở module này nên chưa tính tới.

Chú thích: Bạn viết nhiều modules mà cẩu thả về phạm vi của hàm/phương thức quá. Hàm/phương thức nào chỉ dùng trong pham vi của module (không được gọi từ module khác) thì nên đặt nó là Private.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình làm thử bằng ADO thấy có rất nhiều người không có SĐT, không biết là gộp chung lại hay tách từng người?
 
Upvote 0
Mình làm thử bằng ADO thấy có rất nhiều người không có SĐT, không biết là gộp chung lại hay tách từng người?

ADO trong trường hợp này hơi nguy hiểm. Đây là công việc làm cho khách hàng, phải có độ tin cậy cao. ADO vướng cái bug khi kết nối với file đang mở, lúc đóng kết nối nó không giải phóng bộ nhớ. Chạy 1 vài vòng không sao, nhưng nhiều lần nó sẽ bị lỗi hết bộ nhớ.
 
Upvote 0
Web KT

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

Back
Top Bottom