Tính tổng cộng, nếu tên mặt hàng trùng nhau chỉ lấy giá trị lớn nhất để tính tổng (3 người xem)

Liên hệ QC

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

titanic20072007

Thành viên thường trực
Tham gia
10/7/07
Bài viết
216
Được thích
8
Nghề nghiệp
Giáo viên
Chào ACE GPE.
Mình có vấn đề cần tính tổng giá trị các mặt hàng. Nhưng nếu có mặt hàng trùng tên nhau thì chỉ lấy giá trị lớn nhất để tham gia tính tổng với các mặt hàng khác (số lượng các mặt hàng trùng nhau, số lượng trùng nhau trong một mặt hàng không biết trước). Theo các ACE thì làm như thế nào. Nhờ mọi người giúp đỡ. Cảm ơn mọi người.
 

File đính kèm

- Sort cột tên (A-Z) ưu tiên 1, cột giá trị giá trị (từ lớn đến nhỏ) ưu tiên 2.
- Tao mới 2 cột D; E
+ Tại Ô D4 ghi công thức :=IF(AND(B3<>B4);B4;"")
+ Tại Ô E4 ghi công thức :=IF(D4<>"";VLOOKUP(D4;$B$4:$C$14;2;0);"")

D4; E4 tương ứng với A4; B4; C4 Hàngdữ liệu đầu tiên.
- Copy công thức dến bgang hàng cuối cung của dữ liệu (hàng 14)
- các số muốn cộng đã hiện trên cột E.
 
Chào ACE GPE.
Mình có vấn đề cần tính tổng giá trị các mặt hàng. Nhưng nếu có mặt hàng trùng tên nhau thì chỉ lấy giá trị lớn nhất để tham gia tính tổng với các mặt hàng khác (số lượng các mặt hàng trùng nhau, số lượng trùng nhau trong một mặt hàng không biết trước). Theo các ACE thì làm như thế nào. Nhờ mọi người giúp đỡ. Cảm ơn mọi người.

nếu dùng cột phụ thì đơn giản
Mã:
D4=IF(C4=MAX(IF($B$4:$B$13=B4,$C$4:$C$13)),C4,"")
nhấn Ctrl shift enter
kéo xuống, rôi sum lại cột này
============
còn làm một phát ra luôn thì chưa có cách, sáng mai nghĩ tiếp....bi giờ bùn ngủ rùi.................hihihihihi
 
Chào ACE GPE.
Mình có vấn đề cần tính tổng giá trị các mặt hàng. Nhưng nếu có mặt hàng trùng tên nhau thì chỉ lấy giá trị lớn nhất để tham gia tính tổng với các mặt hàng khác (số lượng các mặt hàng trùng nhau, số lượng trùng nhau trong một mặt hàng không biết trước). Theo các ACE thì làm như thế nào. Nhờ mọi người giúp đỡ. Cảm ơn mọi người.
Trong lúc chờ công thức, góp vui với 1 hàm tự tạo:
Mã:
Public Function Sum_Max(Ten As Range, GiaTri As Range) As Double
Dim i As Long, Dic, Ten1, GiaTri1
Ten1 = Ten.Value
GiaTri1 = GiaTri.Value
 Set Dic = CreateObject("Scripting.Dictionary")
 For i = 1 To UBound(Ten1)
    If Not Dic.Exists(Ten1(i, 1)) Then
              Dic.Add Ten1(i, 1), GiaTri(i, 1)
    Else
        If Dic.Item(Ten1(i, 1)) < GiaTri1(i, 1) Then
            Dic.Item(Ten1(i, 1)) = GiaTri1(i, 1)
        End If
    End If
Next
Sum_Max = WorksheetFunction.Sum(Dic.Items)
End Function
 

File đính kèm

thấy PhuocCam phai xài vba chắc cthuc khó chơi rùi.......hihihihih
góp một cách bằng pivot
 

File đính kèm

nếu dùng cột phụ thì đơn giản
Mã:
D4=IF(C4=MAX(IF($B$4:$B$13=B4,$C$4:$C$13)),C4,"")
nhấn Ctrl shift enter
kéo xuống, rôi sum lại cột này

Mình đã thử và chạy được khi giá trị khác nhau ở các tên bằng nhau thì OK, còn khi các giá trị bằng nhau thì CT trên vẫn lấy hết các giá trị bằng nhau đó mà ý mình là chỉ lấy một giá trị cho một tên. Kiểu như bài toán một người có nhiều chế độ chỉ được chọn hưởng 1 chế độ cao nhất. Bác có thể chỉnh lại CT được không? Cảm ơn.
 
