Tính thời gian phép

Liên hệ QC

doanhhoang79

Thành viên hoạt động
Tham gia
31/3/08
Bài viết
142
Được thích
18
Kg các anh chị trong diễn đàn,

Trên cơ sở cách tính thời gian phép của anh Boyxin, tôi muốn mở rộng tiêu chuẩn phép cho từng nhóm lao động, không quy định chung là 12 ngày/năm. Tôi xin phép được điều chỉnh lại nhưng chưa hoàn thành vì lỗi công thức. Mong các anh chị giúp tôi hoàn thành nốt để tôi ứng dụng vào công việc thực tế của mình.
Tôi xin gửi file đính kèm

Xin cảm ơn
 

File đính kèm

  • Tinh ngay phep_boyxin.xls
    35 KB · Đọc: 52
Bạn kiểm thử hàm này xem sao:

PHP:
Option Explicit
Function NgayPhep(NgayCT As Date, Nghe As String)
 Dim FNghe As Byte, ThangF As Integer, CuoiNam As Date
 
 Nghe = UCase$(Nghe)
 FNghe = Switch(Nghe = "KH", 0, Nghe = "MC", 1, Nghe = "CH", 2, Nghe = "KD", 3, Nghe = "XT", 4, _
    Nghe = "TT", 5, Nghe = "LC", 6)
 
 If Day(NgayCT) > 15 Then ThangF = 1
 NgayCT = DateSerial(Year(NgayCT), Month(NgayCT) + ThangF, 1)
 CuoiNam = DateSerial(Year(Date), 12, 31)
 ThangF = Int((CuoiNam - NgayCT) / 304)
 NgayPhep = 12 + FNghe + Switch(ThangF < 6, 0, ThangF < 12, 1, ThangF < 18, 2, ThangF < 24, 3, _
    ThangF < 30, 4, ThangF < 36, 5, ThangF < 42, 6, ThangF < 48, 7, ThangF < 99, 8)
