Cách tăng tốc độ chạy của chương trình ?

Liên hệ QC

Nguyen Rem

Tất cả chỉ là đưa ra quyết định đúng đắn
Tham gia
23/2/22
Bài viết
211
Được thích
30
Giới tính
Nữ
Em chào các anh chị trên diễn đàn!! . Lại em đây ^^
Hiện tại em đang gặp rắc rối về tốc độ chạy của chương trình , mong anh chị giúp em để cho chương trình chạy nhanh hơn(cụ thể là chạy được dựa vào code em viết) . Mong các anh chị giải thích cách các anh chị tư duy và code của các anh chị . Em cảm ơn anh chị rất nhiều .
Các anh chị vào module5 chạy và Sub thứ hai giúp em nhé ^^
1652168848479.png
 

File đính kèm

  • revdata.xlsm
    1 MB · Đọc: 19
Em chào các anh chị trên diễn đàn!! . Lại em đây ^^
Hiện tại em đang gặp rắc rối về tốc độ chạy của chương trình , mong anh chị giúp em để cho chương trình chạy nhanh hơn(cụ thể là chạy được dựa vào code em viết) . Mong các anh chị giải thích cách các anh chị tư duy và code của các anh chị . Em cảm ơn anh chị rất nhiều .
Các anh chị vào module5 chạy và Sub thứ hai giúp em nhé ^^
View attachment 275737
Phải công nhận bạn hỏi bài kinh thật. Cái này là học à
 
Upvote 0
Phải công nhận bạn hỏi bài kinh thật. Cái này là học à
Em tự học ấy anh :))) . Hiện tại em thấy mỗi GPE là thầy thôi ^^ . Còn bài tập thì em tự chế với tham khảo trên mạng
Bài đã được tự động gộp:

Phải công nhận bạn hỏi bài kinh thật. Cái này là học à
^^ Chắc từ giờ đến lúc em đạt được mục tiêu sẽ cần anh chị giúp nhiều hi
 
Upvote 0
Code của bạn có 2 vấn đề lớn:
1) Hơn 11K dòng dữ liệu mà dùng for cho từng dòng, và ghi lên sheet từng dòng
2) Range("B2:B" & Rows.Count) tức là vùng B2:B1048576, loop qua từng ô chắc tới sáng mai mới xong
Mình làm thử với hàm SUMIF, kết quả khoảng 0.1s

PHP:
Sub Sumrevenue()
Application.ScreenUpdating = False
Range("B1:C1").Value = Array("SReve", "SCust")
Dim A1 As Range, A2 As Range
Dim y As Range
    With Application.ThisWorkbook
        Set A1 = .Worksheets("rev").Range("B2:B" & .Worksheets("rev").Cells(Rows.Count, "B").End(xlUp).Row)
        Set A2 = .Worksheets("ucity").Range("A2:A" & .Worksheets("ucity").Cells(Rows.Count, "A").End(xlUp).Row)
        For Each y In A2
            y.Offset(0, 1).Value = WorksheetFunction.SumIf(A1, y, A1.Offset(0, 9)) 
            y.Offset(0, 2).Value = WorksheetFunction.SumIf(A1, y, A1.Offset(0, 10))
        Next
    End With
Application.ScreenUpdating = True
End Sub
 

File đính kèm

  • revdata.xlsm
    1 MB · Đọc: 10
Upvote 0
Code của bạn có 2 vấn đề lớn:
1) Hơn 11K dòng dữ liệu mà dùng for cho từng dòng, và ghi lên sheet từng dòng
2) Range("B2:B" & Rows.Count) tức là vùng B2:B1048576, loop qua từng ô chắc tới sáng mai mới xong
Mình làm thử với hàm SUMIF, kết quả khoảng 0.1s

PHP:
Sub Sumrevenue()
Application.ScreenUpdating = False
Range("B1:C1").Value = Array("SReve", "SCust")
Dim A1 As Range, A2 As Range
Dim y As Range
    With Application.ThisWorkbook
        Set A1 = .Worksheets("rev").Range("B2:B" & .Worksheets("rev").Cells(Rows.Count, "B").End(xlUp).Row)
        Set A2 = .Worksheets("ucity").Range("A2:A" & .Worksheets("ucity").Cells(Rows.Count, "A").End(xlUp).Row)
        For Each y In A2
            y.Offset(0, 1).Value = WorksheetFunction.SumIf(A1, y, A1.Offset(0, 9))
            y.Offset(0, 2).Value = WorksheetFunction.SumIf(A1, y, A1.Offset(0, 10))
        Next
    End With
