Cách tăng tốc độ chạy của chương trình ? (1 người xem)

Liên hệ QC

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

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
32
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

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

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
...Tất nhiên khi dùng Dic thì phải nắm được cơ bản về mảng.
Không hẳn đúng.
Đã lập trình thì phải nắm được cơ bản về mảng. Trình độ vững về mảng phải đi đôi với trình độ lập trình.
Đít sần chuyện khác hoàn toàn. Đít sần là cù-lét-sần, cấu trúc không hề có chút xíu mảng. Việc hai thuộc tính Keys và Items của nó có thể ép thành mảng không có nghĩa rằng nó liên hệ đến mảng.
 
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.
Nếu chỉ có vậy thì dùng pivot table.
 
Upvote 0
Sẽ lên 1 triệu sản phẩm.
(hỉnh như từ viết tắt ntn vừa là "nào" vừa là "này" :p. Chắc không bao lâu nữa nó sẽ thêm "nữa", "nốt",... )
Tôi ghi có chữ nếu (nếu chỉ có vậy). Khi "nếu" xảy ra tôi không chịu trách nhiệm.
 
Upvote 0
Tôi ghi có chữ nếu (nếu chỉ có vậy). Khi "nếu" xảy ra tôi không chịu trách nhiệm.
Có ai bắt bẻ bạn đâu. Thấy vui nói vậy thôi.

Parkingson Law: work expands so as to fill the time available for its completion.

GPE Law: spreadsheet expands so as to make the most complex solution unavoidable.
 
Upvote 0
Người có kinh nghiệm làm việc luôn luôn có một văn bản biểu kế phạm vi và tầm vực của công việc (scope).
Phạm vi: công việc bao gồm các phần A, B, C, và không bao gồm D, E.
Tầm vực: công việc sẽ liên hệ đến X, Y, Z nhưng không liên hệ đến U, V, W. Nói cách khác, sẽ có giao diện với X, Y, Z và không có giao diện với U, V, W.

Học cũng vậy, bắt đầu là cái biểu kế scope. Sau đó mới đến cái kế hoạch thực hiện (plan).

Lúc học mà có người mách thêm thông tin này nọ thì cũng tốt, thêm phần phong phú. Nhưng để cho đi xa ra ngoài cái phạm vi ban đầu thì:
Phải xem lại cho kỹ cái đó có thực sự tốt trong thời điểm hiện tại hay không?
- Nếu có thì chỉnh lại bảng biểu kế.
- Nếu không thì quên đi.

Phần bảng tóm lược ở đầu một quyển sách (table of contents) chính là cái bieur kế này. Chỉ khác là rất ít tác giả chịu khó viết phần "không bao gồm", "ngoài phạm vi và tầm vực".
 
Upvote 0

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

Back
Top Bottom