Code cho hàm sumproduct để tính tổng có điều kiện ở sheet khác

Liên hệ QC

hoahongden142917

Thành viên hoạt động
Tham gia
28/5/13
Bài viết
179
Được thích
20
Xin nhờ anh chị giúp mình viết code cho hàm sumproduct để tính tổng có điều kiện ở sheet khác. Mình đang có 2 sheet HN và GB nhưng mình lọ mọ hoài mà chỉ viết được code trên trang HN thôi, trong khi mình muốn viết code tính sumproduct trên trang GB mà vùng dò tìm thì ở HN cụ thể:
Tìm C4 có ở vùng dữ liệu HN!A4:Ai thì tính tổng các số ở cột HN!B.
Tìm C5 có ở vùng dữ liệu HN!A4:Ai thì tính tổng các số ở cột HN!B..
Tìm Ci có có ở vùng dữ liệu HN!A4:Ai thì tính tổng các số ở cột HN!B. Trong đó Ci là ô cuối cùng của cột C trang GB, Ai là ô cuối cùng của cột A trang HN
Xin cảm ơn anh chị.
 

File đính kèm

  • Vi du.xlsm
    44.1 KB · Đọc: 10
Sumproduct có sẵn rồi thì sài công thức thôi chứ bạn viết lại làm gì cho mắc công
Sheet GB: D4=SUMPRODUCT((HN!$A$4:$A$9=$C4)*(HN!$B$4:$B$9))
fill xuống cho các hàng bên dưới
 
Upvote 0
Sumproduct có sẵn rồi thì sài công thức thôi chứ bạn viết lại làm gì cho mắc công
Sheet GB: D4=SUMPRODUCT((HN!$A$4:$A$9=$C4)*(HN!$B$4:$B$9))
fill xuống cho các hàng bên dưới
Cảm ơn bạn đã quan tâm và chia sẻ. Tuy nhiên mình muốn dùng code vba vì 2 lí do: mình muốn tìm hiểu thêm về vba và dữ liệu của mình lớn lắm. Lên đến gần 2000 dòng lận. Vì thế mình cần dùng code chứ không dùng công thức có sẵn được. Thậm chí phương án macro mình cũng đã làm rồi nhưng rất chậm
 
Upvote 0
Xin nhờ anh chị giúp mình viết code cho hàm sumproduct để tính tổng có điều kiện ở sheet khác. Mình đang có 2 sheet HN và GB nhưng mình lọ mọ hoài mà chỉ viết được code trên trang HN thôi, trong khi mình muốn viết code tính sumproduct trên trang GB mà vùng dò tìm thì ở HN cụ thể:
Tìm C4 có ở vùng dữ liệu HN!A4:Ai thì tính tổng các số ở cột HN!B.
Tìm C5 có ở vùng dữ liệu HN!A4:Ai thì tính tổng các số ở cột HN!B..
Tìm Ci có có ở vùng dữ liệu HN!A4:Ai thì tính tổng các số ở cột HN!B. Trong đó Ci là ô cuối cùng của cột C trang GB, Ai là ô cuối cùng của cột A trang HN
Xin cảm ơn anh chị.
Nếu bạn muốn dùng hàm UDF thì hãy thử xem:
Hàm TVloopKup có chức năng như VLookup nhưng sẽ tổng cộng các giá trị trong cột(=Col) trong vùng tim kiếm(Rng) mà đáp ứng điều kiện (target).
Bài đã được tự động gộp:

Cảm ơn bạn đã quan tâm và chia sẻ. Tuy nhiên mình muốn dùng code vba vì 2 lí do: mình muốn tìm hiểu thêm về vba và dữ liệu của mình lớn lắm. Lên đến gần 2000 dòng lận. Vì thế mình cần dùng code chứ không dùng công thức có sẵn được. Thậm chí phương án macro mình cũng đã làm rồi nhưng rất chậm
Nếu muốn dùng VBA (trường hợp dữ liệu lớn ) thì thử dùng code (đính kèm file) xem sao.Kết quả trả về sau khi chạy code đang để ở cột G- bạn có thể thay đổi nếu muốn
 

File đính kèm

  • Vi du.xlsm
    49.5 KB · Đọc: 13
