Sửa giùm em code thay cho hàm SUMPRODUCT

Liên hệ QC

duynhat84

Thành viên chính thức
Tham gia
23/9/11
Bài viết
75
Được thích
4
Em viết code thay cho hàm SUMPRODUCT cho ra kết quả dúng nhưng nó chạy chậm quá, nhờ các anh chị chỉnh sửa sao cho nó chay nhanh hơn.
Em xin cảm ơn nhiều./.
em gửi File kèm theo.
 

File đính kèm

  • VBAThaySumProduc.rar
    117.6 KB · Đọc: 60
Em viết code thay cho hàm SUMPRODUCT cho ra kết quả dúng nhưng nó chạy chậm quá, nhờ các anh chị chỉnh sửa sao cho nó chay nhanh hơn.
Em xin cảm ơn nhiều./.
em gửi File kèm theo.
Thế sao bạn không dùng SUMIFS thay cho SUMPRODUCT, tốc độ của SUMIFS nhanh gấp nhiều lần so với SUMPRODUCT đấy
 
Lần chỉnh sửa cuối:
Upvote 0
em đang dùng ẽcle 2003
em dọc trên DĐ nói Ẽcle 2003 không dùng được hàm này
 
Lần chỉnh sửa cuối:
Upvote 0
Em viết code thay cho hàm SUMPRODUCT cho ra kết quả dúng nhưng nó chạy chậm quá, nhờ các anh chị chỉnh sửa sao cho nó chay nhanh hơn.
Em xin cảm ơn nhiều./.
em gửi File kèm theo.

Code của bạn là code dùng khi bạn cần đi nhậu. Nhậu về tắm rửa xong thì code cũng vừa thực hiện xong

