Sắp xếp lịch trực (2 người xem)

Liên hệ QC

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

Anh HieuCD ơi, anh có thể giúp em vấn đề này được ko ạ?
Xếp lịch trực 1 năm
Mã:
Option Explicit
Sub LichTrucNam()
  Application.ScreenUpdating = False
  Range("B7:F372").ClearContents
  Call CreateDate
  Call LichNam
  Application.ScreenUpdating = True
End Sub

Private Sub LichNam()
  Dim aNV(), Arr, Res(), nam
  Dim sRow&, N&, i&, k&, k2&, j&, j2&
  Const Nu& = 9 'So NV Nu
 
  With Sheets("Sheet1")
    nam = .Range("C2").Value
    aNV = .Range("N3:O78").Value
  End With
  sRow = UBound(aNV)
  N = DateSerial(nam + 1, 1, 1) - DateSerial(nam, 1, 1)
  ReDim Res(1 To N, 1 To 4)
  Arr = UniqueRand(sRow, Nu)
  For i = 1 To N
    If k = sRow Then k = 1 Else k = k + 1
    Res(i, 1) = Arr(k)
    If k = sRow Then k = 1 Else k = k + 1
    Res(i, 2) = Arr(k)
  Next i
  For i = 1 To N
    k = Res(i, 1): k2 = Res(i, 2)
    If aNV(k, 2) = "Nam" Then j = 3: j2 = 1 Else j = 1: j2 = 3
      Res(i, j) = aNV(k, 1)
      Res(i, j + 1) = aNV(k, 2)
      Res(i, j2) = aNV(k2, 1)
      Res(i, j2 + 1) = aNV(k2, 2)
    Next i
  Sheets("Sheet1").Range("C7").Resize(N, 4) = Res
End Sub

Private Sub CreateDate()
  Dim aNgay(), fDay As Date, nam, i&
 
  With Sheets("Sheet1")
    nam = .Range("C2").Value
    If Not IsNumeric(nam) Or nam = Empty Then nam = Year(Date): .Range("C2") = nam
    fDay = DateSerial(nam, 1, 1)
    ReDim aNgay(0 To 366, 1 To 1)
    For i = 0 To 400
      aNgay(i, 1) = fDay + i
      If Year(fDay + i + 1) > nam Then Exit For
    Next i
    .Range("B7").Resize(i + 1) = aNgay
    .Range("B7").Resize(i + 1).NumberFormat = "dd/mm/yyyy"
  End With
End Sub

Function UniqueRand(ByVal sRow&, ByVal Nu&) As Variant
  Dim Arr&(), tArr&(), N&, i&, RndNum&, tmp&, k&

  ReDim Arr(1 To sRow): ReDim tArr(1 To sRow - Nu)
  Randomize
  For i = 1 To Nu
TroLai:
    RndNum = Int((sRow - 2) * Rnd() + 2)
    If (RndNum Mod 2) = 1 And Arr(RndNum) = 0 Then Arr(RndNum) = i Else GoTo TroLai
  Next i
  N = sRow - Nu
  For i = 1 To N
    RndNum = Int(N * Rnd() + 1)
    If tArr(RndNum) = 0 Then tmp = RndNum Else tmp = tArr(RndNum)
    If tArr(N) = 0 Then tArr(RndNum) = N Else tArr(RndNum) = tArr(N)
    tArr(N) = tmp
    N = N - 1
  Next i
  For i = 1 To sRow
    If Arr(i) = 0 Then
      k = k + 1
      Arr(i) = tArr(k) + Nu
    End If
  Next i
  UniqueRand = Arr
End Function
 

File đính kèm