End Function
Ở đây mã nghề theo bảng sau:
A|B
Nghề |
Khác|KH
Móc cáp|MC
Cơ khí/Hàn|CH
KDNL|KD
Lái xe tải|XT
Tàu thuyền|TT
Lái cẩu|LC
:-= )(&&@@ |@!##
 
Chỉnh sửa lần cuối bởi điều hành viên:
Nếu dùng công thức thì mình góp chút cho vui:
Thay IF bởi LOOKUP và VLOOKUP
Xem File kèm theo!
 

File đính kèm

  • Tinh ngay phep_boyxin.xls
    36.5 KB · Đọc: 40
Cho em file ví dụ đính kèm đi
Cảm ơn,

Hàm hôm qua còn sai, & chưa tính đúng yêu cầu của bạn: Tính phép theo ngày cuối cùng trong năm hiện hành.
PHP:
Option Explicit
Function NgayPhep(NgayCT As Date, Nghe As String)
 Dim FNghe As Byte, ThangF As Integer, CuoiNam As Date
 
 Nghe = UCase$(Nghe)
 FNghe = Switch(Nghe = "KH", 0, Nghe = "MC", 1, Nghe = "CH", 2, Nghe = "KD", 3, Nghe = "XT", 4, _
    Nghe = "TT", 5, Nghe = "LC", 6)
 
 If Day(NgayCT) > 15 Then ThangF = 1
 NgayCT = DateSerial(Year(NgayCT), Month(NgayCT) + ThangF, 1)
 CuoiNam = DateSerial(Year(Date), 12, 31)
 ThangF = Int((CuoiNam - NgayCT) / 304)
 NgayPhep = 12 + FNghe + Switch(ThangF < 6, 0, ThangF < 12, 1, ThangF < 18, 2, ThangF < 24, 3, _
    ThangF < 30, 4, ThangF < 36, 5, ThangF < 42, 6, ThangF < 48, 7, ThangF < 99, 8)
End Function
Giải thích con số 304;
Mỗi năm có 365.25 ngày, vậy mỗi tháng có: 365.25 / 12 = 30.4375
Nếu ta cứ đem chia cho ~ 30.4 * 10 thì dòng lệnh phía dưới sẽ không phải viết các ký số '0' trong điều kiện của switch(); (Thay vì ThangF < 60 ta chỉ phải viết ThangF < 6)
 

File đính kèm

  • GPE.rar
    32.2 KB · Đọc: 34
Chỉnh sửa lần cuối bởi điều hành viên:
To HYen17: Đã thương thì thương cho "sức tàn, lực kiệt" - Nhờ bạn thay đổi code để khỏi thiệt cho người sử dụng lđộng trong 2 trường hợp như sau:
1- Người lao động phải có thời gian tham gia ít nhất 1 năm.
2- Tính phép cho lao động tham gia <1năm: số tháng tham gia công tác tại đơn vị
Còn mình thì dùng công thức theo file sau
 

File đính kèm

  • Tinh ngay phep_boyxin.xls
    57.5 KB · Đọc: 32
Lần chỉnh sửa cuối:
Cảm ơn các anh/chị,

Em đã kiểm tra tuy nhiên vẫn còn chưa chính xác VD:
Giả sử mốc thời gian để tính phép là 31/12/2008, nếu anh Nguyễn Văn A vào Cty từ ngày 17/02/2008 thì số ngày phép của anh A chỉ có 10 ngày thôi (không phải 12, 13,...ngày).
- Nếu theo anh duchuynh103 thì khi anh A vào cty bất kỳ ngày nào cũng là 12, 13,..ngày.
- Nếu theo bạn HYen thì mốc thời gian 31/12/2008 không có tác dụng gì,...

Theo bài số 06 của anh duchuynh103 cũng chưa chính xác,
Nếu chưa đủ 01 năm thì tính thời gian phép theo tỷ lệ tương ứng chứ.

Mong các anh chị kiểm tra giúp????
 
Chỉnh sửa lần cuối bởi điều hành viên:
Đã thương thì thương cho "sức tàn, lực kiệt" - Nhờ bạn thay đổi code để khỏi thiệt cho người sử dụng lđộng trong 2 trường hợp như sau:
1- Người lao động phải có thời gian tham gia ít nhất 1 năm.
2- Tính phép cho lao động tham gia <1năm: số tháng tham gia công tác tại đơn vị
Còn mình thì dùng công thức theo file sau
Viết hàm để phục vụ lợi ích cho người lao động, vì tác gia topic không đả động gì đến ngày phép của những người vô công tác dưới 1 năm.
Để thực thi theo yêu cầu của bạn cũng không khó lắm.
Nhưng theo mình thì nên là, những người vô năm trước cần tính đủ 12 ngày phép cho người ta;
Chỉ những anh/chi vô từ đầu năm đến ngày hiện tại thì mỗi tháng 1 ngày phép, OK!
Tất cả hai chuyện này xoay quanh NgayCT mà ra thôi,
& cái quan trọng nhất ở đây, chỉ là quan điểm của người sử dụng lao động bủn xỉn hay rọng rãi, phải không!:-=
 
Lần chỉnh sửa cuối:
Mong anh lưu ý nhé

Không phải ai cũng là 12 ngày /năm
em đã phân ra theo nhóm lao động, mỗi nhóm có tiêu chuẩn nghỉ khác nhau đấy.
Nếu chi tính 12 ngày/năm thì em nghĩ công thức của bác Boyxin là ổn rồi
 
Theo bài số 06 của anh duchuynh103 cũng chưa chính xác,
Nếu chưa đủ 01 năm thì tính thời gian phép theo tỷ lệ tương ứng chứ.

Bạn xem lại file nghen, Do trong câu hỏi bạn khôngnêu yêu cầu đó (ở #9 của anh ChanhTQ@ cũng đã nói vậy mà) nhưng trong file mình đã ghi sẵn công thức cho bạn ở Ô H1 rồi mà.
 
Lần chỉnh sửa cuối:
Cảm ơn bác duchuynh103 nhé, Em thay dấu ";" thành dấu "," thì ok rồi. Bác có thể viết code VBA để ra được kq như vậy không?

Tiện thể em hỏi bác duchuynh103 luôn, bác có cách nào để cho công thức đó thành số "0" hoặc "để trống" thay vì lỗi NUM#.
Ví dụ: khi mình lấy mốc thời gian thấp hơn ngày vào làm chẳng hạn.

Cảm ơn bác,
 
Chỉnh sửa lần cuối bởi điều hành viên:
Tiện thể em hỏi bác duchuynh103 luôn, bác có cách nào để cho công thức đó thành số "0" hoặc "để trống" thay vì lỗi NUM#.
Ví dụ: khi mình lấy mốc thời gian thấp hơn ngày vào làm chẳng hạn.

Cảm ơn bác,
Bạn có thể dùng hàm bẫy lỗi kết hợp IF với cú pháp như sau:
=IF(ISERROR(Hàm);0;Hàm)
 
Em thử rồi không được bác ạ.
Bác xem file đính kèm nhé
 

File đính kèm

  • Tinh ngay phep_boyxin(3).xls
    42.5 KB · Đọc: 16
Hàm ứng cho file cuối của bạn đây (#16), kiểm tra lại nha

Bác có thể viết code VBA để ra được kq như vậy không?
PHP:
Option Explicit
Function NgayPhep(NgayCT As Date, Nghe As String, Optional Dat As Date) As Byte
 Dim FNghe As Byte, ThangF As Integer
 
 Nghe = UCase$(Nghe)
 FNghe = Choose(Asc(Nghe) - 64, 12, 14, 16)
 
 If Day(NgayCT) > 15 Then ThangF = 1
 NgayCT = DateSerial(Year(NgayCT), Month(NgayCT) + ThangF, 1)
 If Dat = 0 Then Dat = DateSerial(Year(Date), Month(Date), 31)
 ThangF = Int((Dat - NgayCT) / 304)
 
 NgayPhep = FNghe + Switch(ThangF < 6, 0, ThangF < 12, 1, ThangF < 18, 2, ThangF < 24, 3, _
    ThangF < 30, 4, ThangF < 36, 5, ThangF < 42, 6, ThangF < 48, 7, ThangF < 99, 8)
End Function
Cú pháp hàm xem thêm trong file đính kèm: =NGAYPHEP(F3,E3,G$1)
Trong đó F3: ngày vô công tác công ti;
E3: Mã nghề, có thể nhận 3 loại mã ứng với 3 loại ngày phép được hưởng theo nghề, đó là 'A', 'B' & 'C'
G$1: Tính số ngày phép đến ngày ghi trong ô này. Nếu ta không nhập vô biến Dat này, thì hàm sẽ tùy chọn ngày tận cùng của năm hiện hành & đem tính.
 

File đính kèm

  • GPE.rar
    13.2 KB · Đọc: 12
PHP:
Option Explicit
Function NgayPhep(NgayCT As Date, Nghe As String, Optional Dat As Date) As Byte
 Dim FNghe As Byte, ThangF As Integer
 
 Nghe = UCase$(Nghe)
 FNghe = Choose(Asc(Nghe) - 64, 12, 14, 16)
 
 If Day(NgayCT) > 15 Then ThangF = 1
 NgayCT = DateSerial(Year(NgayCT), Month(NgayCT) + ThangF, 1)
 If Dat = 0 Then Dat = DateSerial(Year(Date), Month(Date), 31)
 ThangF = Int((Dat - NgayCT) / 304)
 
 NgayPhep = FNghe + Switch(ThangF < 6, 0, ThangF < 12, 1, ThangF < 18, 2, ThangF < 24, 3, _
    ThangF < 30, 4, ThangF < 36, 5, ThangF < 42, 6, ThangF < 48, 7, ThangF < 99, 8)
End Function
Cú pháp hàm xem thêm trong file đính kèm: =NGAYPHEP(F3,E3,G$1)
Trong đó F3: ngày vô công tác công ti;
E3: Mã nghề, có thể nhận 3 loại mã ứng với 3 loại ngày phép được hưởng theo nghề, đó là 'A', 'B' & 'C'
G$1: Tính số ngày phép đến ngày ghi trong ô này. Nếu ta không nhập vô biến Dat này, thì hàm sẽ tùy chọn ngày tận cùng của năm hiện hành & đem tính.


Em cảm ơn bác, tuy nhiên đoạn code của bác không thể hiện những người dưới 12 tháng thì tính theo tỉ lệ số tháng làm việc thực tế.
 
Web KT
Back
Top Bottom