Sắp xếp lịch trực

Liên hệ QC
Làm sao biết được tuần nào: "Cuối tuần thì lúc trực T7, lúc trực CN, có Tuần nghỉ cả thứ 7, CN"
Thì nếu tổ trực thứ 2, thứ 6 thì sẽ nghỉ thứ 7, CN. và cứ xoay tua đều vậy. thứ 3, thứ 7, rồi thứ 4, Cn hoặc có tổ chỉ trực mỗi thứ 5 không thôi. nếu có 8 người thì lại dễ chia. nhưng hiện tại nhân viên lại chỉ có 7 người. Nên muốn nhờ bạn cắt hộ sao cho phù hợp nhất. Chia làm 4 tổ tại có 4 chỉ huy, xoay tròn nhau. Trực 1 ngày nghỉ 3 ngày
 
Lần chỉnh sửa cuối:
Thì nếu tổ trực thứ 2, thứ 6 thì sẽ nghỉ thứ 7, CN. và cứ xoay tua đều vậy. thứ 3, thứ 7, rồi thứ 4, Cn hoặc có tổ chỉ trực mỗi thứ 5 không thôi. nếu có 8 người thì lại dễ chia. nhưng hiện tại nhân viên lại chỉ có 7 người. Nên muốn nhờ bạn cắt hộ sao cho phù hợp nhất. Chia làm 4 tổ tại có 4 chỉ huy, xoay tròn nhau. Trực 1 ngày nghỉ 3 ngày
4 chỉ huy nằm ở đầu danh sách, kế đến là nhân viên
Mã:
Option Explicit
Sub LichTruc()
  Dim aNV, aCH(), a, Res(), fDay As Date
  Dim sCH&, sNV&, sd&, i&, k&, r&, j&
  Const SoThang& = 1 'So tháng
 
  sd = DateAdd("m", SoThang, fDay) - fDay 'So ngay trong Ky
  ReDim Res(1 To sd, 1 To 5)
  With Sheets("Sheet1")
    fDay = .Range("C2").Value
    aCH = .Range("J4:K7").Value
    aNV = .Range("J8:K14").Value
  End With
  sCH = UBound(aCH):      sNV = UBound(aNV)
  aCH = UniqueRand(aCH, sCH) 'Tron ngau nhien Chi Huy
  aNV = UniqueRand(aNV, sNV) 'Tron ngau nhien NV
  Do
    r = ((r + 2) Mod sNV) + 1
    For j = 1 To sNV
      i = i + 1
      Res(i, 1) = fDay
      If k = sCH Then k = 1 Else k = k + 1
      Res(i, 2) = aCH(k)
      If r = sNV Then r = 1 Else r = r + 1
      Res(i, 3) = aNV(r)
      If r = sNV Then r = 1 Else r = r + 1
      Res(i, 4) = aNV(r)
      Res(i, 5) = Format(fDay, "ddd")
      fDay = fDay + 1
      If i >= sd Then Exit Do
    Next j
  Loop
  With Sheets("Sheet1")
    .Range("B4:E400").Clear
    .Range("B4").Resize(sd, 4) = Res
    .Range("B4").Resize(sd, 4).Borders.LineStyle = 1
  End With
End Sub

Function UniqueRand(ByVal arr, ByVal sRow&) As Variant
  Dim a&(), t(), N&, i&, RndNum&, tmp&
  N = sRow
  ReDim a(1 To N)
  ReDim t(1 To N)
  For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    If a(RndNum) = 0 Then tmp = RndNum Else tmp = a(RndNum)
    If a(N) = 0 Then a(RndNum) = N Else a(RndNum) = a(N)
    a(N) = tmp
    N = N - 1
  Next i
  For i = 1 To sRow
    t(i) = arr(a(i), 1)
  Next i
  UniqueRand = t
End Function
 

File đính kèm

  • lich truc.xlsb
    21.6 KB · Đọc: 22
