



=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
	

Duong_VBA đã viết:Một lần nữa cảm ơn thầy!
Hỏi thầy nốt phát này thôi, thầy giúp nhé (Em nghĩ chắc dễ, nhưng em thử sửa code mà chưa ổn)
Bây giờ chỉ cần 1 bảng thôi (Bảng 1 chẳng hạn-Bỏ bảng 2 đi) thì code sẽ rút lại như thế nào.
Thank!




Lý ra người ta đi từ dễ đến khó... làm bài toán lọc trong 1 bảng trước, sau đó mới phát triển ra thành nhiều bảng... Bạn lại đi làm ngược lại: Từ khó trở về dễ nên nhìn vào code thấy mù trời và ko sửa dc theo ý là điều đương nhiên rồiDuong_VBA đã viết:Một lần nữa cảm ơn thầy!
Hỏi thầy nốt phát này thôi, thầy giúp nhé (Em nghĩ chắc dễ, nhưng em thử sửa code mà chưa ổn)
Bây giờ chỉ cần 1 bảng thôi (Bảng 1 chẳng hạn-Bỏ bảng 2 đi) thì code sẽ rút lại như thế nào.
Thank!
From TuanLichViet:
Tôi cẢM ơn bài viêt này