Application.ScreenUpdating = True
End Sub
Dạ vâng ạ ^^ . Em cảm ơn anh nhiều . Để em thử viết rồi có gì em báo anh sau ạ :)))
 
Upvote 0
Dạ vâng ạ ^^ . Em cảm ơn anh nhiều . Để em thử viết rồi có gì em báo anh sau ạ :)))
Mình chỉ nói số liệu ước lượng thôi chứ không tính chi tiết nhé:
A1 khoảng 1 triệu dòng, A2 cũng bằng A1 là 1 triệu dòng
Xong bạn lặp lồng nhau thì = A1 dòng x A2 dòng = 1.000.000 x 1.000.000 = 1.000.000.000.000 lần chạy :D ,
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Em chào các anh chị trên diễn đàn!! . Lại em đây ^^
Hiện tại em đang gặp rắc rối về tốc độ chạy của chương trình , mong anh chị giúp em để cho chương trình chạy nhanh hơn(cụ thể là chạy được dựa vào code em viết) . Mong các anh chị giải thích cách các anh chị tư duy và code của các anh chị . Em cảm ơn anh chị rất nhiều .
Các anh chị vào module5 chạy và Sub thứ hai giúp em nhé ^^
View attachment 275737
Bạn nên sử học mảng(array) và Dictionary để tồi ưu vòng lặp.
 
Upvote 0
Bạn nên sử học mảng(array) và Dictionary để tồi ưu vòng lặp.
Em học mảng rồi còn Dictionary thì em vẫn chưa ^^ . Nhưng mà em vẫn chưa hiểu ý anh lắm , anh có thể minh họa dựa vào code ở #1 giúp em được không ạ . "Tối ưu vòng lặp" là làm nó ngắn gọn hơn hay là giúp nó chạy được ạ (code #1 chưa chạy được vì nó lặp quá nhiều^^)
 
Upvote 0
Em học mảng rồi còn Dictionary thì em vẫn chưa ^^ . Nhưng mà em vẫn chưa hiểu ý anh lắm , anh có thể minh họa dựa vào code ở #1 giúp em được không ạ . "Tối ưu vòng lặp" là làm nó ngắn gọn hơn hay là giúp nó chạy được ạ (code #1 chưa chạy được vì nó lặp quá nhiều^^)
Code làm việc với object sẽ bị chậm, trong excel mỗi cell được tính là 1 object, 1 range có 1 triệu dòng x 1 triệu cột thì khi chạy vòng lặp sẽ lặp qua từ ô một làm code bị chậm. Với mảng nó chỉ là một biến duy nhất, lại không phải là object nên tốc độ sẽ nhanh hơn nhiều, code có thể không ngắn hơn thậm chí có thể dài hơn nhưng tốc độ sẽ nhanh hơn rất nhiều
 
Upvote 0
Em học mảng rồi còn Dictionary thì em vẫn chưa ^^ . Nhưng mà em vẫn chưa hiểu ý anh lắm , anh có thể minh họa dựa vào code ở #1 giúp em được không ạ . "Tối ưu vòng lặp" là làm nó ngắn gọn hơn hay là giúp nó chạy được ạ (code #1 chưa chạy được vì nó lặp quá nhiều^^)
Dic thì nó lấy được giá trị duy nhất cho bạn chứ không cần phải ghi các thành phố sẵn vào sheet như vậy. Và duyệt trên xuống 1 vòng lặp là đủ
 
Upvote 0
Em cảm ơn mọi người nhiều lắm ^^ Nhưng mà em vẫn cần một ví dụ cho nó trực quan chứ nói không em vẫn không hiểu được :> . Kiểu ví dụ như: khi áp dụng kiến thức mảng vào code của bài #1 để cho nó chạy nhanh được chẳng hạn , tương tự với Dictionary
 