Lần chỉnh sửa cuối:
Upvote 0
Xin nhờ anh chị giúp mình viết code cho hàm sumproduct để tính tổng có điều kiện ở sheet khác. Mình đang có 2 sheet HN và GB nhưng mình lọ mọ hoài mà chỉ viết được code trên trang HN thôi, trong khi mình muốn viết code tính sumproduct trên trang GB mà vùng dò tìm thì ở HN cụ thể:
Tìm C4 có ở vùng dữ liệu HN!A4:Ai thì tính tổng các số ở cột HN!B.
Tìm C5 có ở vùng dữ liệu HN!A4:Ai thì tính tổng các số ở cột HN!B..
Tìm Ci có có ở vùng dữ liệu HN!A4:Ai thì tính tổng các số ở cột HN!B. Trong đó Ci là ô cuối cùng của cột C trang GB, Ai là ô cuối cùng của cột A trang HN
Xin cảm ơn anh chị.
Thử cái sub này xem đúng không nhé.
Mã:
Sub tinh()
Dim i As Long, arr, data, lr As Long, dic As Object, b As Long, t, s As String
Set dic = CreateObject("scripting.dictionary")
With Sheets("HN")
    lr = .Range("A" & Rows.Count).End(xlUp).Row
    arr = .Range("A4:B" & lr).Value
    ReDim kq(1 To UBound(arr), 1 To 1)
    For i = 1 To UBound(arr)
        dk = arr(i, 1)
        If Not dic.exists(dk) Then
           dic.Add dk, Array(i, arr(i, 2))
        Else
           dic.Item(dk) = Array(dic.Item(dk)(0) & "#" & i, dic.Item(dk)(1) + arr(i, 2))
        End If
    Next i
End With
With Sheets("GB")
     lr = .Range("C" & Rows.Count).End(xlUp).Row
     data = .Range("C4:D" & lr).Value
     For i = 1 To UBound(data)
         dk = data(i, 1)
         If dic.exists(dk) Then
            s = dic.Item(dk)(0)
            For Each t In Split(s, "#")
                kq(t, 1) = dic.Item(dk)(1)
            Next
         End If
     Next i
End With
With Sheets("HN")
     .Range("D4").Resize(UBound(arr)).Value = kq
End With
Set dic = Nothing
End Sub
 
Upvote 0
Nếu bạn muốn dùng hàm UDF thì hãy thử xem:
Hàm TVloopKup có chức năng như VLookup nhưng sẽ tổng cộng các giá trị trong cột(=Col) trong vùng tim kiếm(Rng) mà đáp ứng điều kiện (target).
Bài đã được tự động gộp:


Nếu muốn dùng VBA (trường hợp dữ liệu lớn ) thì thử dùng code (đính kèm file) xem sao.Kết quả trả về sau khi chạy code đang để ở cột G- bạn có thể thay đổi nếu muốn
Mình xin cảm ơn. Ban đầu đã đúng theo điều mình mong mỏi và mình mình đang áp dụng qua số liệu lớn. sẽ phản hồi tiếp. Nếu có gì nhờ bạn tiếp tục quan tâm giúp đỡ. Chân thành cảm ơn.
Bài đã được tự động gộp:

Thử cái sub này xem đúng không nhé.
Mã:
Sub tinh()
Dim i As Long, arr, data, lr As Long, dic As Object, b As Long, t, s As String
Set dic = CreateObject("scripting.dictionary")
With Sheets("HN")
    lr = .Range("A" & Rows.Count).End(xlUp).Row
    arr = .Range("A4:B" & lr).Value
    ReDim kq(1 To UBound(arr), 1 To 1)
    For i = 1 To UBound(arr)
        dk = arr(i, 1)
        If Not dic.exists(dk) Then
           dic.Add dk, Array(i, arr(i, 2))
        Else
           dic.Item(dk) = Array(dic.Item(dk)(0) & "#" & i, dic.Item(dk)(1) + arr(i, 2))
        End If
    Next i
End With
With Sheets("GB")
     lr = .Range("C" & Rows.Count).End(xlUp).Row
     data = .Range("C4:D" & lr).Value
     For i = 1 To UBound(data)
         dk = data(i, 1)
         If dic.exists(dk) Then
            s = dic.Item(dk)(0)
            For Each t In Split(s, "#")
                kq(t, 1) = dic.Item(dk)(1)
            Next
         End If
     Next i
End With
With Sheets("HN")
     .Range("D4").Resize(UBound(arr)).Value = kq
End With
Set dic = Nothing
End Sub
Cảm ơn bạn. Mình vừa áp dụng code của bạn. Mình phải sửa lại chỗ with sheets("HN") thành with sheets("GB") thì mới tổng hợp ra kết quả ở trang GB cột D. Tuy nhiên cột cột Ci là C9 mà cột D lại tổng hợp qua luôn đến dòng cuối của HN!A. Mình rất cảm ơn bạn.
 
Upvote 0
Nếu bạn muốn dùng hàm UDF thì hãy thử xem:
Hàm TVloopKup có chức năng như VLookup nhưng sẽ tổng cộng các giá trị trong cột(=Col) trong vùng tim kiếm(Rng) mà đáp ứng điều kiện (target).
Bài đã được tự động gộp:


Nếu muốn dùng VBA (trường hợp dữ liệu lớn ) thì thử dùng code (đính kèm file) xem sao.Kết quả trả về sau khi chạy code đang để ở cột G- bạn có thể thay đổi nếu muốn
mình đã áp dụng cho dữ liệu lớn tới 2000. cho kết quả rất nhanh. XIn cảm ơn bạn rất nhiều.
 
Upvote 0
Web KT

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

Back
Top Bottom