Giúp lập một bảng excel phân ca cho nhân viên làm việc trong tháng

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

triet4ever

Thành viên mới
Tham gia
3/1/22
Bài viết
3
Được thích
0
Lời nói đầu tiên xin cảm ơn mọi người, kế sau đó mình có một vấn đề hơi khó khăn nên cần mọi người giúp hướng để giải quyết. Mình xin cảm ơn trước.
Mình xin phép đi vào vấn đề như thế này
Hiện tại mình đang muốn sắp lịch làm việc cho 05 nhân viên (ở đây mình ví dụ là Nguyễn Văn A, Nguyễn Văn B, Nguyễn Văn C, Nguyễn Văn D, Nguyễn Văn E (gọi tắt là A,B,C,D,E)

Yêu cầu bài toán ở đây là
1. Mỗi ngày phải đáp ứng đủ 2 nhân viên làm việc. Ca1( Ca sáng) Từ 7:00 đến 16:00, Ca2 (Ca tối) Từ 15:30 đến 24:00 - Sẽ có một người off (làm suốt tuần từ thứ 2 đến chủ nhật không nghĩ ngày nào, cũng k nghĩ ngày lễ).
2. Đảm bảo rằng ít nhất trong 4 ngày thứ 7 và 4 ngày chủ nhật sẽ được chia đều cho cả 5 người ( sẽ có 3 người được nghĩ 2 ngày thứ 7, cn và có 2 người nghĩ 1 ngày thứ 7, 1 ngày chủ nhật). Ở đây không quá khắt khe là thứ 7 hay chủ nhật nên có thể xem thứ 7 chủ nhật như nhau. Yêu cầu hiên tại là 22 công trong 1 tháng ( có người sẽ 22 công, có người sẽ 21 công, tùy theo tháng.
3. Nếu một trong 5 người có yêu cầu được nghĩ 1 hoặc 2 ngày bất kì sẽ được sắp ưu tiên chọn, và những người còn lại sẽ chia ca làm để vẫn thỏa 1 ngày 4 người làm
Ví dụ: Ông A đầu tháng mong muốn đc nghĩ ngày 1,2 ông B yêu cầu nghĩ 25,27

Xin mọi người giúp góp ý và cho hướng để giải quyết
Xin cảm ơn và hậu tạ
Bài đã được tự động gộp:

Điền công 22 sẽ áp cho toàn bộ công là tháng đó là 22 công mỗi người (có thể 21 hoặc 23)
Điền tên người ưu tiên nghĩ, điền ngày nghĩ, sẽ sắp cho những người còn lại
Xin cảm ơn
 
Lần chỉnh sửa cuối:
Lời nói đầu tiên xin cảm ơn mọi người, kế sau đó mình có một vấn đề hơi khó khăn nên cần mọi người giúp hướng để giải quyết. Mình xin cảm ơn trước.
Mình xin phép đi vào vấn đề như thế này
Hiện tại mình đang muốn sắp lịch làm việc cho 05 nhân viên (ở đây mình ví dụ là Nguyễn Văn A, Nguyễn Văn B, Nguyễn Văn C, Nguyễn Văn D, Nguyễn Văn E (gọi tắt là A,B,C,D,E)

Yêu cầu bài toán ở đây là
1. Mỗi ngày phải đáp ứng đủ 2 nhân viên làm việc. Ca1( Ca sáng) Từ 7:00 đến 16:00, Ca2 (Ca tối) Từ 15:30 đến 24:00 - Sẽ có một người off (làm suốt tuần từ thứ 2 đến chủ nhật không nghĩ ngày nào, cũng k nghĩ ngày lễ).
2. Đảm bảo rằng ít nhất trong 4 ngày thứ 7 và 4 ngày chủ nhật sẽ được chia đều cho cả 5 người ( sẽ có 3 người được nghĩ 2 ngày thứ 7, cn và có 2 người nghĩ 1 ngày thứ 7, 1 ngày chủ nhật). Ở đây không quá khắt khe là thứ 7 hay chủ nhật nên có thể xem thứ 7 chủ nhật như nhau. Yêu cầu hiên tại là 22 công trong 1 tháng ( có người sẽ 22 công, có người sẽ 21 công, tùy theo tháng.
3. Nếu một trong 5 người có yêu cầu được nghĩ 1 hoặc 2 ngày bất kì sẽ được sắp ưu tiên chọn, và những người còn lại sẽ chia ca làm để vẫn thỏa 1 ngày 4 người làm
Ví dụ: Ông A đầu tháng mong muốn đc nghĩ ngày 1,2 ông B yêu cầu nghĩ 25,27

Xin mọi người giúp góp ý và cho hướng để giải quyết
Xin cảm ơn và hậu tạ
Bài đã được tự động gộp:

Điền công 22 sẽ áp cho toàn bộ công là tháng đó là 22 công mỗi người (có thể 21 hoặc 23)
Điền tên người ưu tiên nghĩ, điền ngày nghĩ, sẽ sắp cho những người còn lại
Xin cảm ơn
Đầu tuần, A làm ca ngày, khi nào chuyển làm ca đêm?
 
Đầu tuần, A làm ca ngày, khi nào chuyển làm ca đêm?
Cái này không quan trọng anh, ngày đêm đều được, tuy nhiên nếu như có option để có thể chọn người luôn muốn là sáng, và người luôn muốn làm tối
VD anh E vì đón con, nên có nguyện vọng luôn làm sáng, anh F vì bận việc nên luôn muốn làm chiều (dĩ nhiên có thể thay đổi nếu không sắp xếp được nhưng luôn mong muốn đc ưu tiên làm sáng (đối lập sẽ có anh luôn muốn làm tối).
 
:D mai mốt chắc nhờ anh @HieuCD làm giùm cái bảng chia ca quá.
Quán tôi có 8 đứa nhân viên, trước giờ tôi cứ ngồi chia ca (theo các tiêu chí gần như trên) thủ công theo tuần mất cả 15 phút...hehe.
Nói thêm là chia ca với các điều kiện trên không nhất thiết theo tháng mà theo tuần vì có khi 5, 6 tuần 1 điều kiện nào đó mới quay lại (vd: nghỉ 1 ngày trong tuần) tùy theo số nhân viên...
 
Cái này không quan trọng anh, ngày đêm đều được, tuy nhiên nếu như có option để có thể chọn người luôn muốn là sáng, và người luôn muốn làm tối
VD anh E vì đón con, nên có nguyện vọng luôn làm sáng, anh F vì bận việc nên luôn muốn làm chiều (dĩ nhiên có thể thay đổi nếu không sắp xếp được nhưng luôn mong muốn đc ưu tiên làm sáng (đối lập sẽ có anh luôn muốn làm tối).
Mình đang bận nên không tập trung viết code được, khi rảnh mình sẽ viết cho bạn
 
mình sẵn sàng chờ bạn giúp
Kiểm tra lại.
Bấm biểu tượng Run chạy code
Mã:
Option Explicit
Sub ChiaCa()
  Dim arr, a, ngh(), res(), dic As Object, iDay As Date, t$
  Dim NG&, CT&, eRow&, i&, k&, r&, j&
 
  Randomize
  On Error GoTo Thoat
  Set dic = CreateObject("scripting.dictionary")
 
  iDay = Range("E2").Value
  NG = DateAdd("m", 1, iDay) - iDay 'So Ngay Trong Thang
  'NG = 366 'Xep Lich 1 nam
  ReDim res(1 To NG, 1 To 5)
 
'Nap Ngay Nghi Dang Ky Truoc Vao Dic
  eRow = Range("K9999").End(xlUp).Row
  If eRow >= 4 Then
    For i = 4 To eRow
      dic(CLng(Cells(i, "L"))) = Cells(i, "K")
    Next i
  End If
 
'Nap Ca Truc Vao Dic
  arr = Range("H4:I8").Value
  For i = 1 To UBound(arr)
    If arr(i, 2) <> Empty Then dic(arr(i, 1)) = arr(i, 2) * 2
  Next i
 
'Tao Mang Ngay nghi cua NV
  ReDim ngh(1 To NG, 1 To 3)
  k = Int(Rnd * 5 + 1)
  For i = 1 To NG
    res(i, 1) = iDay
    If Weekday(iDay, vbMonday) > 5 Then ngh(i, 3) = "CuoiTuan"
    If k = 5 Then k = 1 Else k = k + 1
    If dic.exists(CLng(iDay)) Then
      ngh(i, 1) = dic(iDay) 'NV Nghi theo dang ky truoc
      ngh(i, 2) = arr(k, 1) 'NV Doi Ngay Nghi
    Else
      ngh(i, 1) = arr(k, 1)
    End If
    iDay = iDay + 1
  Next i
 
  For i = 1 To NG 'Doi Ngay nghi
    If ngh(i, 2) <> Empty Then
      k = i
      For r = 1 To NG
        If k = NG Then k = 1 Else k = k + 1
        If ngh(i, 1) = ngh(k, 1) And ngh(i, 3) = ngh(k, 3) Then
          If ngh(k, 2) = Empty Then
            ngh(k, 1) = ngh(i, 2)
            Exit For
          End If
        End If
      Next r
    End If
  Next i

'Phân ca truc
  For i = 1 To NG
    a = arr
    For r = 1 To UBound(a)
      If a(r, 1) = ngh(i, 1) Then
        a(r, 1) = Empty
      Else
        j = dic(a(r, 1))
        If j > 0 Then
          If res(i, j) = Empty Then res(i, j) = a(r, 1) Else res(i, j + 1) = a(r, 1)
          a(r, 1) = Empty
        End If
      End If
    Next r
    For r = 1 To UBound(a)
      If a(r, 1) <> Empty Then
        For j = 2 To 5
          If res(i, j) = Empty Then
            res(i, j) = a(r, 1)
            Exit For
          End If
        Next j
      End If
    Next r
  Next i
  Range("A5:F9999").ClearContents
  Range("A5").Resize(NG, 5) = res
  Range("F5").Resize(NG) = ngh
  Exit Sub
 
Thoat:
  MsgBox ("Du lieu Bi Loi, Vui Long Kiem Tra Lai")
End Sub
 

File đính kèm

  • ChiaCa.xlsb
    19.1 KB · Đọc: 15
Web KT
Back
Top Bottom