Upvote 0
Em cảm ơn mọi người nhiều lắm ^^ Nhưng mà em vẫn cần một ví dụ cho nó trực quan chứ nói không em vẫn không hiểu được :> . Kiểu ví dụ như: khi áp dụng kiến thức mảng vào code của bài #1 để cho nó chạy nhanh được chẳng hạn , tương tự với Dictionary
Với Dictionary thì mổ xẻ 1 cái code cơ bản như trong link này ra rồi áp dụng vào dữ liệu của bạn:

Tất nhiên khi dùng Dic thì phải nắm được cơ bản về mảng.

Vào chuyên mục Lập trình với Excel sẽ thấy mấy bài viết quan trọng kiểu này được neo lên đầu chuyên mục. Đọc đến đâu làm đến đó thì sẽ nắm được vấn đề.
 
Upvote 0
Với Dictionary thì mổ xẻ 1 cái code cơ bản như trong link này ra rồi áp dụng vào dữ liệu của bạn:

Tất nhiên khi dùng Dic thì phải nắm được cơ bản về mảng.

Vào chuyên mục Lập trình với Excel sẽ thấy mấy bài viết quan trọng kiểu này được neo lên đầu chuyên mục. Đọc đến đâu làm đến đó thì sẽ nắm được vấn đề.
Dạ vâng ạ ! Em cảm ơn anh nhiều ^^ để em đọc ạ hi
 
Upvote 0
Em cảm ơn mọi người nhiều lắm ^^ Nhưng mà em vẫn cần một ví dụ cho nó trực quan chứ nói không em vẫn không hiểu được :> . Kiểu ví dụ như: khi áp dụng kiến thức mảng vào code của bài #1 để cho nó chạy nhanh được chẳng hạn , tương tự với Dictionary
Thử xem cả mảng cả dic
Mã:
Option Explicit

Sub xxx()
Dim Nguon
Dim Tam
Dim i, k

Nguon = Sheet1.Range("A1").CurrentRegion

With CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(Nguon)
        k = Nguon(i, 2)
        If .exists(k) = False Then
            .Item(k) = Array(Nguon(i, 9), Nguon(i, 10))
        Else
            Tam = .Item(k)
            Tam(0) = Tam(0) + Nguon(i, 9)
            Tam(1) = Tam(1) + Nguon(i, 10)
            .Item(k) = Tam
        End If
    Next i
    
    Sheet9.Range("B1").Value = "SReve"
    Sheet9.Range("C1").Value = "SCust"
    For i = 2 To Sheet9.Range("A" & Rows.Count).End(xlUp).Row
        If .exists(Sheet9.Range("A" & i).Value) Then
            Sheet9.Range("B" & i).Resize(1, 2) = .Item(Sheet9.Range("A" & i).Value)
        End If
    Next i
End With
End Sub
 
Upvote 0
Khi dữ liệu nhiều thì không có cấu trúc nào nhanh hơn mảng cả.
Bài #17 sử dụng chưa hết chức năng của mảng cho nên hơi luộm thuộm.
Nếu thớt biết rằng mình đã học qua mảng thì thử chỉnh sửa lại xem.
Gợi ý: kỹ thuật kết hợp mảng và đít sần đơn giản hơn ở trên, tuy rằng nó cần một mẹo nhỏ mà ở GPE này người ta sử dụng rất nhiều, chịu khó tìm sẽ thấy.
 
Upvote 0
em cũng có file tương tự ntn. chỉ có điều file của em có khoảng 100k sản phẩm. Tổng dòng của file doanh số khoảng 150k. giờ e muốn tính tổng doanh số của từng sản phẩm thôi ạ. các code trên em test chạy vẫn treo.
 
Upvote 0
em cũng có file tương tự ntn. chỉ có điều file của em có khoảng 100k sản phẩm. Tổng dòng của file doanh số khoảng 150k. giờ e muốn tính tổng doanh số của từng sản phẩm thôi ạ. các code trên em test chạy vẫn treo.
Anh phải gửi file lên thì mọi người mới hình dung ra vấn đề anh đang gặp phải chứ ^^ .
Về bài này của em thì em tính tổng doanh thu của mỗi thành phố:
Ý tưởng của em là :
Lọc tất cả các giá trị trùng nhau dựa trên thành phố rồi in ra một sheet mới
1653886611156.png
Sau đó anh có thể áp dụng code của bài số #4 để dùng hàm sumif để tính dựa trên các điều kiện mà mình in vừa nãy ở sheet mới
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom