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

Liên hệ QC
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

  • lich truc.xlsb
    30.2 KB · Đọc: 89
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

  • Lich truc thang 5.xlsx
    12.2 KB · Đọc: 40
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

  • lich truc.xlsb
    24.1 KB · Đọc: 59
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

  • LichTrucBS.xlsb
    24.4 KB · Đọc: 15
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"
 
Web KT
Back
Top Bottom