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

Liên hệ QC
Từ File XepLichTruc của bạn rollover79 nếu ghép 2 Cột Phòng 1 và phòng 2 thành 1 cột thì công thức như thế nào để:
1. Thứ tự các P được liên tục
2. Ngày True vẫn có đủ P...| P...
 
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é)
Em đang chưa hiểu được, ý tưởng của chỗ dùng hàm Mod như trong hình của tác giả. Để giải quyết bài toán phân ca trực này. Mong các Sư Phụ cho Em biết chỗ dụng ý dùng Mod trong bài này với ạ. Cảm ơn A/C nhiều!
Đề của bài này đang là:
- Có 7 phòng
- Mỗi phòng có số người: P1=4, P2=5, P3=3, P4=6, P5=2, P6=4, P7=4
Yêu cầu:
- Mỗi tối có 2 người trực của 2 phòng khác nhau
- Không có phòng nào phải trực 2 tối liên tiếp
1590567508346.png
 
Chào các bạn, mình thỉnh thoảng có vào diễn đàn tham khảo các bài viết của các bạn. Tuy nhiên, gần đây mình có thêm công việc sắp xếp lịch báo cáo tốt nghiệp cho sinh viên. Mình gặp không ít khó khăn khi sắp lịch do bị trùng thành viên hội đồng vì số lượng sinh viên quá đông trong khi giáo viên thì 10-14 người, trong khi sinh viên báo cáo 60-70. Tình huống của mình như sau (file đính kèm):

- Thông thường sinh viên chỉ báo cáo tốt nghiệp trong 1 ngày, chia làm 2-3 phòng báo cáo tùy số lượng sinh viên trong học kỳ đó.

- Hội đồng gồm 3 người: người hướng dẫn và 2 phản biện, có thể có nhiều hội đồng trong 1 phòng báo cáo.

- Thời gian báo cáo của các hội đồng là giống nhau (20 phút bao gồm báo cáo và hỏi đáp), do đó mốc thời gian báo cáo của các phòng là cố định.

- Thành viên của hội đồng này có thể là thành viên của hội đồng khác, và thành viên hội đồng của các phòng khác nữa. Điều đó có nghĩa là, giáo viên A sau khi ngồi hội đồng ở phòng 1 xong có thể di chuyển qua phòng 2 để ngồi hội đồng khác, sau đó có thể quy trở lại phòng 1,… miễn sao kg trùng mốc thời gian!

- Vừa rồi mình mình tổng hợp xem mỗi giáo viên hướng dẫn bao nhiêu sinh viên để số lượng hội đồng mà giáo viên đó tham gia gần như tương đương khi so với giáo viên khác. Sau đó mình sắp nhóm nghiên cứu phù hợp (các giáo viên có cùng chủ đề, ví dụ cùng dạy về thống kê), nếu điều kiện này không đủ giáo viên thì có thể sắp ngẫu nhiên giáo viên khác.

Mình toàn làm thủ công do đó có lúc sắp lịch mất rất nhiều thời gian. Cái khó là số lượng sinh viên mà giáo viên hướng dẫn rất khác nhau, có người 3-4, có người 7-8,…

Mong các bạn chỉ hướng giúp vì công việc này lặp đi lặp lại ở mỗi học kỳ.

Cảm ơn các bạn đã xem qua và mong hồi âm!
 

File đính kèm

  • Sắp lịch báo cáo.xlsx
    11.6 KB · Đọc: 45
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 ơi, file bạn làm rất hay, mình có thể trao đổi với bạn qua zalo hoặc face để hỏi một số thắc mắc được không ạ.
 
Mình nhớ đã gởi file mới lâu rồi, không biết tại sao không thấy
Gởi bạn file chỉnh lại hợp lý hơn
Chào bác ạ. Nhờ bác chỉnh lại lịch này giúp em. Em phân ca vào năm 2021 thì nó không chạy. Và bác đổi nhân viên số 3 thành nhân viên số 8 giùm em ạ. Cảm ơn bác nhiều nhiều.
 

File đính kèm

  • Nhap 10_20.xlsb
    40.2 KB · Đọc: 45
Ôi, cảm ơn bác nhiều ạ. Bác chỉ thêm cho em 1 chiêu nữa là số 3 và số 4 bây giờ chạy cả xe 1,2,3 ( trước là chỉ chạy xe 3) với ạ. Phiền bác quá. Em thấy bác trả lời vào lúc hơn 2 giờ sáng nên áy náy quá.
Chỉnh lại code
Mã:
Sub LichTruc()
  Application.ScreenUpdating = False
  Range("A5:I35").ClearContents
  Call Ngay
  Call ABC
  Application.ScreenUpdating = True