Mã:
With Sheets("ChiTiet") 
    ...
   For i = 5 To UBound(Res)                 
      For j = 1 To UBound(data)
        ...
      Next
      [COLOR=#ff0000].[E7].Resize(i - 0, 45) = Res[/COLOR]
   Next
End With

.[E7].Resize(i - 0, 45) = Res được đặt trong vòng lặp FOR.
Thế nếu UBound(Res) bằng vài ngàn thì bạn đập mảng Res xuống sheet vài ngàn lần? Tất nhiên lần 1 đập 5 dòng, lần 2 đập 6 dòng v...v Nhưng đập vài ngàn lần mà lại để làm mới thì chết rồi. Ngoài ra trong code có 2 chỗ như thế nên thời gian nhân lên 2 lần.

Thuốc chữa: Ở cả 2 phần đưa .[E7].Resize ra sau vòng FOR ngoài cùng. "Tát" sheet 1 lần thôi. Làm cho cả 2 phần

Mã:
With Sheets("ChiTiet") 
    ...
   For i = 5 To UBound(Res)                 
      For j = 1 To UBound(data)
        ...
      Next      
   Next
   .[E7].Resize(UBound(Res), [B][COLOR=#ff0000]45[/COLOR][/B]) = Res
End With

Ở phần thứ 2 thì là
Mã:
 .[E7].Resize(UBound(Res), [B][COLOR=#ff0000]54[/COLOR][/B]) = Res

Thử lại tốc độ.
 
Upvote 0
Cảm ơn bác Siwtom em biết là đưa cái code này lên hỏi thế nào cũng bị các bác Cười, nhưng thà thế còn hơn cứ dốt mãi.
Nhưng sao em sửa lại theo bác vẫn chậm vậy
Bác xem còn chỗ nào sửa giùm em với.
em gửi lại file mới sửa
 

File đính kèm

  • 2VBAThaySumProduc.rar
    117.6 KB · Đọc: 100
Upvote 0
Cảm ơn bác Siwtom em biết là đưa cái code này lên hỏi thế nào cũng bị các bác Cười, nhưng thà thế còn hơn cứ dốt mãi.
Nhưng sao em sửa lại theo bác vẫn chậm vậy
Bác xem còn chỗ nào sửa giùm em với.
em gửi lại file mới sửa

Bạn có sửa quái đâu.

Bạn vẫn có
Mã:
.[E7].Resize(UBound(Res), 45) = Res

và

.[E7].Resize(UBound(Res), 54) = Res

nằm giữa 2 Next

Tức
Mã:
[COLOR=#ff0000]Next[/COLOR]
.[E7].Resize(UBound(Res), 45) = Res
[COLOR=#ff0000]Next[/COLOR]
End With

và 

[COLOR=#ff0000]Next[/COLOR]
.[E7].Resize(UBound(Res), 54) = Res
[COLOR=#ff0000]Next[/COLOR]
End With

Bạn chỉ làm mỗi việc: sửa "i - 0" thành UBound(Res) chứ bạn vẫn để ở vị trí cũ.

Bạn hãy nhìn kỹ trong bài #4. Tôi đã viết rất kỹ

Mã:
Ở cả 2 phần đưa .[E7].Resize [COLOR=#ff0000]ra sau vòng FOR ngoài cùng[/COLOR]

With Sheets("ChiTiet") 
    ...
   For i = 5 To UBound(Res)                 
      For j = 1 To UBound(data)
        ...
      [COLOR=#ff0000]Next      
   Next[/COLOR]
   .[E7].Resize(UBound(Res), 45) = Res
End With

Bạn nhìn kỹ vào. "[E7].Resize(UBound(Res), 45) = Res" ở trước End With nhưng sau TẤT CẢ các Next. Nhìn kỹ rồi nhìn lại code của mình.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bác Siwtom nhiều, em đã làm được rồi! ^_^
 
Upvote 0
Bạn có sửa quái đâu.
.............
Bạn nhìn kỹ vào. "[E7].Resize(UBound(Res), 45) = Res" ở trước End With nhưng sau TẤT CẢ các Next. Nhìn kỹ rồi nhìn lại code của mình.

Bài này vẫn tối ưu được nữa chứ bác siwtom?,
Định làm, nhưng thấy chỗ nhiều vòng FOR cứ buồn cười sao ý,

Tuy vậy, người hỏi đưa lệnh đó ra ngoài, chắc tốc độ đã cải thiện nhiều, đủ dùng?
 
Upvote 0
Bài này vẫn tối ưu được nữa chứ bác siwtom?,
Định làm, nhưng thấy chỗ nhiều vòng FOR cứ buồn cười sao ý,

Tuy vậy, người hỏi đưa lệnh đó ra ngoài, chắc tốc độ đã cải thiện nhiều, đủ dùng?

Bài này tôi không đọc kỹ code. Nhìn không thôi đã thấy "nhức đầu lắm". Muốn sửa cho tối ưu thì phải đọc kỹ từng dòng, xem người ta định kiểm tra gì, làm gì v...v Người ta nói là "code ... cho ra kết quả dúng", vậy thì cải thiện chút về tốc độ thôi chứ không sửa gì hết.

Tôi chỉ chỉ ra 1 vị trí làm code chậm đi rất nhiều. Lười mà. Nhưng nếu là vấn đề kinh điển, có ích cho nhiều người, dùng "mãi mãi" thì cũng thử nghiên cứu đấy. Còn đây là vấn đề chỉ giúp cho người hỏi thì xin rút lui.

Người hỏi cũng chả thèm nói tốc độ bây giờ như thế nào nhưng tôi cũng đã thử. Tất nhiên nếu chỉ đập mảng xuống sheet 2 lần thay cho 5000 lần thì rõ ràng tốc độ nhanh rồi. Trên máy của tôi (đã nhiều lần so sánh chạy code thì máy của tôi chạy 5 - 10 lần chậm hơn những máy của người khác trên GPE) thì code chạy mất ~ 1,9 giây. Lúc đầu tò mò chạy code của tác giả thì đợi lâu quá nên tôi Kill luôn Excel.

Bạn muốn tối ưu mà có hứng thì làm cho người hỏi đi. Tôi xin nghỉ thôi.
 
Upvote 0
Người hỏi cũng chả thèm nói tốc độ bây giờ như thế nào nhưng tôi cũng đã thử. Tất nhiên nếu chỉ đập mảng xuống sheet 2 lần thay cho 5000 lần thì rõ ràng tốc độ nhanh rồi. Trên máy của tôi (đã nhiều lần so sánh chạy code thì máy của tôi chạy 5 - 10 lần chậm hơn những máy của người khác trên GPE) thì code chạy mất ~ 1,9 giây. Lúc đầu tò mò chạy code của tác giả thì đợi lâu quá nên tôi Kill luôn Excel.

Bạn muốn tối ưu mà có hứng thì làm cho người hỏi đi. Tôi xin nghỉ thôi.

Quan trọng tiêu chí trả lời là đáp ứng y.c người hỏi, vậy thì thỏa mãn tiêu chí rùi bác ah,
nói thật thử code gốc tác giả vodoi2x cũng phải kill lun excel vì lâu quá , quá lâu lun

Có đôi khi ta chờ đợi chút cho đời chậm lại (code lâu chút có sao, có khi ta ngồi ly cafe điếu thuốc hết phén 30 phút có sao đâu, mà code chạy lâu cỡ phút là khó đợi rui hihihi)

vậy nên, hãy để người hỏi tự đặt yêu cầu, và đã thỏa lòng thì dừng
 
Upvote 0
Cảm ơn các bác chắc chưa có bác đủ kiên nhẫn chờ cái code của em chạy xong. Sau khi sửa code theo hướng dẫn của bác viwtom em thấy thời gian từ gần 1h chỉ còn tính bằng giây là em mừng lắm, nhưng không nghĩ là có thể rút ngắn được nữa nên không hỏi, sợ các bác cho là được voi đòi tiên, nếu còn rút càng ngắn được thì càng tốt, mong các bác chỉ dùm em luôn.
em cảm ơn nhiêù!
 
Upvote 0
Cảm ơn các bác chắc chưa có bác đủ kiên nhẫn chờ cái code của em chạy xong. Sau khi sửa code theo hướng dẫn của bác viwtom em thấy thời gian từ gần 1h chỉ còn tính bằng giây là em mừng lắm, nhưng không nghĩ là có thể rút ngắn được nữa nên không hỏi, sợ các bác cho là được voi đòi tiên, nếu còn rút càng ngắn được thì càng tốt, mong các bác chỉ dùm em luôn.
em cảm ơn nhiêù!
 
Upvote 0
Cảm ơn các bác chắc chưa có bác đủ kiên nhẫn chờ cái code của em chạy xong. Sau khi sửa code theo hướng dẫn của bác viwtom em thấy thời gian từ gần 1h chỉ còn tính bằng giây là em mừng lắm, nhưng không nghĩ là có thể rút ngắn được nữa nên không hỏi, sợ các bác cho là được voi đòi tiên, nếu còn rút càng ngắn được thì càng tốt, mong các bác chỉ dùm em luôn.
em cảm ơn nhiêù!

tôi thử lại với cách của bác siwtom thì ngon lém rùi,

với quy mô số liệu trong file của bạn thì thời gian chạy bằng giây rùi, nếu có thuật toán hay hơn nữa thì cũng giảm vài giây chẳng đáng kể gì, nháy vài nháy mắt (không kể liếc mắt đi đâu đo nghe ) là xong rùi , vậy thì cần gì hơn nữa

trừ phi số liệu của bạn quá nhiều quá nhiều dòng hơn nữa phức tạp hơn nữa, thì mới cần cải tiến
 
Upvote 0
Cảm ơn các bác chắc chưa có bác đủ kiên nhẫn chờ cái code của em chạy xong. Sau khi sửa code theo hướng dẫn của bác viwtom em thấy thời gian từ gần 1h chỉ còn tính bằng giây là em mừng lắm, nhưng không nghĩ là có thể rút ngắn được nữa nên không hỏi, sợ các bác cho là được voi đòi tiên, nếu còn rút càng ngắn được thì càng tốt, mong các bác chỉ dùm em luôn.
em cảm ơn nhiêù!

Chỉ có bạn vodoi2x đòi tối ưu vậy bạn nên gửi tin nhắn cho vodoi2x xem sao. Vì bạn vodoi2x có thể không vào đọc chủ đề này nữa.

Tôi chỉ đọc qua code của bạn, mà cũng đã lâu, nên tôi không đoán được bạn vodoi2x định tối ưu cái gì. Còn nếu ai đó định thay

Mã:
If a Then
    If b Then
        ...
        If z Then
    MsgBox "hichic"
        End If
        ...
    End If
End If

bằng

Mã:
If a and b and ... and z Then
    MsgBox "hichic"
End If

thì theo tôi code chỉ gọn hơn chứ chưa hẳn là tối ưu. Vì sao?

1. Code 1. vd. nếu a = FALSE thì rõ ràng giá trị của b, c, ..., x, y, z không được tính nữa.

2. Code 2. tất cả các biểu thức a, b, ..., y, z đều được tính bất luận giá trị của chúng như thế nào. Cái này không tối ưu, vì nếu a = FALSE thì rõ ràng là giá trị của a and b and ... and z là FALSE, tính tiếp b, c, , ..., z để làm gì cho tốn điện nước?

vd. Delphi tính theo kiểu tính lần lượt a, b, ... cho tới khi tính tới z, tức lúc đó biết được kết quả của a and b and ... and z, hoặc tới khi gặp giá trị FALSE thì không tính tiếp nữa mà kết luận là giá trí của a and b and ... and z là FALSE.

VBA tính theo kiểu tốn điện nước. Ai không tin thì chạy 2 code hichic và hehe. Chạy hichic chỉ thấy 1 MsgBox, chạy hehe thấy 2 MsgBox

Mã:
Function bla() As Boolean
    bla = False
    MsgBox "bla"
End Function

Function he() As Boolean
    he = True
    MsgBox "he"
End Function

Sub hichic()
    If bla Then
        If he Then
            Debug.Print "tot"
        End If
    End If
End Sub

Sub hehe()
    If bla And he Then
        Debug.Print "tot"
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Chỉ có bạn vodoi2x đòi tối ưu vậy bạn nên gửi tin nhắn cho vodoi2x xem sao. Vì bạn vodoi2x có thể không vào đọc chủ đề này nữa.

Quả thực nếu tối ưu thì cũng định rút số vòng lặp thôi bác siwtom ah, vì hiện giờ cell nào cũng phải vòng lặp đi vòng lặp lại để tính tổng, vậy ta có thể có cách nào đó nhảy cóc đến đúng ô thỏa mãn đ.k để tính tổng mà thôi,

Tuy vậy, bài này như đã nói trên, có tối ưu hơn cũng tiết kiệm vài giây, chẳng ăn thua gì mà làm - tính hiệu quả không cao

Vậy nên dừng là đẹp
 
Upvote 0
Em nghe bác vodoi2x nói là có thể tối ưu được nen muối học hỏi thêm, chứ như thế là cũng toại nguyện rồi, vậy thì bài này ngừng ở đây để các bác còn giúp đỡ các thành viên khác.
Xin cảm ơn các bác nhiều.
 
Upvote 0
Web KT
Back
Top Bottom