=SUMPRODUCT(($B$3:$B$13=N3)*($C$3:$C$13=O3)*($D$3:$D$13))+SUMPRODUCT(($H$3:$H$13=N3)*($I$3:$I$13=O3)*($J$3:$J$13))
=SUMPRODUCT(($B$3:$B$13&$C$3:$C$13=N3&O3)*($D$3:$D$13))+SUMPRODUCT(($H$3:$H$13&$I$3:$I$13=N3&O3)*($J$3:$J$13))
Sub TinhTong()
Dim i As Long, ii As Long, iii As Long
Dim Tong As Long
Dim iTem As String, Loai As String
For i = 3 To WorksheetFunction.CountA(Range("N:N")) + 1
iTem = Range("N" & i)
Loai = Range("O" & i)
Tong = 0
For ii = 3 To WorksheetFunction.CountA(Range("B:B")) + 1
If Range("B" & ii) = iTem And Range("C" & ii) = Loai Then Tong = Tong + Range("D" & ii)
Next ii
For iii = 3 To WorksheetFunction.CountA(Range("H:H")) + 1
If Range("H" & iii) = iTem And Range("I" & iii) = Loai Then Tong = Tong + Range("J" & iii)
Next iii
Range("P" & i) = Tong
Next i
End Sub
Mình đã Test lại nhưng vẫn cho kết quả như ý.Duong_VBA đã viết:Cảm ơn tedaynui !
Code trên cộng không đúng và điều quan trọng là khi nhập thêm thì nó không cập nhật, mình muốn nó phải cập nhật thêm và tính lại tổng sau khi cập nhật!
Thank!
Sub TinhTong()
Dim i As Long, ii As Long, iii As Long
Dim Tong As Long
Dim iTem As String, Loai As String
For i = 3 To WorksheetFunction.CountA(Range("N:N")) + 1
iTem = Range("N" & i)
Loai = Range("O" & i)
Tong = 0
For ii = 3 To WorksheetFunction.CountA(Range("B:B")) + 1
If Range("B" & ii) = iTem And Range("C" & ii) = Loai Then Tong = Tong + [COLOR=Red]Range("D" & i)[/COLOR]
Next ii
For iii = 3 To WorksheetFunction.CountA(Range("H:H")) + 1
If Range("H" & iii) = iTem And Range("I" & iii) = Loai Then Tong = Tong + [COLOR=Red]Range("J" & i)[/COLOR]
Next iii
Range("P" & i) = Tong
Next i
End Sub
Cách nữa để các bạn tham khảo:To Duong_VBA: Để cập nhật, bạn có thể tạo một button trên sheet1, để macro trong module, rồi assign macro này vào button đó, mỗi lần thay đổi dữ liệu chỉ cần click vào button này là được.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rng As Range
Set Rng = Union(Range("D3:D" & Range("D65432").End(xlUp).Row + 1), _
Range("J3:J" & Range("J65432").End(xlUp).Row + 1))
If Not Intersect(Target, Rng) Is Nothing Then
TinhTong
End If
End Sub
Cách này có một điểm không hay là đôi khi nó tự thay đổi mà mình không biết, nhất là đối với những người sử dụng thuần túy. Nói chung là em thích dùng cách của em hơn, khi chắc chắn về việc thay đổi thì click...SA_DQ đã viết:Theo cách này, hễ chúng ta đụng vô 2 cột chứa dữ liệu 'D' & 'J' thì macro TinhTong của TDN sẽ cập nhật cho bạn lại các tổng;
Dạ, em cũng tính dùng Ucase nhưng thấy trong file của tác giả hình như có phân biệt chữ bông và chữ thường nên thôi. Hi hiSA_DQ đã viết:To TDN: Theo mình nên dùng hàm Ucase() nhằm khắc phục tình trạng người nhập có thể lẫn chữ thường trong chữ bông!
Thân ái!!
Mình theo hướng dẫn của các Bác sao nó không chay. Nhờ các Bác sửa giúp (mở file đính kèm)SA_DQ đã viết:Cách nữa để các bạn tham khảo:Theo cách này, hễ chúng ta đụng vô 2 cột chứa dữ liệu 'D' & 'J' thì macro TinhTong của TDN sẽ cập nhật cho bạn lại các tổng;PHP:Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range Set Rng = Union(Range("D3:D" & Range("D65432").End(xlUp).Row + 1), _ Range("J3:J" & Range("J65432").End(xlUp).Row + 1)) If Not Intersect(Target, Rng) Is Nothing Then TinhTong End If End Sub
![]()
To TDN: Theo mình nên dùng hàm Ucase() nhằm khắc phục tình trạng người nhập có thể lẫn chữ thường trong chữ bông! Thân ái!!
Duong gia đã viết:Mình theo hướng dẫn của các Bác sao nó không chay. Nhờ các Bác sửa giúp (mở file đính kèm)
File của bạn không chạy vì ITEM ở cột N và Loại ở cột O chưa có dữ liệu.Duong gia đã viết:Mình theo hướng dẫn của các Bác sao nó không chay. Nhờ các Bác sửa giúp (mở file đính kèm)
Option Explicit: Option Base 1
Sub CopyAndSum()
Dim Rng As Range, lRow As Long
1
Range(Cells(1, 24), Cells(Cells(65432, 26).End(xlUp).Row, 26)).ClearContents
2
Set Rng = Range(Cells(2, 2), Cells(Cells(65432, 4).End(xlUp).Row, 4))
Rng.Copy Destination:=Cells(1, 24)
5
Set Rng = Range(Cells(3, 8), Cells(Cells(65432, 10).End(xlUp).Row + 1, 10))
Rng.Copy Destination:=Cells(Cells(65432, 24).End(xlUp).Row + 1, 24)
7
Set Rng = Range(Cells(1, 24), Cells(Cells(65432, 26).End(xlUp).Row, 26))
Rng.Select
Selection.Sort Key1:=Range("X2"), Order1:=xlAscending, Key2:=Range("Y2") _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _
:=xlSortNormal
lRow = Cells(Cells(65432, 24).End(xlUp).Row, 24).Row
ReDim Mang(lRow, 3): Dim lDem As Long, iJ As Long
For iJ = 2 To lRow
With Cells(iJ, 24)
If iJ = 2 Then
lDem = 1: Mang(lDem, 1) = .Value
Mang(lDem, 2) = .Offset(, 1): Mang(lDem, 3) = .Offset(, 2)
Else
If (.Value = Mang(lDem, 1) And .Offset(, 1) <> Mang(lDem, 2)) Or _
.Value <> Mang(lDem, 1) Then
lDem = 1 + lDem: Mang(lDem, 1) = .Value
Mang(lDem, 2) = .Offset(, 1): Mang(lDem, 3) = .Offset(, 2)
ElseIf .Value = Mang(lDem, 1) And .Offset(, 1) = Mang(lDem, 2) Then '*!*'
Mang(lDem, 3) = Mang(lDem, 3) + .Offset(, 2)
End If
End If
End With
Next iJ
For iJ = 1 To lDem
With Cells(iJ + 2, 14)
.Value = Mang(iJ, 1): .Offset(, -1) = iJ
.Offset(, 1) = Mang(iJ, 2): .Offset(, 2) = Mang(iJ, 3)
End With
Next iJ
Range(Cells(1, 24), Cells(Cells(65432, 26).End(xlUp).Row, 26)).ClearContents
End Sub