End Sub

Private Sub ABC()
  Dim Ngay(), Arr()
  Dim sRow&, i&, j&, k

  Ngay = Range("A5", Range("A100").End(3)).Value
  sRow = UBound(Ngay)
  ReDim Arr(1 To sRow, 1 To 6)
  k = Range("N4").Value
  If Not IsNumeric(k) Then k = 0 Else k = ((k - 1) Mod 7)
  For i = 1 To sRow
    For j = 1 To 6
      If Not ((Ngay(i, 1) = "Sat" And j = 2) Or (Ngay(i, 1) = "Sun" And (j = 2 Or j = 3))) Then
        If k = 7 Then k = 1 Else k = k + 1
        Arr(i, j) = k
      End If
    Next j
  Next i
  Range("C5").Resize(UBound(Arr), 6) = Arr
End Sub

Private Sub Ngay()
Dim Rng As Range, i As Byte, Ngay As Date, Thang As Byte, Nam As Long
Thang = Range("N3").Value
Nam = Range("N2").Value
If Nam = vbEmpty Then Nam = Year(Now())
If Thang = vbEmpty Then Thang = 1: Range("R3") = Thang
Ngay = DateSerial(Nam, Thang, 1) - 1
Range("A5:K35").ClearContents
Set Rng = Range("A5:B35")
For i = 1 To 31
  Ngay = Ngay + 1
  If Month(Ngay) = Thang Then
    Rng(i, 1) = Format(Weekday(Ngay), "ddd"):   Rng(i, 2) = Ngay
  Else
    Rng(i, 1) = "": Rng(i, 2) = ""
  End If
Next i
Set Rng = Nothing
End Sub
 
Chỉnh lại code
Mã:
Sub LichTruc()
  Application.ScreenUpdating = False
  Range("A5:I35").ClearContents
  Call Ngay
  Call ABC
  Application.ScreenUpdating = True
End Sub

Private Sub ABC()
  Dim Ngay(), Arr()
  Dim sRow&, i&, j&, k

  Ngay = Range("A5", Range("A100").End(3)).Value
  sRow = UBound(Ngay)
  ReDim Arr(1 To sRow, 1 To 6)
  k = Range("N4").Value
  If Not IsNumeric(k) Then k = 0 Else k = ((k - 1) Mod 7)
  For i = 1 To sRow
    For j = 1 To 6
      If Not ((Ngay(i, 1) = "Sat" And j = 2) Or (Ngay(i, 1) = "Sun" And (j = 2 Or j = 3))) Then
        If k = 7 Then k = 1 Else k = k + 1
        Arr(i, j) = k
      End If
    Next j
  Next i
  Range("C5").Resize(UBound(Arr), 6) = Arr
End Sub

Private Sub Ngay()
Dim Rng As Range, i As Byte, Ngay As Date, Thang As Byte, Nam As Long
Thang = Range("N3").Value
Nam = Range("N2").Value
If Nam = vbEmpty Then Nam = Year(Now())
If Thang = vbEmpty Then Thang = 1: Range("R3") = Thang
Ngay = DateSerial(Nam, Thang, 1) - 1
Range("A5:K35").ClearContents
Set Rng = Range("A5:B35")
For i = 1 To 31
  Ngay = Ngay + 1
  If Month(Ngay) = Thang Then
    Rng(i, 1) = Format(Weekday(Ngay), "ddd"):   Rng(i, 2) = Ngay
  Else
    Rng(i, 1) = "": Rng(i, 2) = ""
  End If
Next i
Set Rng = Nothing
End Sub
Chỉnh lại code
Mã:
Sub LichTruc()
  Application.ScreenUpdating = False
  Range("A5:I35").ClearContents
  Call Ngay
  Call ABC
  Application.ScreenUpdating = True
End Sub

Private Sub ABC()
  Dim Ngay(), Arr()
  Dim sRow&, i&, j&, k

  Ngay = Range("A5", Range("A100").End(3)).Value
  sRow = UBound(Ngay)
  ReDim Arr(1 To sRow, 1 To 6)
  k = Range("N4").Value
  If Not IsNumeric(k) Then k = 0 Else k = ((k - 1) Mod 7)
  For i = 1 To sRow
    For j = 1 To 6
      If Not ((Ngay(i, 1) = "Sat" And j = 2) Or (Ngay(i, 1) = "Sun" And (j = 2 Or j = 3))) Then
        If k = 7 Then k = 1 Else k = k + 1
        Arr(i, j) = k
      End If
    Next j
  Next i
  Range("C5").Resize(UBound(Arr), 6) = Arr
