I14=SUM(($B$11:$B$19=$H$3)*($C$11:$C$19=$H14)*($D$11:$D$19))*I$3+SUM(($B$11:$B$19=$H$4)*($C$11:$C$19=$H14)*($D$11:$D$19))*I$4+SUM(($B$11:$B$19=$H$5)*($C$11:$C$19=$H14)*($D$11:$D$19))*I$5
Dùng tạm UDF nhé.Nhờ mọi người giúp tạo công thức để tính tổng theo điều kiện trong file đính kèm ( Có thể viết macro cũng được). Xin cảm ơn trước.
Function TongNguyenLieu(TriDo, BangNguyenLieu As Range, BangKhoiLuong As Range)
Dim Rng As Range, MyAdd As String
Set Rng = BangNguyenLieu.Offset(, 1).Resize(, 1).Find(What:=TriDo, LookAt:=xlWhole)
If Not Rng Is Nothing Then
MyAdd = Rng.Address
Do
TongNguyenLieu = TongNguyenLieu + Rng.Offset(, 1) * Application.WorksheetFunction.VLookup(Rng.Offset(, -1), BangKhoiLuong, BangKhoiLuong.Columns.Count, 0)
Set Rng = BangNguyenLieu.Offset(, 1).Resize(, 1).Find(What:=TriDo, After:=Rng, LookAt:=xlWhole)
Loop While Rng.Address <> MyAdd
End If
End Function
Nhờ mọi người giúp tạo công thức để tính tổng theo điều kiện trong file đính kèm ( Có thể viết macro cũng được). Xin cảm ơn trước.
Dùng tạm UDF nhé.
PHP:Function TongNguyenLieu(TriDo, BangNguyenLieu As Range, BangKhoiLuong As Range) Dim Rng As Range, MyAdd As String Set Rng = BangNguyenLieu.Offset(, 1).Resize(, 1).Find(What:=TriDo, LookAt:=xlWhole) If Not Rng Is Nothing Then MyAdd = Rng.Address Do TongNguyenLieu = TongNguyenLieu + Rng.Offset(, 1) * Application.WorksheetFunction.VLookup(Rng.Offset(, -1), BangKhoiLuong, BangKhoiLuong.Columns.Count, 0) Set Rng = BangNguyenLieu.Offset(, 1).Resize(, 1).Find(What:=TriDo, After:=Rng, LookAt:=xlWhole) Loop While Rng.Address <> MyAdd End If End Function
Không cần sửa Code đâu bạn. Bạn chỉ cần mở rộng vùng tham chiếu trong công thức và tuân thủ một số nguyên tắc sau khi sử dụng công thức:Nếu mở rộng vùng nguyên liệu và sản phẩm thì sửa lại UDF nhừ nào bác, chắc thực tế sẽ còn nhiều hơn 3 loại sản phẩm?
@HuuThang: Cho m hỏi một chút: Tại sao khi ta thay đổi tên sản phẩm C thành D chẳn hạn trong bảng kế hoạch sản xuất mà trong bảng nguyên liệu không có (hoặc có tên). Tại sao vẫn thống kê có số lượng tại chiều dày =25....
Nguyên liệu có Dày 25 là nguyên liệu của SP B. Thay đổi tên sản phẩm C thì có gì liên quan?@HuuThang: Cho m hỏi một chút: Tại sao khi ta thay đổi tên sản phẩm C thành D chẳn hạn trong bảng kế hoạch sản xuất mà trong bảng nguyên liệu không có (hoặc có tên). Tại sao vẫn thống kê có số lượng tại chiều dày =25....
Đúng có lẽ công thức này vẫn chưa hoàn chỉnh mong nhờ bạn HuuThang xem lại giúp. Nếu mở rộng vùng nguyên liệu thì số không hiển thị được và nếu thay đổi tên sản phẩm trong bảng kế hoạch thì vẫn tính toán và báo lỗi.
Function TongNguyenLieu(TriDo, BangNguyenLieu As Range, BangKhoiLuong As Range)
Dim Rng As Range, MyAdd As String
Set Rng = BangNguyenLieu.Offset(, 1).Resize(, 1).Find(What:=TriDo, LookAt:=xlWhole)
If Not Rng Is Nothing Then
MyAdd = Rng.Address
Do
If Application.WorksheetFunction.CountIf(BangKhoiLuong.Resize(, 1), Rng.Offset(, -1)) > 0 Then
TongNguyenLieu = TongNguyenLieu + Rng.Offset(, 1) * Application.WorksheetFunction.VLookup(Rng.Offset(, -1), BangKhoiLuong, BangKhoiLuong.Columns.Count, 0)
End If
Set Rng = BangNguyenLieu.Offset(, 1).Resize(, 1).Find(What:=TriDo, After:=Rng, LookAt:=xlWhole)
Loop While Rng.Address <> MyAdd
End If
End Function
Mình đã test kỹ rồi, UDF của Huuthang_bd rất ổnĐúng có lẽ công thức này vẫn chưa hoàn chỉnh mong nhờ bạn HuuThang xem lại giúp. Nếu mở rộng vùng nguyên liệu thì số không hiển thị được và nếu thay đổi tên sản phẩm trong bảng kế hoạch thì vẫn tính toán và báo lỗi.
Mình đã test kỹ rồi, UDF của Huuthang_bd rất ổn
Chắc mọi người đang xét trường hợp sản phẩm không có trong bảng kế hoạch nhưng có trong bảng tiêu hao nguyên vật liệu. Trường hợp này cũng có thể xảy ra do bảng định mức tiêu hao nguyên vật liệu là chung cho toàn bộ sản phẩm, còn bảng kế hoạch thì cần sản phẩm nào mới làm sản phẩm đó. Tôi đã khắc phục ở bài #10.Mình đã test kỹ rồi, UDF của Huuthang_bd rất ổn
Bạn xem lại đoạn tôi lưu ý ở bài #6 nhé:Nhờ anh làm hộ giúp file nếu chèn thêm cột tại bảng định mức nguyên liệu thử.
- BangNguyenLieu là bảng có: Cột 1 là cột Tên sản phẩm, Cột 2 là cột Dày, Cột 3 là cột KL
- BangKhoiLuong là bảng có cột đầu tiên là cột Tên sản phẩm, cột cuối cùng là cột khối lượng muốn tính.
Sửa lại như thế này cho linh hoạt.Nếu làm được linh hoạt hơn thì tốt quá, cảm phiền bạn. Còn khi thay đổi thì mình vẫn thấy chưa được, nhờ bạn xem trong file
Function TongNguyenLieu(TriDo, BangNguyenLieu As Range, DayRow As Integer, KLRow As Integer, BangKhoiLuong As Range)
Dim Rng As Range, MyAdd As String
Set Rng = BangNguyenLieu.Offset(, DayRow - 1).Resize(, 1).Find(What:=TriDo, LookAt:=xlWhole)
If Not Rng Is Nothing Then
MyAdd = Rng.Address
Do
If Application.WorksheetFunction.CountIf(BangKhoiLuong.Resize(, 1), Rng.Offset(, 1 - DayRow)) > 0 Then
TongNguyenLieu = TongNguyenLieu + Rng.Offset(, KLRow - DayRow) * Application.WorksheetFunction.VLookup(Rng.Offset(, 1 - DayRow), BangKhoiLuong, BangKhoiLuong.Columns.Count, 0)
End If
Set Rng = BangNguyenLieu.Offset(, DayRow - 1).Resize(, 1).Find(What:=TriDo, After:=Rng, LookAt:=xlWhole)
Loop While Rng.Address <> MyAdd
End If
End Function
=TongNguyenLieu(LoaiNguyenLieu,BangDoDinhMuc,STT_CotLoaiNguyenLieu_TrongBangDinhMuc,STT_CotKhoiLuong_TrongBangDinhMuc,BangKeHoachSanXuat)
Nếu vậy cần phải thêm tham số:Nhờ mọi người giúp tiếp. Nếu như mình thêm một điều kiện nữa thì phải sửa như thế nào. Xem trong file đính kèm.
Function TongNguyenLieu(TriDo, LoaiNguyenLieu As String, BangNguyenLieu As Range, DayCol As Byte, LoaiNLCol As Byte, KLCol As Byte, BangKhoiLuong As Range)
Dim Rng As Range, MyAdd As String
Set Rng = BangNguyenLieu.Offset(, DayCol - 1).Resize(, 1).Find(What:=TriDo, LookAt:=xlWhole)
If Not Rng Is Nothing Then
MyAdd = Rng.Address
Do
If Application.WorksheetFunction.CountIf(BangKhoiLuong.Resize(, 1), Rng.Offset(, 1 - DayCol)) > 0 Then
TongNguyenLieu = TongNguyenLieu + IIf(Rng.Offset(, LoaiNLCol - DayCol).Value = LoaiNguyenLieu, Rng.Offset(, KLCol - DayCol) * Application.WorksheetFunction.VLookup(Rng.Offset(, 1 - DayCol), BangKhoiLuong, BangKhoiLuong.Columns.Count, 0), 0)
End If
Set Rng = BangNguyenLieu.Offset(, DayCol - 1).Resize(, 1).Find(What:=TriDo, After:=Rng, LookAt:=xlWhole)
Loop While Rng.Address <> MyAdd
End If
End Function
=TongNguyenLieu(QuiCach,LoaiNguyenLieu,BangDinhMuc,Cot_QuyCach,Cot_LoaiNguyenLieu,Cot_SoLuong,BangKHSX)