Xin code VBA xếp lịch trực ca (1 người xem)

Liên hệ QC

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

moonlight1110

Thành viên mới
Tham gia
4/8/09
Bài viết
6
Được thích
0
Hi all,
Nhờ các cao thủ giúp em đoạn code VBA để xếp lịch trực ca cho phòng em theo nguyên tắc sau : Phòng em có 19 người trong đó có 5 nữ
- Mỗi ngày có 3 ca trực : ca 1, ca 2, ca 3
- Nữ không trực ca 2 và ca 3 và không trực thứ 7 và Chủ Nhật
- Tổng số ca của mỗi người phải bằng nhau hoặc chỉ hơn kém nhau 1 ca.
- Tổng số ca các ngày cuối tuần của các nhân viên nam là bằng nhau hoặc chỉ hơn kém nhau 1 ca
- Khoảng cách giữa 2 ca liền nhau của 1 nhân viên tối thiểu là 1 ngày.
- Riêng đối với nhân viên có tên Nguyễn Văn An thì ưu tiên trực ca 3 vào các ngày mùng 1, 11 và 21.
- Nhân viên nào trực ca 3 thì sẽ được nghỉ bù vào ngày làm việc tiếp theo.
Em gửi kèm file mẫu lịch trực ca để các anh, chị xem.
Em xin chân thành cảm ơn các cao thủ và sẽ hậu tạ !
 

File đính kèm

Bạn chưa nói mỗi ca trực mấy người!

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
 
Upvote 0
Hi bạn HYen7,
Mỗi ca trực 1 người bạn ah. Thanks bạn vì đã quan tâm chủ đề này.
 
Upvote 0
Bạn xem xét fương án sau

Đặt vấn đề: Mỗi tuần cần có 21 lần trực, nhưng bạn chỉ có 19 người, vậy sẽ có 2 người trực 2 lần trong tuần;
Vậy bạn cứ đánh số thứ tự cho danh sách, nhưng bố trí 5 cô nữ vô vị trí 1, 4, 7,. . .

Bố trí cho nữ như vậy để đảm bảo iêu cầu các chị này chỉ trực ca ngày vào 5 ngày trong tuần
Như vậy là xong cho fái nữ nha, năm người thay fiên nhau trực & xoay tua tự ên; sau mỗi tuần thì đôn người trực thứ 3 lên trực thứ 2 & cả tháng thì cũng vậy; trời kêu ai nấy dạ!

Còn 14 người nam thì cũng xoay tua cho họ (& xoay chỉ họ mà thôi)
Chuyện còn lại là chú í cho ông tướng chỉ chuyên trực ca đêm gì đó, thì ca trực gần đến ngày đó nhất (của chàng này) thì đổi cho người đang được xếp lịch trực ca đêm ngày đó, vậy thôi

Cứ bám vô ngày trong tuần mà bố trí bạn à! Còn chuyện thừa thiếu cuối tháng sẽ có nhưng không nhiều, chì hơn kém nhau 1 công trực mà thôi.

Chúc thành công.
 
Upvote 0
Hi bạn HYen17,
Cảm ơn bạn đã góp ý kiến, mình xin nói rõ để bạn hiểu ý của mình :
- Theo như ý kiến của bạn thì mình đồng ý 5 bạn nữ sẽ thay nhau trực vào 5 ngày làm hành chính, nhưng các ngày cuối tuần do các bạn nữ không trực nên các bạn nam phải trực thêm các ca 1 của các bạn nữ. Và nếu xoay tua các ca 1 này thì bài toán lại thêm phức tạp do phải đảm bảo yêu cầu số ca của mỗi người phải xấp xỉ nhau và các ca 1, 2, 3 cũng phải tương đương nhau và các ca cuối tuần cũng phải gần bằng nhau (không thì các bạn ý oánh mình chết mất vì tội xắp lịch ko công bằng...hic...hic).
- Còn bạn Nguyễn Văn An thì chỉ ưu tiên trực ca 3 vào các ngày mùng 1, 11 và 21 thôi còn các ngày khác thì vẫn trực bình thường chứ bạn này không phải chuyên trực ca đêm.
- Vấn đề xếp lịch trực ca này mình muốn dùng VBA để xếp lịch tự động chứ không phải mất công làm bằng tay sẽ rất mất thời gian sắp xếp.
Nếu được các cao thủ giúp đỡ thì mình chân thành cảm ơn.
 