Bạn xem thử file này nhé. Ở đây tôi thêm vào 2 bảng để quản lý.
- Bảng Phòng, liệt kê danh sách các phòng của bạn(Mã phòng gồm 2 ký tự, cái này có liên quan đến công thức).
- Bảng Nhân viên, liệt kê danh sách các nhân viên bao gồm 1 cột là Mã phòng để biết nhân viên đó thuộc phòng nào, yêu cầu bảng này phải được sắp xếp theo mã phòng, để đảm bảo các nhân viên cùng 1 phòng sẽ nằm liên tục với nhau trong bảng Nhân viên này.
- Tại bảng lịch trực là bảng chính, tôi thêm vào 2 cột phụ, 1 cột cho biết ngày trực có phải là thứ 7 hay chủ nhật hay không. Cột thứ 2 là số thứ tự ca trực. Cột Phòng 1 và Phòng 2 là tên 2 phòng sẽ phải trực ngày hôm đó. Nếu là thứ 7 và chủ nhật thì sẽ có 2 phòng cách nhau bởi dấu "|". Cột Nhân viên 1 và Nhân viên 2 là Nhân viên phải trực tương ứng với Phòng 1 và Phòng 2, với thứ 7 và chủ nhật thì mỗi cột cũng có 2 nhân viên tương ứng với 2 phòng cách nhau bới dấu "|".
(Bạn sửa lại cho thích hợp với yêu cầu nhé)
bạn giúp mình chia lại số người trực là 2 phòng mỗi phòng 7n, chia đều cho trực từ thứ 2 đến cn mỗi ngày là 2 người
 
Xin nhờ bạn HieuCD giúp đỡ với ạ.
Tổ của tôi có 8 người, muốn phân lịch trực tuần, công bằng cho cả tháng.
- 03 người trực Vận hành (Thay phiên nhau trực ca 12 tiếng. Ca Ngày và ca Đêm) ; 03 người trực Sửa chữa (Thay phiên nhau trực ca 12 tiếng. Ca Ngày và ca Đêm); 02 người trực Hành chính.
- Trực Vận hành và trực Sửa chữa trực ca 12 tiếng. và được nghỉ 24 tiếng rồi mới trực lại.
- 02 người trực Hành chính thay phiên nhau. Mặt khác, 1 người phải trực thêm 02 ca Vận hành và 01 người phải trực thêm 02 ca trực Sửa chữa trong 1 tuần. 02 ca vận hành và 02 ca sửa chữa này trực với tư cách như 03 người trực Vận hành và 03 người trực Sửa chữa nói trên.
- Ca trực Vận hành + Ca trực Sửa chữa được tính 12h làm việc, Ca trực hành chính được tính 08h làm việc. Phân lịch trực công bằng cho mọi người để đảm bảo làm đủ tối thiểu 48h/tuần.
 
Xin nhờ bạn HieuCD giúp đỡ với ạ.
Tổ của tôi có 8 người, muốn phân lịch trực tuần, công bằng cho cả tháng.
- 03 người trực Vận hành (Thay phiên nhau trực ca 12 tiếng. Ca Ngày và ca Đêm) ; 03 người trực Sửa chữa (Thay phiên nhau trực ca 12 tiếng. Ca Ngày và ca Đêm); 02 người trực Hành chính.
- Trực Vận hành và trực Sửa chữa trực ca 12 tiếng. và được nghỉ 24 tiếng rồi mới trực lại.
- 02 người trực Hành chính thay phiên nhau. Mặt khác, 1 người phải trực thêm 02 ca Vận hành và 01 người phải trực thêm 02 ca trực Sửa chữa trong 1 tuần. 02 ca vận hành và 02 ca sửa chữa này trực với tư cách như 03 người trực Vận hành và 03 người trực Sửa chữa nói trên.
- Ca trực Vận hành + Ca trực Sửa chữa được tính 12h làm việc, Ca trực hành chính được tính 08h làm việc. Phân lịch trực công bằng cho mọi người để đảm bảo làm đủ tối thiểu 48h/tuần.
1 tuần từng loại trực làm việc mấy ngày?
 