Trong lúc chờ công thức, góp vui với 1 hàm tự tạo:
Mã:
Public Function Sum_Max(Ten As Range, GiaTri As Range) As Double
Dim i As Long, Dic, Ten1, GiaTri1
Ten1 = Ten.Value
GiaTri1 = GiaTri.Value
 Set Dic = CreateObject("Scripting.Dictionary")
 For i = 1 To UBound(Ten1)
    If Not Dic.Exists(Ten1(i, 1)) Then
              Dic.Add Ten1(i, 1), GiaTri(i, 1)
    Else
        If Dic.Item(Ten1(i, 1)) < GiaTri1(i, 1) Then
            Dic.Item(Ten1(i, 1)) = GiaTri1(i, 1)
        End If
    End If
Next
Sum_Max = WorksheetFunction.Sum(Dic.Items)
End Function
Cảm ơn phuocam, hàm của bạn chạy cho KQ chính xác trong các tình huống của mình. Nhưng bạn có có thể viết thêm một hàm nữa để đưa ra giá trị thỏa mãn vào cột phụ bên canh không? Kiểu như công thức của Let'GâuGâu, vì trong tình huống này tôi cần thêm cả cột đó nữa. Cảm ơn bạn.
 
Cảm ơn phuocam, hàm của bạn chạy cho KQ chính xác trong các tình huống của mình. Nhưng bạn có có thể viết thêm một hàm nữa để đưa ra giá trị thỏa mãn vào cột phụ bên canh không? Kiểu như công thức của Let'GâuGâu, vì trong tình huống này tôi cần thêm cả cột đó nữa. Cảm ơn bạn.
Công thức cột phụ:
D4 =IF(COUNTIF($B$4:B4,B4)=1,MAX(IF($B$4:$B$13=B4,$C$4:$C$13,"")),"")
Nhớ kết thúc bằng Ctrl +Shift+Enter
 
Công thức cột phụ:
D4 =IF(COUNTIF($B$4:B4,B4)=1,MAX(IF($B$4:$B$13=B4,$C$4:$C$13,"")),"")
Nhớ kết thúc bằng Ctrl +Shift+Enter
Cảm ơn phuocam. Công thức này cho kết quả đúng trong các tình huống của mình rồi.
Nhưng có vấn đề về vị trí hiện giá trí thỏa mãn của các tên trùng nhau liền nhau. Cụ thể nếu giá trị của các tên tùng nhau liền nhau đó tăng dần từ nhỏ đến lớn theo chiều từ trên xuống dưới thì giá trị lấy hiện không đúng dòng tương ứng của nó (giảm dần thì đúng). Bạn có thể chỉnh lại công thức không hay là phải dùng VBA. Cảm ơn bạn.
 

File đính kèm

Lần chỉnh sửa cuối:
Cảm ơn phuocam. Công thức này cho kết quả đúng trong các tình huống của mình rồi.
Nhưng có vấn đề về vị trí hiện giá trí thỏa mãn của các tên trùng nhau liền nhau. Cụ thể nếu giá trị của các tên tùng nhau liền nhau đó tăng dần từ nhỏ đến lớn theo chiều từ trên xuống dưới thì giá trị lấy hiện không đúng dòng tương ứng của nó (giảm dần thì đúng). Bạn có thể chỉnh lại công thức không hay là phải dùng VBA. Cảm ơn bạn.
Thay thử công thức này:
=IF((SUMPRODUCT(($B$4:B4=B4)*($C$4:C4=C4)) =1)*(MAX(IF($B$4:$B$13=B4,$C$4:$C$13,""))=C4),C4,"")
Kết thúc bằng Ctrl +Shift+Enter
 
Cảm ơn phuocam. Công thức này cho kết quả đúng trong các tình huống của mình rồi.
Nhưng có vấn đề về vị trí hiện giá trí thỏa mãn của các tên trùng nhau liền nhau. Cụ thể nếu giá trị của các tên tùng nhau liền nhau đó tăng dần từ nhỏ đến lớn theo chiều từ trên xuống dưới thì giá trị lấy hiện không đúng dòng tương ứng của nó (giảm dần thì đúng). Bạn có thể chỉnh lại công thức không hay là phải dùng VBA. Cảm ơn bạn.

nếu 2010 có thể xài countifs
Mã:
D4=IF(AND(COUNTIFS($B$4:$B4,B4,$C$4:$C4,C4)=1,MAX(IF($B$4:$B$13=B4,$C$4:$C$13))=C4),C4,"")

Ctrl shift enter
 
Cảm ơn các bạn đã giúp đỡ mình.
 
Web KT

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

Back
Top Bottom