Upvote 0
Bạn xem trong file & kiểm thử các tháng 2 hay 3 xem có ai khác thường không nha

[Thongbao]Hi bạn HYen17,
Cảm ơn bạn đã góp ý kiến, mình xin nói rõ để bạn hiểu ý của mình :
- Theo như ý kiến của bạn thì mình đồng ý 5 bạn nữ sẽ thay nhau trực vào 5 ngày làm hành chính, nhưng các ngày cuối tuần do các bạn nữ không trực nên các bạn nam phải trực thêm các ca 1 của các bạn nữ. Và nếu xoay tua các ca 1 này thì bài toán lại thêm phức tạp do phải đảm bảo yêu cầu số ca của mỗi người phải xấp xỉ nhau và các ca 1, 2, 3 cũng phải tương đương nhau và các ca cuối tuần cũng phải gần bằng nhau (không thì các bạn ý oánh mình chết mất vì tội xắp lịch ko công bằng...hic...hic).
- Còn bạn Nguyễn Văn An thì chỉ ưu tiên trực ca 3 vào các ngày mùng 1, 11 và 21 thôi còn các ngày khác thì vẫn trực bình thường chứ bạn này không phải chuyên trực ca đêm.
- Vấn đề xếp lịch trực ca này mình muốn dùng VBA để xếp lịch tự động chứ không phải mất công làm bằng tay sẽ rất mất thời gian sắp xếp.
Nếu được các cao thủ giúp đỡ thì mình chân thành cảm ơn.[/Thongbao]

Nam xoay tua theo danh sách nam; Nữ xoay tua theo Nữ


Macro hiện đang tính bắt đầu từ thứ hai đầu tiên của tháng hai cho đến hết
Để tính cho kì kế tiếp thì sẽ nói sau, tuỳ thuộc vô trình độ VBA của bạn