Lần chỉnh sửa cuối:
0102030405060708091011121314151617181920212223242526272829303101
B0B1B2B3B0B1B2B3B0B1B2B3CSCH
A1A3A5A7A2A4A6A1A3A5A7A2A4A6A1A0B0
A2A4A6A1A3A5A7A2A4A6A1A3A5A7A1B1
A2B2
A3B3
A4
A5
A6
A7
 
0102030405060708091011121314151617181920212223242526272829303101
B0B1B2B3B0B1B2B3B0B1B2B3CSCH
A1A3A5A7A2A4A6A1A3A5A7A2A4A6A1A0B0
A2A4A6A1A3A5A7A2A4A6A1A3A5A7A1B1
A2B2
A3B3
A4
A5
A6
A7
Chia như này thì người trực thứ 2 trực thứ 2 miết ạ, tuần này trực thứ2,6 thì tuần sau 3,7, tiếp 4,cn, tiếp là thứ 5. xoay đều cho tất cả.
Bài đã được tự động gộp:

4 chỉ huy nằm ở đầu danh sách, kế đến là nhân viên
Mã:
Option Explicit
Sub LichTruc()
  Dim aNV, aCH(), a, Res(), fDay As Date
  Dim sCH&, sNV&, sd&, i&, k&, r&, j&
  Const SoThang& = 1 'So tháng
 
  sd = DateAdd("m", SoThang, fDay) - fDay 'So ngay trong Ky
  ReDim Res(1 To sd, 1 To 5)
  With Sheets("Sheet1")
    fDay = .Range("C2").Value
    aCH = .Range("J4:K7").Value
    aNV = .Range("J8:K14").Value
  End With
  sCH = UBound(aCH):      sNV = UBound(aNV)
  aCH = UniqueRand(aCH, sCH) 'Tron ngau nhien Chi Huy
  aNV = UniqueRand(aNV, sNV) 'Tron ngau nhien NV
  Do
    r = ((r + 2) Mod sNV) + 1
    For j = 1 To sNV
      i = i + 1
      Res(i, 1) = fDay
      If k = sCH Then k = 1 Else k = k + 1
      Res(i, 2) = aCH(k)
      If r = sNV Then r = 1 Else r = r + 1
      Res(i, 3) = aNV(r)
      If r = sNV Then r = 1 Else r = r + 1
      Res(i, 4) = aNV(r)
      Res(i, 5) = Format(fDay, "ddd")
      fDay = fDay + 1
      If i >= sd Then Exit Do
    Next j
  Loop
  With Sheets("Sheet1")
    .Range("B4:E400").Clear
    .Range("B4").Resize(sd, 4) = Res
    .Range("B4").Resize(sd, 4).Borders.LineStyle = 1
  End With
End Sub

Function UniqueRand(ByVal arr, ByVal sRow&) As Variant
  Dim a&(), t(), N&, i&, RndNum&, tmp&
  N = sRow
  ReDim a(1 To N)
  ReDim t(1 To N)
  For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    If a(RndNum) = 0 Then tmp = RndNum Else tmp = a(RndNum)
    If a(N) = 0 Then a(RndNum) = N Else a(RndNum) = a(N)
    a(N) = tmp
    N = N - 1
  Next i
  For i = 1 To sRow
    t(i) = arr(a(i), 1)
  Next i
  UniqueRand = t
End Function
dạ mình cảm ơn , để mình mò ráp vô. Chứ mình cũng ko rành excel lắm .:)
 
Nhưng ông A2 cũng như ông A1 đều đã trực thứ 2 rồi ạ, bác có thể cắt sơ lược e coi được không.
Bạn tự làm trước trong 24 tiếng đồng hồ xem sao; Mình cho rằng chưa được thì tịnh tiến lên 2 chiến sỹ sẽ là OK thôi.
 
Em chào mọi người ạ. Em là thành viên mới ạ
Em lên đây, có việc mong được mọi người chỉ dạy và giúp đỡ ạ.

Em đang xếp lịch trực Tết nguyên đán, theo ngày ạ (từ 29al đến mùng 6 Tết ạ). Một ngày sẽ có 6 người (trong đó 1 tổ trưởng, 1 lái xe và 4 công nhân (4 công nhân thuộc 4 tổ ạ))