End Sub

Private Sub Ngay()
Dim Rng As Range, i As Byte, Ngay As Date, Thang As Byte, Nam As Long
Thang = Range("N3").Value
Nam = Range("N2").Value
If Nam = vbEmpty Then Nam = Year(Now())
If Thang = vbEmpty Then Thang = 1: Range("R3") = Thang
Ngay = DateSerial(Nam, Thang, 1) - 1
Range("A5:K35").ClearContents
Set Rng = Range("A5:B35")
For i = 1 To 31
  Ngay = Ngay + 1
  If Month(Ngay) = Thang Then
    Rng(i, 1) = Format(Weekday(Ngay), "ddd"):   Rng(i, 2) = Ngay
  Else
    Rng(i, 1) = "": Rng(i, 2) = ""
  End If
Next i
Set Rng = Nothing
End Sub
Em cảm ơn ạ. Không có nghề nhìn đúng như phim " The Matrix " luôn ạ.
 
Mong các cao thủ excell giúp em với ạ. Em đang muôn phân trực 14 người/ ngày của danh sách 37 khoa phòng, từ thứ 2 đến chủ nhật ạ.
 

File đính kèm

  • Phan truc 2021.xlsx
    41.2 KB · Đọc: 29
nhờ giúp. minh sắp lich trực tổ ,4 người à
mỗi ca 8h ,ngày 3 ca lam nguyên tháng ko được nghỉ ngày nào như vẫn đũ công trong tháng (tróng đó 4 hoặc 5 ngày chủ nhật là ngày nghỉ cả nghỉ bất kỳ ngày nào trong tuần)
. ca 3 chỉ dc 1 nguoi/ ca 2 cung 1 nguoi / c òn lại ca 1. như sắp sao. cho điều cân 3 ca. số ca 1,2,3 tương đối cân băng, file minh kem theo. giúp bản auto. điên ten nhân vien la ra ,xin giúp
 

File đính kèm

  • CA TRUC THANG 3.xlsx
    101.5 KB · Đọc: 23
Nhờ mọi người giúp tạo file sắp lịch trực gồm: 10 người. Trong đó: 03 người/01 ngày (01 người tổ trưởng trực cố định 1 ngày trực 2 ngày nghỉ; 09 người còn lại xoay tua từ t2 đến CN). Riêng t7 CN sẽ liên tục xoay tua (do có 10 người mà mỗi tuần như vậy sẽ có 06 người trực t7 CN, như vậy sẽ có người phải trực 02 tuần t7 CN liên tiếp).
Cảm ơn mọi người!
 
Bạn cho mình hỏi thêm 1 tí với, tại sao lại là mod/6 và mod/7 vậy? Ví dụ công ty của mình 35 người trực thì mình phải ban hành công thức thế nào? Mình cảm ơn bạn nhiều lắm
Bài đã được tự động gộp:

Bạn cho mình hỏi thêm 1 tí với, tại sao lại là mod/6 và mod/7 vậy? Ví dụ công ty của mình 35 người trực thì mình phải ban hành công thức thế nào? Mình cảm ơn bạn nhiều lắm
 
Dear các bác,
em mong muốn làm được một cái lịch trực ban cho cơ quan. bác nào làm rồi chia sẻ giúp em với!
Cơ quan em có 76 nhân viên (trong đó có 9 nhân viên nữ). Lịch trực ban phải được sắp xếp như sau:
- Mỗi ngày có 2 ca trực (ca ngày và ca đêm), mỗi ca 1 nhân viên trực.
- Nhân viên nữ chỉ trực ca ngày.

Em muốn sắp xếp lịch theo tháng xoay vòng. Mong các Pro chỉ giúp.
Anh HieuCD ơi, anh có thể giúp em vấn đề này được ko ạ?
 
Các Bro giúp giùm mình file này với.

-Mình có 14 đến 20 nhân sự.
-Và có 13 đến 14 nhóm.
-Mình cần phân bổ nhân sự đều các nhóm và thay đổi mỗi ngày cho đến hết tháng.
+ Riêng nhóm 4 và 6 cần 2 nhân sự.

Cảm ơn các bạn đã xem và hỗ trợ.
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom