Giúp công thức hàm sum cộng không trùng (1 người xem)

Liên hệ QC

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

Bạn tham khảo thêm vba:
Mã:
Option Explicit
Public Function sum_sum(rng As Range)
    Dim dic As Scripting.Dictionary, sKey As Variant, r As Long, k As Long, a
    Set dic = New Scripting.Dictionary: a = rng.Value2
    For r = 1 To UBound(a, 1)
        sKey = a(r, 1)
        If Not dic.Exists(sKey) And Not IsEmpty(sKey) Then
            dic.Add sKey, a(r, 2)
            sum_sum = sum_sum + a(r, 2)
        End If
    Next r
End Function

Công thức:
Mã:
F5=sum_sum(C5:D13)
Cảm ơn bạn. Code báo lổi. Với lại ví dụ có 1 cột trống ở giữa thì sửa công thức ra làm sao.

1619520229304.png

Nếu chèn 1 cột ở giữa thì sửa công thức ra làm sao. Sao bạn không thiết kế cấu trúc như vầy =Sum_Sum( cột điều kiện, Cột Giá trị ) để cho người dùng tủy biến tùy ý
1619520189163.png
Bài đã được tự động gộp:

Mình xin gửi Lại file
1619520798523.png
 

File đính kèm

Lần chỉnh sửa cuối:
Cảm ơn bạn. Code báo lổi. Với lại ví dụ có 1 cột trống ở giữa thì sửa công thức ra làm sao.

View attachment 257748

Nếu chèn 1 cột ở giữa thì sửa công thức ra làm sao. Sao bạn không thiết kế cấu trúc như vầy =Sum_Sum( cột điều kiện, Cột Giá trị ) để cho người dùng tủy biến tùy ý
View attachment 257747
Bạn có thể đính kèm file lên đây được không OT thử không có lỗi :
1619520891608.png
Bài đã được tự động gộp:

Nếu chèn 1 cột ở giữa thì sửa công thức ra làm sao. Sao bạn không thiết kế cấu trúc như vầy =Sum_Sum( cột điều kiện, Cột Giá trị ) để cho người dùng tủy biến tùy ý
View attachment 257747
Bài đã được tự động gộp:

Mình xin gửi Lại file
View attachment 257753
Mã:
Option Explicit

Public Function sum_sum(rng As Range, i As Integer)
    Dim dic As Scripting.Dictionary, sKey As Variant, r As Long, k As Long, a
    Set dic = New Scripting.Dictionary: a = rng.Value2
    For r = 1 To UBound(a, 1)
        sKey = a(r, 1)
        If Not dic.Exists(sKey) And Not IsEmpty(sKey) Then
            dic.Add sKey, a(r, i)
            sum_sum = sum_sum + a(r, i)
        End If
    Next r
End Function

Mã:
F5=sum_sum(C5:D18,2)

Híc @@, dù được hay không thì mình cũng xin phép ...
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn có thể đính kèm file lên đây được không OT thử không có lỗi :
View attachment 257755
Bài đã được tự động gộp:


Mã:
Option Explicit

Public Function sum_sum(rng As Range, i As Integer)
    Dim dic As Scripting.Dictionary, sKey As Variant, r As Long, k As Long, a
    Set dic = New Scripting.Dictionary: a = rng.Value2
    For r = 1 To UBound(a, 1)
        sKey = a(r, 1)
        If Not dic.Exists(sKey) And Not IsEmpty(sKey) Then
            dic.Add sKey, a(r, i)
            sum_sum = sum_sum + a(r, i)
        End If
    Next r
End Function

Mã:
F5=sum_sum(C5:D18,2)

Híc @@, dù được hay không thì mình cũng xin phép ...
Rồi 2 cột đó nằm xa ra thì làm sao
1619521514958.png
 
Con chào Bác,
Bác ơi, nếu mà đi tiếp thì cũng có thể còn như là nếu cột giá trị nó nằm bên trái thì làm sao?... nên con xin phép rút sớm Bác ạ.
Viết một hàm bao

Function TongCong(a as variant, n as long) as Double
Select Case TypeName(a)
Case "Range"
TongCong = TongCongX(a.Value, n)
Case "V()"
TongCong = TongCongX(a, n)
Case Else
TongCong = Error
Edn Select
End Function

Private Function TongCongX(a as variant, n as long) as Double
' tính toán ở đây, dùng a như một array
End Function

Như đã nói ở trên, dùng tương tự như VLookup.

Chú: dùng Function TongCong(rg1 As Range, rg2 As Range) As Double giản dị hơn. Nhưng tôi muốn buộc thớt phải động não chút. Ai muốn làm mọi dưng từ a đến z thì làm :p
 
nếu cột giá trị nó nằm bên trái thì làm sao
Viết hàm nhận hai đối số là hai vùng riêng biệt, như hàm sumif ấy, có vùng điều kiện và vùng tính tổng.
Lưu ý rằng nếu bạn tham gia học tập thì không sao, nếu có nhã ý giúp thớt thì phải tự kiểm tra bài hết sức cẩn thận, bởi thớt tét cốt 3 tháng trong phòng thí nghiệm rồi mới sử dụng. Nếu không đạt là nguy hiểm lắm, đại khái như hai chủ đề gần đây.
 
Hỏi nhưng không đưa file kèm, anh em giúp rồi lại trở quẻ thêm thắt điều nọ kia.

Tôi có công thức cũng gọn gàng thôi, loại bỏ trùng lắp và chấp bạn có thêm 100 dòng trống nữa cũng cộng ra kết quả, nhưng tôi chỉ dành công thức này cho mấy anh em cần tham khảo học hỏi chân thành thôi, vì tôi thấy bạn chả thiết đến nữa.

