Code sắp lịch trực bị lỗi trùng 1 ngày trực 2 ka (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Excel365

Thành viên tích cực
Tham gia
29/10/10
Bài viết
865
Được thích
127
Giới tính
Nam
Em có thử làm đoạn code chia ka (sheet Code),
Cột A = Ngày
Từ cột B:D = Ka 1
Từ cột E:G = Ka 2
Từ cột H:J = Ka 3

-Các số trong đó là tên của nhân viên trực 10 người (từ số 1, 2, …10)
-Ds có 10 người, chia làm 3 ka trực, mỗi ka 3 người.
-1 người trực liên tục 6 ngày thì được nghỉ 1 ngày, nhưng đến ngày thứ 5 thì lại có trường hợp 1 ngày lại có 2 người trực 2 ka (K1-K3)
nay nhờ các anh chị xem và giúp em chỉnh sữa lại giúp em,
1- Gán danh sách tên cụ thể từ 1 vùng nào đó ( VD: danh sách tên người trực ở Vùng A1:A10, danh sách này luôn thay đổi, có thể nhiều hoặc ít hơn 10 người). Số ngày trong tháng thay đổi tùy theo tháng
2- Chuyển sang dạng trình bày như ở trên (vùng tô màu)
3-Không cho 1 người trực 2 ka trong 1 ngày'
Trân trọng
Link
P/s: em đã điều chỉnh link. Rất mong được sự giúp đỡ của các anh chị
 
Lần chỉnh sửa cuối:
Giải thích lại tí
K11 là ca thứ 1, người 1
K12 vẫn trong ca thứ 1 nhưng là người thứ 2
K13 vẫn trong ca thứ 1 nhưng là người thứ 3

Tức là mỗi cột là 1 ngày, hai ký tự đầu là thứ tự ca trực, ký tự sau cùng là thứ tự người trong danh sách
Ví dụ có 3 người ca 1 tên A,B,C
=>
K11=ca thứ 1, người A
K12= ca thứ 1, người B
K13= ca thứ 1, người C

Đưa thêm chỉ số để gặp ngày 1 người trực 2 thì ca luân chuyển cho dễ và lọc tên theo danh sách cũng dễ hơn.
Dạ, nhưng danh sách của em có tới 10 người (A, B, C, D, E, F, G, H, I, J) chia làm 3 ka trực.

P/s:
Vd:
K11 ....
K12
....
K13 ....
K24 ....
K25 ....
K26 ....
K37 ....
K38 ....
K39 ....
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu vậy Giả sử cho cho 1 người trực 2 ka / ngày, nhưng phải cách nhau 1 ka, liệu như vậy có đáp ứng được vấn đề 6 ngày liên tục thì nghỉ 1 ngày không anh. Nhưng trường hợp 1 người trực 2 ka/ngày thì hạn chế

Việc chia ca mà theo điều kiện này chăng nữa cũng vẫn không giải quyết được.
Mình tính toán lại trên cơ sở tháng 30 ngày để bạn thấy:

Nếu cứ 6 ngày+ 1 ngày nghỉ thì 1 vòng ca là 7 ngày ----> 1 tháng có 4,3 ngày nghỉ và 25,7 ngày trưc. Trong khi 1 tháng phải có số ca trực là 30 ngày x 25,7 ca /người = 257 ca trực. So với ca trực theo yêu cầu còn thiếu là:
270 ca - 257 ca = 13 ca.

Do số người không tăng nên buộc phải tính bài trực bổ xung (2 ca 1 ngày). Nhưng đã trực 2 ca 1 ngày thì số ca trực tăng lên và sẽ không bảo đảm việc nghỉ 4,3 ngày/tháng còn nếu nghỉ bù thì lại như cũ mà thôi. Vấn đề chính là 10 người trực đúng chế độ thì còn thiếu 13 ca chưa có người trực. Nếu không bổ xung người thì chỉ còn nước là trực tăng ca và thanh toán theo chế độ tăng ca tăng giờ mà thôi.
Việc tăng ca 2 ca/ngày mà cách 1 ca lại vướng phải ca tiếp theo ngày hôm sau vẫn thành 2 ca liền (Trừ phi ngày sau là ngày nghỉ ca). Hơn nữa việc bố trí tăng ca mà không liên tục là việc đại kỵ, giữa 2 ca về nhà xa cũng dở mà ở lại chờ ca thì lang thang không chỗ nghỉ và vô hình dung thành 4 ca liên tục không về nhà và nghỉ ngơi đúng nghĩa.

Vậy nên, tôi thấy nên để 9 ngày trực và 1 ngày nghỉ, đồng thời thanh toán 13 ca trực thêm giờ chia đều cho 10 người là gọn gàng, thêm giờ cũng đồng đều và không phát sinh trực 2 ca liên tục. Nếu theo yêu cầu của bạn thì 1 tháng có 7 người phải trực tăng thêm 1 ca và 3 người trực tăng thêm 2 ca phát sinh mâu thuẫn.
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ, nhưng danh sách của em có tới 10 người (A, B, C, D, E, F, G, H, I, J) chia làm 3 ka trực.

P/s:
Vd:
K11 ....
K12
....
K13 ....
K24 ....
K25 ....
K26 ....
K37 ....
K38 ....
K39 ....

Ca 1
K11 A
K12
B
K13 C

Ca 2
K21 D
K22 E
K23 F

Ca 3
K31 G
K32 H
K33 I

Ng
ười J nghỉ

Trong 1 ngày, các chỉ số cuối chỉ có từ 1 đến 3, đây là thứ tự người trong danh sách trực trong ngày. Không có 4 - 9
Các chỉ số đầu ( K1 - K3 ) cũng chỉ 1 - 3 là tên ca trực

---
Phân chia thế này cũng là ép, có lẽ phải tính thêm giờ nghỉ theo bài 22 của sealand.
Tính thêm giờ nghỉ sợ là sẽ bị rối.

---
Việc phân chia theo ý tưởng này của bạn có lẽ vẫn còn thiếu liên kết giữa các ngày với nhau
 
Upvote 0
Việc chia ca mà theo điều kiện này chăng nữa cũng vẫn không giải quyết được.
Mình tính toán lại trên cơ sở tháng 30 ngày để bạn thấy:

Nếu cứ 6 ngày+ 1 ngày nghỉ thì 1 vòng ca là 7 ngày ----> 1 tháng có 4,3 ngày nghỉ và 25,7 ngày trưc. Trong khi 1 tháng phải có số ca trực là 30 ngày x 25,7 ca /người = 257 ca trực. So với ca trực theo yêu cầu còn thiếu là:
270 ca - 257 ca = 13 ca.

Do số người không tăng nên buộc phải tính bài trực bổ xung (2 ca 1 ngày). Nhưng đã trực 2 ca 1 ngày thì số ca trực tăng lên và sẽ không bảo đảm việc nghỉ 4,3 ngày/tháng còn nếu nghỉ bù thì lại như cũ mà thôi. Vấn đề chính là 10 người trực đúng chế độ thì còn thiếu 13 ca chưa có người trực. Nếu không bổ xung người thì chỉ còn nước là trực tăng ca và thanh toán theo chế độ tăng ca tăng giờ mà thôi.
Việc tăng ca 2 ca/ngày mà cách 1 ca lại vướng phải ca tiếp theo ngày hôm sau vẫn thành 2 ca liền (Trừ phi ngày sau là ngày nghỉ ca). Hơn nữa việc bố trí tăng ca mà không liên tục là việc đại kỵ, giữa 2 ca về nhà xa cũng dở mà ở lại chờ ca thì lang thang không chỗ nghỉ và vô hình dung thành 4 ca liên tục không về nhà và nghỉ ngơi đúng nghĩa.

Vậy nên, tôi thấy nên để 9 ngày trực và 1 ngày nghỉ, đồng thời thanh toán 13 ca trực thêm giờ chia đều cho 10 người là gọn gàng, thêm giờ cũng đồng đều và không phát sinh trực 2 ca liên tục. Nếu theo yêu cầu của bạn thì 1 tháng có 7 người phải trực tăng thêm 1 ca và 3 người trực tăng thêm 2 ca phát sinh mâu thuẫn.
Thật sự thì đó là suy nghĩ chia ka của em,
Vậy nay nhờ các anh chị giúp em chia ka lại sao cho nó hợp lý hơn, mà vẫn đảm bảo đúng theo luật Lao động.
Trân trọng cảm ơn
 
Upvote 0
Ca 1
K11 A
K12
B
K13 C

Ca 2
K21 D
K22 E
K23 F

Ca 3
K31 G
K32 H
K33 I

Ng
ười J nghỉ

Trong 1 ngày, các chỉ số cuối chỉ có từ 1 đến 3, đây là thứ tự người trong danh sách trực trong ngày. Không có 4 - 9
Các chỉ số đầu ( K1 - K3 ) cũng chỉ 1 - 3 là tên ca trực

---
Phân chia thế này cũng là ép, có lẽ phải tính thêm giờ nghỉ theo bài 22 của sealand.
Tính thêm giờ nghỉ sợ là sẽ bị rối.

---
Việc phân chia theo ý tưởng này của bạn có lẽ vẫn còn thiếu liên kết giữa các ngày với nhau
Nếu đó là số thứ tự trong danh sách, vậy mình có thể đổi thành tên A, B, C, ... cho dễ xem hơn được không anh

P/s:
Nếu đúng yêu cầu, có thể dùng index() điền tên nhân viên vào bảng.
Cái này mình làm như thế nào vậy anh
 
Lần chỉnh sửa cuối:
Upvote 0
Thật sự thì đó là suy nghĩ chia ka của em,
Vậy nay nhờ các anh chị giúp em chia ka lại sao cho nó hợp lý hơn, mà vẫn đảm bảo đúng theo luật Lao động.
Trân trọng cảm ơn

Bạn nói vậy thì mình tham gia như sau:

-Giữ vòng ca 10 ngày, sau 9 ca trực nghỉ trực 1 ngày.
-Mỗi tháng ngoài lương chính mỗi người được thanh toán bổ xung 1,3 ca tiền lương tăng ca.

Bạn chỉ cần chọn thông số phù hợp là có bảng phân ca đầy đủ

Mã:
Option Explicit
Sub ChiaCa()
Dim Ngay, Nguoi, Nghi, Kq(), Kq1(), EndD, i, j
ReDim Kq(1 To 31, 1 To 10)
ReDim Kq1(1 To 10, 1 To 31)
If Sheet1.[O4] = 12 Then
EndD = 31
Else
EndD = Day(DateSerial(Sheet1.[O3], Sheet1.[O4] + 1, 0))
End If
Nghi = Sheet1.[O5]
Sheet3.[A1] = DateSerial(Sheet1.[O3], Sheet1.[O4], 1)
For Ngay = 1 To EndD
Kq(Ngay, 1) = Ngay
For i = 2 To 10
Nguoi = (Nghi + Ngay + i - 2) Mod 10
If Nguoi = 0 Then Nguoi = 10
Kq(Ngay, i) = Nguoi
Kq1(Nguoi, Ngay) = "K" & IIf(i < 5, 1, IIf(i < 8, 2, 3))
Next
Next
Sheet1.[A3].Resize(31, 10) = Kq
Sheet3.[B4].Resize(10, 31) = Kq1
Color
End Sub
'------------------------------------------
Sub Color() 
'Chi to mau
Dim Cl As Range, M1, M2
With Sheet3.[B4:AF13]
    .Interior.ColorIndex = xlNone
    .Font.ColorIndex = 0
    For Each Cl In .Cells
    If Cl = "K1" Then
    Cl.Interior.ColorIndex = 6
    Cl.Font.ColorIndex = 3
    ElseIf Cl = "K2" Then
    Cl.Interior.ColorIndex = 11
    Cl.Font.ColorIndex = 2
    ElseIf Cl = "K3" Then
    Cl.Interior.ColorIndex = 3
    Cl.Font.ColorIndex = 6
End If
Next
End With
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bạn nói vậy thì mình tham gia như sau:

-Giữ vòng ca 10 ngày, sau 9 ca trực nghỉ trực 1 ngày.
-Mỗi tháng ngoài lương chính mỗi người được thanh toán bổ xung 1,3 ca tiền lương tăng ca.

Bạn chỉ cần chọn thông số phù hợp là có bảng phân ca đầy đủ

Mã:
Option Explicit
Sub ChiaCa()
Dim Ngay, Nguoi, Nghi, Kq(), Kq1(), EndD, i, j
ReDim Kq(1 To 31, 1 To 10)
ReDim Kq1(1 To 10, 1 To 31)
If Sheet1.[O4] = 12 Then
EndD = 31
Else
EndD = Day(DateSerial(Sheet1.[O3], Sheet1.[O4] + 1, 0))
End If
Nghi = Sheet1.[O5]
Sheet3.[A1] = DateSerial(Sheet1.[O3], Sheet1.[O4], 1)
For Ngay = 1 To EndD
Kq(Ngay, 1) = Ngay
For i = 2 To 10
Nguoi = (Nghi + Ngay + i - 2) Mod 10
If Nguoi = 0 Then Nguoi = 10
Kq(Ngay, i) = Nguoi
Kq1(Nguoi, Ngay) = "K" & IIf(i < 5, 1, IIf(i < 8, 2, 3))
Next
Next
Sheet1.[A3].Resize(31, 10) = Kq
Sheet3.[B4].Resize(10, 31) = Kq1
Color
End Sub
'------------------------------------------
Sub Color() 
'Chi to mau
Dim Cl As Range, M1, M2
With Sheet3.[B4:AF13]
    .Interior.ColorIndex = xlNone
    .Font.ColorIndex = 0
    For Each Cl In .Cells
    If Cl = "K1" Then
    Cl.Interior.ColorIndex = 6
    Cl.Font.ColorIndex = 3
    ElseIf Cl = "K2" Then
    Cl.Interior.ColorIndex = 11
    Cl.Font.ColorIndex = 2
    ElseIf Cl = "K3" Then
    Cl.Interior.ColorIndex = 3
    Cl.Font.ColorIndex = 6
End If
Next
End With
End Sub
Cám ơn anh sealand, và tất cả các anh chị trên GPE nhiều
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom