Code VBA thay hàm sumproduct (2 người xem)

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

Tôi tuân thủ nội quy khi đăng bài

shnhatha

Thành viên mới
Tham gia
21/3/12
Bài viết
3
Được thích
0
Mình có một file dữ liệu muốn tổng hợp năng suất theo ngày của từng mã.Việc dùng hàm sumproduct khiến cho file chạy rất chậm
Do kiến thức còn kém không biết cách sử dụng VBA để cải thiện tốc độ,rất mong được anh chị em chỉ bảo học hỏi thêm.
Xin chân thành cảm ơn.
 

File đính kèm

Mình có một file dữ liệu muốn tổng hợp năng suất theo ngày của từng mã.Việc dùng hàm sumproduct khiến cho file chạy rất chậm
Do kiến thức còn kém không biết cách sử dụng VBA để cải thiện tốc độ,rất mong được anh chị em chỉ bảo học hỏi thêm.
Xin chân thành cảm ơn.
Nên diễn giải cách tính thủ công ra thì người đọc dễ hiểu hơn là đi dò công thức, từ đó thực hiện sẽ nhanh hơn.
 
Upvote 0
Nên diễn giải cách tính thủ công ra thì người đọc dễ hiểu hơn là đi dò công thức, từ đó thực hiện sẽ nhanh hơn.
Xin cảm ơn ..Để có kết quả năng suất mình thực hiện hàm Sumproduct với các điều kiện mã và ngày,giá trị được tính toán theo ví dụ ảnh dưới.!
Screenshot -10-18 094352.png
Vậy nhờ anh chị em và bạn xem giúp .
 
Upvote 0
Xin cảm ơn ..Để có kết quả năng suất mình thực hiện hàm Sumproduct với các điều kiện mã và ngày,giá trị được tính toán theo ví dụ ảnh dưới.!
View attachment 310063
Vậy nhờ anh chị em và bạn xem giúp .
PHP:
Sub GPE()
Dim Dic As Object, Key, Lc%, j%, Res()
Dim i&, Lr&, Arr(), txt As Variant, k&

Application.ScreenUpdating = False

Set Dic = CreateObject("Scripting.Dictionary")

With ThisWorkbook.Sheets("DATA")
    Lr = .Range("A" & Rows.Count).End(xlUp).Row
    Arr = .Range("A2:E" & Lr).Value
End With

For i = 1 To UBound(Arr)
    Key = Arr(i, 1) & "|" & Arr(i, 2)
    If Not Dic.exists(Key) Then
        Dic.Add (Key), Arr(i, 3) * Arr(i, 4) * Arr(i, 5) & "|" & Arr(i, 3) * Arr(i, 4)
    Else
        txt = Split(Dic.Item(Key), "|")
        Dic.Item(Key) = CDbl(txt(0)) + Arr(i, 3) * Arr(i, 4) * Arr(i, 5) & "|" & CDbl(txt(1)) + Arr(i, 3) * Arr(i, 4)
    End If
Next i

With ThisWorkbook.Sheets("TH_NS")
    Lc = .Cells(6, .Columns.Count).End(xlToLeft).Column
    Lr = .Range("B" & Rows.Count).End(xlUp).Row
    Arr = .Range(.Cells(6, 2), .Cells(Lr, Lc - 1)).Value
    ReDim Res(1 To UBound(Arr) - 2, 1 To UBound(Arr, 2))
    
     For i = 3 To UBound(Arr)
        For j = 2 To UBound(Arr, 2)
            Key = Arr(i, 1) & "|" & Arr(1, j)
            If Dic.exists(Key) Then
                txt = Split(Dic.Item(Key), "|")
                Res(i - 2, j - 1) = txt(0) / txt(1)
            Else
               Res(i - 2, j - 1) = ""
            End If
        Next j
    Next i
    .Range("C8").Resize(i - 3, j - 1).Value = Res
End With

MsgBox "Done"

Set Dic = Nothing
Application.ScreenUpdating = True
End Sub
Chạy thử code sau và kiểm tra kết quả.
 

File đính kèm

Upvote 0
PHP:
Sub GPE()
Dim Dic As Object, Key, Lc%, j%, Res()
Dim i&, Lr&, Arr(), txt As Variant, k&

Application.ScreenUpdating = False

Set Dic = CreateObject("Scripting.Dictionary")

With ThisWorkbook.Sheets("DATA")
    Lr = .Range("A" & Rows.Count).End(xlUp).Row
    Arr = .Range("A2:E" & Lr).Value
End With

For i = 1 To UBound(Arr)
    Key = Arr(i, 1) & "|" & Arr(i, 2)
    If Not Dic.exists(Key) Then
        Dic.Add (Key), Arr(i, 3) * Arr(i, 4) * Arr(i, 5) & "|" & Arr(i, 3) * Arr(i, 4)
    Else
        txt = Split(Dic.Item(Key), "|")
        Dic.Item(Key) = CDbl(txt(0)) + Arr(i, 3) * Arr(i, 4) * Arr(i, 5) & "|" & CDbl(txt(1)) + Arr(i, 3) * Arr(i, 4)
    End If
Next i

With ThisWorkbook.Sheets("TH_NS")
    Lc = .Cells(6, .Columns.Count).End(xlToLeft).Column
    Lr = .Range("B" & Rows.Count).End(xlUp).Row
    Arr = .Range(.Cells(6, 2), .Cells(Lr, Lc - 1)).Value
    ReDim Res(1 To UBound(Arr) - 2, 1 To UBound(Arr, 2))
   
     For i = 3 To UBound(Arr)
        For j = 2 To UBound(Arr, 2)
            Key = Arr(i, 1) & "|" & Arr(1, j)
            If Dic.exists(Key) Then
                txt = Split(Dic.Item(Key), "|")
                Res(i - 2, j - 1) = txt(0) / txt(1)
            Else
               Res(i - 2, j - 1) = ""
            End If
        Next j
    Next i
    .Range("C8").Resize(i - 3, j - 1).Value = Res
End With

MsgBox "Done"

Set Dic = Nothing
Application.ScreenUpdating = True
End Sub
Chạy thử code sau và kiểm tra kết quả.
Xin cảm ơn bạn code chạy rất tốt ..Có gì không hiểu mong được chỉ giúp sau..!
 
Upvote 0

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

Back
Top Bottom