/(hà,, Khà, khà ,. . . . -\\/.
 

File đính kèm

Upvote 0
Hi bạn SA_DQ,
Macro của bạn mình thấy vẫn chưa đúng theo đầu bài mình đặt ra : Mình thống kê từ ngày 3/2 -> 3/3 ( đúng 4 tuần) thấy kết quả như sau :
- Các nhân viên nữ thì OK.
- Tổng số ca của 2 nhân viên nam có mã số 01N,02N chỉ có 3 ca trong khi đó tổng số ca của các NV nam khác đều từ 4 đến 5 ca ( lệch nhau tối thiểu chỉ được 1 ca).
- NV nam mã số 06N có số ca 3 lên đến 4 ca trong khi đó có nhiều NV nam khác có số ca 3 chỉ có 1 và 2 ca ( yêu cầu là tổng số ca 1,2,3 phải bằng nhau hoặc chỉ hơn kém nhau 1 ca)
- NV nam mã số 05N có số ca 2 lên đến 4 ca trong khi đó có nhiều NV nam khác có số ca 2 chỉ có 1 và 2 ca.
- Hàm Macro của bạn chưa tính đến trường hợp mình đặt ra ở đầu bài là có 1 bạn NV nam ưu tiên trực ca 3 vào các ngày mùng 1,11 và 21.
Thanks bạn vì đã giúp đỡ mình!
 
Upvote 0
Đó là bạn thống kê theo ngày ABC đến ngày DEF; Nhưng nếu bạn thống kê theo tháng thì số liệu sẽ khác;
Ta có thể bỏ chuyện xoay tua của nam thì macro sẽ điều tiết công trực trong tháng của nam sẽ tốt hơn.

Cái anh chàng NVA đó ta xử như sau:
Các ca đêm của những ngày này trong lịch của ai thì đổi cho chàng ta. Chuyện này macro rất khó thự hiện được.

& cái quan trọng là bạn có thể đọc & hiểu macro không, thì bạn chưa trả lời.
 
Upvote 0
Hi all,
Cái này là mình thống kê theo tháng đấy chứ ( đúng 4 tuần liền kề nhau), nếu sử dụng Macro này mà xếp lịch trực cho các bạn phòng mình thì các bạn phòng mình sẽ khiếu kiện ngay ( sorry bạn SA_DQ ). Mình cũng suy nghĩ nhiều để nghĩ cách viết code cho bài toán này nhưng mình vẫn chưa thành công, vì vậy phải nhờ đến các cao thủ trong diễn đàn.
Còn về trường hợp bạn ưu tiên trực ca đêm thì xin hỏi các cao thủ có cách nào để gán cố định ca 3 cho NV nam tên Nguyễn Văn An vào các ngày mùng 1, 11 và 21 được không nhỉ?
Thanks !
 
Upvote 0
01.00 tháng không fải 4 tuần, nó là 30.25 ngày, bạn à!
Còn chàng NV An để sau đi, lo cho 13 người còn lại cho khả dĩ rồi hãy tính tiếp.
Trong macro:

PHP:
Option Explicit
Sub FanTruc()
 Const NDau As Date = #2/3/2014#
 Dim sNu As String, sNam As String, MaT As String
 Dim J As Byte, Nu As Byte, Nam As Byte
 Dim Rng As Range, Cls As Range
 
 sNu = "N01N02N03N04N05"
 sNam = "01N02N03N04N05N06N07N08N09N10N11N12N13N14N"
 Sheets("Truc").Select
 Set Rng = Columns("A:A").Find(NDau, , xlValues, xlWhole)
 If Not Rng Is Nothing Then Set Rng = Range(Rng, Rng.End(xlDown))
 [c2].Resize([b2].CurrentRegion.Rows.Count, 3).Interior.ColorIndex = 2
 For Each Cls In Rng
    For J = 1 To 3
        If J = 1 Then
            If Weekday(Cls.Value) > 1 And Weekday(Cls.Value) < 7 Then
                Nu = Nu + 1
                MaT = Mid(sNu, 3 * Nu - 2, 3)
            Else
                Nam = Nam + 1
                MaT = Mid(sNam, 3 * Nam - 2, 3)
            End If
        ElseIf J > 1 Then
            Nam = Nam + 1
            MaT = Mid(sNam, 3 * Nam - 2, 3)
        End If
        With Cls.Offset(, 1 + J)
            .Value = MaT
            If MaT = "01N" Then .Interior.ColorIndex = 37
        End With
        If Nu = 5 Then
            Nu = 0:          sNu = Mid(sNu, 4, 13) & Left(sNu, 3)
        End If
        If Nam = 14 Then Nam = 0
        
        If Nam Mod 5 = 0 Then                   '<=|'
            sNam = Mid(sNam, 7, Len(sNam)) & Left(sNam, 6)
        End If
    Next J
    If Day(Cls.Value) Mod 10 = 1 And Day(Cls.Value) < 31 Then _
        Cls.Offset(, 4).Interior.ColorIndex = 38
 Next Cls
End Sub

Tại dòng lệnh có mũi tên, bạn thay lần lượt con số 5 & con số 0 bằng nhưng con số khác để tìm ra kết quả khả dĩ nhất trên bảng (Kết quả hiện ở vùng có hàm gắn sẵn í); Lưu í con số đầu không thể là 0 & nhỏ hơn hay bằng 14;
Con số thứ 2 sẽ nhận trị từ 0 cho đến số nhỏ hơn số đầu 1 đơn vị

Chúc bạn thành công
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mình thử bố trí bằng tay, bạn xem & góp í nghen:

Ngày|WEEK|Sáng|Chiều|Đêm
2/3/14|T2|Nu1|01N|02N
|T3|Nu2|03N|04N
|T4|Nu3|05N|06N
|T5|Nu4|07N|08N
|T6|Nu5|09N|10N
2/8/14|T7|01N|11N|12N
|CN|02N|13N|14N
|T2|Nu2|04N|03N
|..|...|@$@!^%|..
3/31/14|T2|Nu4|01N|02N


Khi đó ta có kết quả thống kê như sau:

Mã trực|Tổng|Đêm
01N|10|3
02N|10|6
03N|9|3
04N|9|5
05N|9|3
06N|9|5
07N|9|3
08N|9|5
09N|10|3
10N|10|5
11N|11|4
12N|11|5
13N|10|4
14N|10|5

Bạn xem & thử lên fương án điều chỉnh; Iêu cầu là cần có qui luật, để còn lập trình được.

Chúc ngày cuối tuần vui vẻ!
 
Upvote 0
Cảm ơn các bạn đã hỗ trợ mình giải quyết bài toán này,
Mình đã xem qua các kết quả và thấy rằng nếu xoay tua cả 14 NV nam này trong cả ca 2 và ca 3 thì để số các ca 2,3 cân bằng nhau thì phải thống kê với số lượng thời gian khá dài ( từ 6-7 tháng thì số lượng ca mới gần bằng nhau). Mình phát hiện ra rằng để số lượng ca 2 và 3 tương đương trong khoảng thời gian ngắn từ 1-2 tháng thì có thể chia 14 NV nam thành 2 group, mỗi group 7 NV và xoay tua theo quy luật : tuần đầu xoay tua các NV trong group 1 ở các ca 2, sau đó xoay tua các NV trong group 2 ở các ca 3 cùng ngày. Sau đó tuần tiếp theo thì xoay tua ngược lại, và cứ như vậy cho các tuần tiếp theo, còn ca 1 ở các ngày cuối tuần thì xoay tua cho cả 14 NV nam. Mình mới phát hiện ý tưởng này nhưng hiện mình đang bận nên chưa thể viết code cho ý tưởng này, lúc nào rỗi mình sẽ làm. Vậy nếu các bạn có thể thì giúp đỡ mình nhé.
Thanks các bạn nhìu !
 
Upvote 0
Được rồi đây,chúc mừng í tưởng của bạn!

Cách xài trang tính:

Tạo 2 cột liệt kê ngày đầu tháng & tăng dần ở cột [A] & cột cùng hàng là thứ trong tuần tương ứng

Sau đó kích hoạt ô có thứ hai trong tuần & cho chạy macro bằng tổ hợp fím tắt
 

File đính kèm

Upvote 0
Tuyệt vời, cảm ơn bạn SA_DQ
Macro của bạn cho kết quả đúng như y/c của đầu bài. Nhưng giờ mình muốn mở rộng ra bài toán như sau : nếu như công ty mình có thêm nhân viên mới hoặc bớt đi 1 hoặc nhiều nhân viên thì macro này có chạy được không. Mình đã thử và kết quả là trong trường hợp nếu thêm nhân viên thì macro vẫn chạy đúng nhưng nếu bớt đi 1 hoặc nhiều nhân viên thì macro không chạy được. Vậy nhờ các bạn giúp mình viết macro sao cho vẫn chạy đúng y/c với trường hợp thêm hoặc bớt nhân viên nhé.
Thanks các bạn !
 
Upvote 0
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 và không trực vào ngày nghỉ (t7&CN).

Em muốn sắp xếp lịch theo tháng xoay vòng. Mong các Pro chỉ giúp.
 
Upvote 0
Web KT

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

Back
Top Bottom