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: 11
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: 4
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom