Em sửa rồi ạ, anh giúp em với
Có ngừoi giúp rồi (bài #4). Khoẻ.
Tuy nhiên, thể thoe yêu cầu, tôi khuyến mãi hàm UDF.
Dữ liệu bạn sắp xếp như thế rất khó cho công thức.
Tuy rằng tôi tin ở đây có nhiều bạn viết công thức khủng giải quyết mọi vấn đề. Nhưng đó không phải là giải pháp lâu dài. Công thức khủng rất khó hiểu và khó chỉnh sửa.
Nếu file bạn chịu thêm vài cột nữa, những cột này sẽ tính số lương theo từng giai đoạn. Và cuối cùng là cột tổng thì công thức tương đối dễ và mạch lạc. Bảng tính dễ hiểu.
Nếu bạn không muốn thêm cột thì tôi chỉ có thể giúp hàm UDF tính thẳng. Đây là giải thuật căn bản cho con tính theo bậc.
Function LuongTrongKhoang(ByVal Luong As Double, ByVal KhoangBD As Lo, ByVal As KhoangKT As Integer, ByVal ThangBD As Integer, ByVal ThangKT As Integer) As Double
' hàm tính lương trả trong khoảng tháng làm việc
' Luong: bậc lương cho khoảng tháng
' KhoangBD, KhoangKT: tháng bắt đầu và kết thúc của khoảng, dạng yyyymm (không phải date)
' ThangBD, ThangKT: tháng bắt đầu và kết thúc của công nhân, dạng yyyymm (không phải date)
' hàm chỉ tính số lương được lãnh theo khoảng. Để tính được tổng lương thì gọi hàm này, và tổng từng khoảng
If ThangBD > KhoangKT OR ThangKT < KhoangBD Then Exit Function ' không có lương trong khoảng này
If ThangBD < KhoangBD Then ThangBD = KhoangBD
If ThangKT > KhoangKT Then ThangKT = KhoangKT
LuongTrongKhoang = Luong * (((ThangKT \ 100) * 12 + (ThangKT Mod 100)) - ((ThangBD \ 100) * 12 + (ThangBD Mod 100)) + 1)
End Function
Function TongLuong(ByVal ThangBD As Date, ByVal ThangKT As Date) As Double
' hàm tính tổng lương theo từng bậc lương tháng
' ThangBD, ThangKT: tháng bắt đầu và kết thúc của công nhân, dạng date
' trong hàm có hardcode sẵn array diễn tả bậc lương
' Nếu bậc lương hay thay đổi thì phải thêm code đọc bậc lương từ sheet
Dim a1, a2
Dim tBD As Integer, tKT As Integer, i As Integer
' note: since a1 represents boundaries and a2 intervals, a1 is one longer than a2
a1 = Array( 201307, 201605, 201707, 201807, 201907, 201912, 203012 )
a2 = Array( 1150000, 1210000, 1300000, 1390000, 1490000, 0 )
For i = LBound(a2) To UBound(a2)
TongLuong = TongLuong + LuongTrongKhoang( a2(i), a1(i), a1(i+1)-1, Val(Format(ThangBD, "yyyymm")), Val(Format(ThangKT, "yyyymm")) )
Next i
End Function