1 tuần từng loại trực làm việc mấy ngày?
Tình hình hiện tại chúng tôi thường phân lịch bằng tay như sau:
- Trực Vận Hành (VH, 03 người NV1, NV2, NV3 luân phiên) (12 tiếng) + Trực sửa chữa (SC, 03 người NV4, NV5, NV6) (12 tiếng) làm việc 4-5 ca/1 tuần. Thường bố trí trực ca 12 tiếng ngày N xong trực ca 12 tiếng đêm ngày N+1 rổi nghỉ ngày N+2.
- Trực Hành chính HC1: 3-4 ca hành chính( 8 tiếng) + 2 ca VH
- Trực Hành chính HC2: 3-4 ca hành chính (8 tiếng) + 2 ca SC
- Mỗi ngày chỉ sắp xếp 1 người trực Hành chính (HC1 hoặc HC2) trực kèm với 1 Trực VH + 1 Trực SC.
- Mỗi ngày bắt buộc phải có 1 VH + 1 SC, không bắt buộc phải có HC1 hoặc HC2.
Trực ca Vận Hành hoặc Sửa chữa xong được nghỉ 24 tiếng rồi mới trực lại.
Lịch xoay vòng liên tục, không kể thứ 7, CN bạn ạ.
 
Tình hình hiện tại chúng tôi thường phân lịch bằng tay như sau:
- Trực Vận Hành (VH, 03 người NV1, NV2, NV3 luân phiên) (12 tiếng) + Trực sửa chữa (SC, 03 người NV4, NV5, NV6) (12 tiếng) làm việc 4-5 ca/1 tuần. Thường bố trí trực ca 12 tiếng ngày N xong trực ca 12 tiếng đêm ngày N+1 rổi nghỉ ngày N+2.
- Trực Hành chính HC1: 3-4 ca hành chính( 8 tiếng) + 2 ca VH
- Trực Hành chính HC2: 3-4 ca hành chính (8 tiếng) + 2 ca SC
- Mỗi ngày chỉ sắp xếp 1 người trực Hành chính (HC1 hoặc HC2) trực kèm với 1 Trực VH + 1 Trực SC.
- Mỗi ngày bắt buộc phải có 1 VH + 1 SC, không bắt buộc phải có HC1 hoặc HC2.
Trực ca Vận Hành hoặc Sửa chữa xong được nghỉ 24 tiếng rồi mới trực lại.
Lịch xoay vòng liên tục, không kể thứ 7, CN bạn ạ.
Bạn gởi lịch xếp tay vài tuần để làm rỏ " Mỗi ngày bắt buộc phải có 1 VH + 1 SC, không bắt buộc phải có HC1 hoặc HC2."
 
Cảm ơn bạn đã phản hồi. Tôi Thực sự rất cảm kích.
Xin gửi bạn lịch trực xếp tay mẫu.
 

File đính kèm

Nhân viên Công có những ngày trực hành chính và trực sửa chữa là do nhầm lẫn?
Không nhầm đâu.
- Nhân viên Công có thể bố trí trực HC ban ngày và trực SC ca đêm.
- Để đảm bảo NV Công đủ 48h làm việc/ tuần thì trong tuần NV công phải đi làm 03 ca HC (tính công 8h) + 01 ca SC1 (ngày, tính công 12h) + 01 ca SC2 (đêm, tính công 12h).
- 03 Ca HC có thể bố trí linh hoạt các ngày trong tuần nhưng phải đảm bảo không trùng với ngày đi ca HC của NV Ngô và đã bố trí đi ca HC thì không bố trí đi Ca1 ( trực ngày) trực SC.
- NV Công chỉ bố trí đi ca trực SC, không được bố trí đi ca trực VH.
- Nhân viên Ngô tương tự NV Công nhưng chỉ bố trí đi Ca VH, không được bố trí đi ca trực SC.
Thank bạn.
 