Em có làm theo cách của anh/chị Rollover79, nhưng vẫn không nắm được lắm ạ :(

Em cám ơn, mong được mọi người giúp đỡ ạ
Bài đã được tự động gộp:

Em chào mọi người ạ. Em là thành viên mới ạ
Em lên đây, có việc mong được mọi người chỉ dạy và giúp đỡ ạ.

Em đang xếp lịch trực Tết nguyên đán, theo ngày ạ (từ 29al đến mùng 6 Tết ạ). Một ngày sẽ có 6 người (trong đó 1 tổ trưởng, 1 lái xe và 4 công nhân (4 công nhân thuộc 4 tổ ạ))

Em có làm theo cách của anh/chị Rollover79, nhưng vẫn không nắm được lắm ạ :(

Em cám ơn, mong được mọi người giúp đỡ ạ
 

File đính kèm

  • XepLichTruc tet.xls
    32 KB · Đọc: 8
Lần chỉnh sửa cuối:
Chào các Anh Chị ạ.

Xin mọi người giúp đỡ về lịch trực trong tổ của mình với các yêu cầu cụ thể như sau:
Chia trực 1 ca 24h
_Số nhân viên = 07 người.
_Mỗi ngày trực 02 người.
_thứ 7 và CN trong tháng sẽ chia điều cho từng nhân viên và xoay vòng.
_Tổng số ngày trong tháng sẽ chia điều cho từng nhân viên. Nếu không đủ sẽ lấn sang tháng kế tiếp.
_Sao cho tổng số ngày thứ 7 và CN sẽ được chia điều. Tổng số những ngày còn lại cũng sẽ được chia điều.

xin cám cơn và chờ hồi âm của mọi người.
 
Chào các Anh Chị ạ.

Xin mọi người giúp đỡ về lịch trực trong tổ của mình với các yêu cầu cụ thể như sau:
Chia trực 1 ca 24h
_Số nhân viên = 07 người.
_Mỗi ngày trực 02 người.
_thứ 7 và CN trong tháng sẽ chia điều cho từng nhân viên và xoay vòng.
_Tổng số ngày trong tháng sẽ chia điều cho từng nhân viên. Nếu không đủ sẽ lấn sang tháng kế tiếp.
_Sao cho tổng số ngày thứ 7 và CN sẽ được chia điều. Tổng số những ngày còn lại cũng sẽ được chia điều.

xin cám cơn và chờ hồi âm của mọi người.
Kết quả là số thứ tự của nhân viên
 

File đính kèm

  • Book1.xlsx
    11.7 KB · Đọc: 26
Kết quả là số thứ tự của nhân viên
Em chào các anh chị; Em chào anh HieuCD
Em có tham khảo file của anh đặt vào trường hợp của bên em nhưng em chưa hiểu rõ ý nghĩa công thức nên chưa sửa lại theo trường hợp công ty em được.
Em xin phép nhờ các anh chị hỗ trợ em trường hợp sắp xếp lịch làm việc của em ạ.
Bên em có 15 nhân viên chia 3 ca làm việc S-C-T (có phân biệt vị trí làm - Coi như là 13 vị trí làm việc).
Cố gắng duy trì nhịp làm việc 5C-5S-5T quay vòng (nghỉ 4 ngày/tháng/người có thể sắp xếp linh hoạt). Không thể làm nối ca T sang ca S (bị thông ca liên tục 16 tiếng).
Nhân viên 12-15 không làm tối (ca T) và tăng số lượng vị trí 3,4 (S3,C3,S4,C4).
Các yếu tố ràng buộc khác không nhiều em có các sheet ví dụ em làm tháng trước đấy.
Trước đây em đang làm thủ công hoàn toàn. Không có quy luật và không tránh khỏi nhiều lúc sai sót, không cân đối,...
Mong các cao nhân có phương án giúp em VBA hay hàm đều được ạ. Em chân thành cảm ơn các bác.
 

File đính kèm

  • PHANCA.xlsx
    127 KB · Đọc: 1
Web KT

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

Back
Top Bottom