Vậy nha.
Làm vầy ổn không anh:
Mã:
=SUMPRODUCT(VLOOKUP(C5:C18,--C5:D18,2,0)/COUNTIF(C5:C18,C5:C18&""))
 
Làm vầy ổn không anh:
Mã:
=SUMPRODUCT(VLOOKUP(C5:C18,--C5:D18,2,0)/COUNTIF(C5:C18,C5:C18&""))
Ổn em trai! Rất sáng tạo! :-)
Nhưng ứng phó với sự 'tư duy trước 100 năm' như anh Vẹt cảnh báo, thì em chịu khó thêm thắt trường hợp ô giờ báo lỗi, tỷ như 1/0 chẳng hạn, rồi xử lý luôn.

Giải pháp của anh chắc em biết, thay vì dùng cột phụ đếm số thứ tự xuất hiện, rồi chọn giá trị 1 xuất hiện đầu tiên, anh 'chơi' thành 1 mảng luôn. Đảm bảo ngắn hơn em chút chíu hà. Lại xử đẹp ô báo lỗi như trên anh đề cập.

Chúc em ngày vui.
/-*+//-*+//-*+/
 
Làm vầy ổn không anh:
Mã:
=SUMPRODUCT(VLOOKUP(C5:C18,--C5:D18,2,0)/COUNTIF(C5:C18,C5:C18&""))
Trên máy mình kết quả hơi lạ
Kết quả tính trực tiếp ô F7 = 6
Nếu tính gián tiếp qua E5:E18 thì F8 = 26
1619539571837.png

Dùng hàm Match
=SUMPRODUCT((MATCH(C5:C104&"",C5:C104&"",0)=ROW(1:100))*D5:D104)
 

File đính kèm

Trên máy mình kết quả hơi lạ
Kết quả tính trực tiếp ô F7 = 6
Nếu tính gián tiếp qua E5:E18 thì F8 = 26
View attachment 257784

Dùng hàm Match
=SUMPRODUCT((MATCH(C5:C104&"",C5:C104&"",0)=ROW(1:100))*D5:D104)
Bỏ bớt 0 trong Match():
=SUMPRODUCT((MATCH(C5:C104&"",C5:C104&"",)=ROW(1:100))*D5: D104)

Và bỏ hết các dấu $, so sánh 2 công thức thì của anh ngắn hơn 2 ký tự. :-)

Chỉ còn trường hợp 1/0 (nếu có).

Chúc anh ngày vui.
/-*+//-*+//-*+/
 
Ổn em trai! Rất sáng tạo! :)
Nhưng ứng phó với sự 'tư duy trước 100 năm' như anh Vẹt cảnh báo, thì em chịu khó thêm thắt trường hợp ô giờ báo lỗi, tỷ như 1/0 chẳng hạn, rồi xử lý luôn.

Giải pháp của anh chắc em biết, thay vì dùng cột phụ đếm số thứ tự xuất hiện, rồi chọn giá trị 1 xuất hiện đầu tiên, anh 'chơi' thành 1 mảng luôn. Đảm bảo ngắn hơn em chút chíu hà. Lại xử đẹp ô báo lỗi như trên anh đề cập.

Chúc em ngày vui.
/-*+//-*+//-*+/
Của em nó bỏ qua số 0 ở countif rồi mà, còn thiếu xót chỗ nào nhỉ ?
 
Viết hàm nhận hai đối số là hai vùng riêng biệt, như hàm sumif ấy, có vùng điều kiện và vùng tính tổng.
...
Nếu bạn đọc thớt bên kia sẽ thấy cái này là cái mà thớt đòi.
Và vì vậy ở bài #26 tôi mới nói là làm vậy quá đơn giản [sic]. Làm kiểu nguyên mảng như VLookup cho thớt vò đầu bứt tóc chơi.

Chú cho bạn ở bài #25:
Khi dùng VLookup người ta có cách để sử lý việc cột bên trái và cột bên phải. Chịu khó tìm ở GPE sẽ thấy.
 
Của em nó bỏ qua số 0 ở countif rồi mà, còn thiếu xót chỗ nào nhỉ ?
Không không! so với yêu cầu của thớt thì công thức của em không thiếu sót gì cả, anh thích công thức của em phá cách không như thường lệ. Anh chỉ quậy quọ thêm trường hợp cột giờ vô duyên vô cớ có ô chứa lỗi #DIV/0 để anh em mình gẫm thôi. Chuyện nhỏ như con thỏ em!

/-*+//-*+//-*+/
 
Làm vầy ổn không anh:
Mã:
=SUMPRODUCT(VLOOKUP(C5:C18,--C5:D18,2,0)/COUNTIF(C5:C18,C5:C18&""))
Bạn không nằm trong danh sách "VIP ca ca" (*1). Công thức của bạn sẽ rất nhiều khả năng nhận được một câu cộc lốc. Nếu câu trả lời không chứa nghĩa "kém cỏi, non tay" là đã may lắm rồi.

(*1): nếu bạn biết người thì cứ lục tìm mấy cái thớt cũ, sẽ có bài tôi giải thích về danh sách 1, 2, 3 của thớt.
 
Bạn không nằm trong danh sách "VIP ca ca" (*1). Công thức của bạn sẽ rất nhiều khả năng nhận được một câu cộc lốc. Nếu câu trả lời không chứa nghĩa "kém cỏi, non tay" là đã may lắm rồi.

(*1): nếu bạn biết người thì cứ lục tìm mấy cái thớt cũ, sẽ có bài tôi giải thích về danh sách 1, 2, 3 của thớt.
Không sao anh ạ, em làm để mấy anh em xem có hợp lý không thôi :)
 
Web KT

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

Back
Top Bottom