Lần chỉnh sửa cuối:
Không nhầm đâu.
- Nhân viên Công có thể bố trí trực HC ban ngày và trực SC ca đêm.
- Để đảm bảo NV Công đủ 48h làm việc/ tuần thì trong tuần NV công phải đi làm 03 ca HC (tính công 8h) + 01 ca SC1 (ngày, tính công 12h) + 01 ca SC2 (đêm, tính công 12h).
- 03 Ca HC có thể bố trí linh hoạt các ngày trong tuần nhưng phải đảm bảo không trùng với ngày đi ca HC của NV Ngô và đã bố trí đi ca HC thì không bố trí đi Ca1 ( trực ngày) trực SC.
- NV Công chỉ bố trí đi ca trực SC, không được bố trí đi ca trực VH.
- Nhân viên Ngô tương tự NV Công nhưng chỉ bố trí đi Ca VH, không được bố trí đi ca trực SC.
Thank bạn.
Lịch trực có nhiều phương án xây dựng, mình dùng cách dể nhất là tạo lịch trực 1 tuần từ thứ 2 tới chủ nhật và chạy code phân phối cho cả năm
Kiểm tra kết quả, nếu phù hợp mình sẽ viết tiếp code lấy 5 tuần cho sheet3
Mã:
Sub LichTrucNam()
  Dim sh As Worksheet
  Application.ScreenUpdating = False
  Set sh = Sheets("Sheet2")
  sh.Range("B6:G400").ClearContents
  Call CreateDate(sh)
  Call LichNam(sh)
  Application.ScreenUpdating = True
End Sub

Private Sub LichNam(sh)
  Dim arr(), sRow&, i&, j&, r&, d&
 
  sh.Range("C6:G12").Value = sh.Range("J6:N12").Value
  arr = sh.Range("C6:G" & sh.Range("B" & Rows.Count).End(xlUp).Row).Value
  sRow = UBound(arr)
  For i = 8 To sRow Step 7
    For j = 1 To 5
      For r = 0 To 6
        If r < 5 Then d = 5 Else d = 12
        arr(i + r, j) = arr(i + r - d, j)
      Next r
    Next j
  Next i
  sh.Range("C6").Resize(sRow, 5) = arr
End Sub
Private Sub CreateDate(sh)
  Dim aNgay(), fDay As Date, nam, i&
 
  nam = sh.Range("C2").Value
  If Not IsNumeric(nam) Or nam = Empty Then nam = Year(Date): sh.Range("C2") = nam
  fDay = DateSerial(nam, 1, 1)
  fDay = fDay - Weekday(fDay, 2) + 1
  ReDim aNgay(0 To 400, 1 To 1)
  For i = 0 To 400
    aNgay(i, 1) = fDay + i
    If Year(aNgay(i, 1) + 1) > nam And Weekday(aNgay(i, 1), 2) = 7 Then Exit For
  Next i
  sh.Range("B6").Resize(i + 1) = aNgay
  sh.Range("B6").Resize(i + 1).NumberFormat = "dd/mm/yyyy"
End Sub
 

File đính kèm

Lịch trực có nhiều phương án xây dựng, mình dùng cách dể nhất là tạo lịch trực 1 tuần từ thứ 2 tới chủ nhật và chạy code phân phối cho cả năm
Kiểm tra kết quả, nếu phù hợp mình sẽ viết tiếp code lấy 5 tuần cho sheet3
Mã:
Sub LichTrucNam()
  Dim sh As Worksheet
  Application.ScreenUpdating = False
  Set sh = Sheets("Sheet2")
  sh.Range("B6:G400").ClearContents
  Call CreateDate(sh)
  Call LichNam(sh)
  Application.ScreenUpdating = True
End Sub

Private Sub LichNam(sh)
  Dim arr(), sRow&, i&, j&, r&, d&
 
  sh.Range("C6:G12").Value = sh.Range("J6:N12").Value
  arr = sh.Range("C6:G" & sh.Range("B" & Rows.Count).End(xlUp).Row).Value
  sRow = UBound(arr)
  For i = 8 To sRow Step 7
    For j = 1 To 5
      For r = 0 To 6
        If r < 5 Then d = 5 Else d = 12
        arr(i + r, j) = arr(i + r - d, j)
      Next r
    Next j
  Next i
  sh.Range("C6").Resize(sRow, 5) = arr
End Sub
Private Sub CreateDate(sh)
  Dim aNgay(), fDay As Date, nam, i&
 
  nam = sh.Range("C2").Value
  If Not IsNumeric(nam) Or nam = Empty Then nam = Year(Date): sh.Range("C2") = nam
  fDay = DateSerial(nam, 1, 1)
  fDay = fDay - Weekday(fDay, 2) + 1
  ReDim aNgay(0 To 400, 1 To 1)
  For i = 0 To 400
    aNgay(i, 1) = fDay + i
    If Year(aNgay(i, 1) + 1) > nam And Weekday(aNgay(i, 1), 2) = 7 Then Exit For
  Next i
  sh.Range("B6").Resize(i + 1) = aNgay
  sh.Range("B6").Resize(i + 1).NumberFormat = "dd/mm/yyyy"
End Sub
Cảm ơn bạn rất nhiều.
Nhờ bạn giúp cột ngày/tháng/năm có thể chọn ngày Thứ 2 bất kỳ trong năm (lựa chọn đúng ngày/tháng/năm của ngày Thứ 2 sau đó tự động bắt đầu xếp lịch từ ngày đó đến hết năm hoặc cho cả năm) và lấy lịch trực 5 tuần lên Sheet3 nữa với ạ.
Thank you!
 
Nhờ mọi người hướng dẫn cho e cách sắp lịch trực cho thứ 7,chủ nhật
Nhóm em có 10 người trực vào thứ 7 và chủ nhật mỗi ngày có 2 người trực cả ngày và 1 người trực 1/2 ngày thì phân trực ntn cho phù hợp ạ . Em cám ơn
 
Nhờ mọi người giúp phân trực với, mình có 8 nhóm, phân trực trong 3 tuần, từ thứ 2 đến thứ 6 là 1 nhóm trực, thứ 7 và chủ nhật chia sáng 1 nhóm và chiều 1 nhóm.
 
Các anh chị giúp e với ạ!
Em cần tạo lịch phân ca trực ban cho cơ quan tổng có 15 phòng, yêu cầu:
- Mỗi ngày 1 trực ban trưởng và 1 nhân viên trực ban
- Ngày thứ 7 và chủ nhật chia đều và xoay vòng
- Ngày lễ tết cũng chia đều và xoay vòng
Em cảm ơn!
 
@HieuCD . A giúp e với để phân lịch trực chia đều cho 12 bác sỹ cho 2 khoa (1 ngày 2 người trực/ 2 khoa. Tổng ngày cần 2 người ) đảm bảo 1 tuần mỗi người không trực quá 2 lần với ạk (Luân phiên nhau đảm bảo công bằng/ 1 năm/ trực cách ngày để có thời gian nghỉ ngơi). phân theo giống biểu này a ơi. .. Ngoài ra a xem thêm giúp e 1 cột lịch trực lái xe có tổng 4 người chia đều cho các ngày trong 1 sheet để theo dõi cho dễ với. e loay hoay mấy ngày chưa được cầu cứu a ạk
 

File đính kèm

Lần chỉnh sửa cuối:
Phong NhanVien là 2 cái Name tôi đặt tên cho 2 cái bảng tương ứng là bảng Phòng và bảng Nhân viên, nếu bạn chưa rõ về Name thì có thể tìm hiểu trên 4R này có bàn tới rất nhiều rồi, tạm thời bạn vào menu Insert/Name/Define để tìm hiểu.
bạn ơi cho mình số điện thoại để hướng dẫn cho mình bài này với.
 
Mình muốn nhờ phân công lịch trực cho cơ quan. Cơ quan mình có 11 người 4 chỉ huy và 7 nhân viên, mỗi ngày cần có 1 chỉ huy và 2 nhân viên. Nhờ bạn hỗ trợ cắt cho mình cái lịch xoay tua theo tháng cho phù hợp. Cuối tuần thì lúc trực T7, lúc trực CN, có Tuần nghỉ cả thứ 7, CN. Xin cảm ơn. @HieuCD
 
Lần chỉnh sửa cuối:
Mình muốn nhờ phân công lịch trực cho cơ quan. Cơ quan mình có 11 người 4 chỉ huy và 7 nhân viên, mỗi ngày cần có 1 chỉ huy và 2 nhân viên. Nhờ bạn hỗ trợ cắt cho mình cái lịch xoay tua theo tháng cho phù hợp. Cuối tuần thì lúc trực T7, lúc trực CN, có Tuần nghỉ cả thứ 7, CN. Xin cảm ơn. @HieuCD
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"
 
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

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

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

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

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

Back
Top Bottom