Code sắp lịch trực bị lỗi trùng 1 ngày trực 2 ka (1 người xem)

Liên hệ QC

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

Excel365

Thành viên tích cực
Tham gia
29/10/10
Bài viết
865
Được thích
127
Giới tính
Nam
Em có thử làm đoạn code chia ka (sheet Code),
Cột A = Ngày
Từ cột B:D = Ka 1
Từ cột E:G = Ka 2
Từ cột H:J = Ka 3

-Các số trong đó là tên của nhân viên trực 10 người (từ số 1, 2, …10)
-Ds có 10 người, chia làm 3 ka trực, mỗi ka 3 người.
-1 người trực liên tục 6 ngày thì được nghỉ 1 ngày, nhưng đến ngày thứ 5 thì lại có trường hợp 1 ngày lại có 2 người trực 2 ka (K1-K3)
nay nhờ các anh chị xem và giúp em chỉnh sữa lại giúp em,
1- Gán danh sách tên cụ thể từ 1 vùng nào đó ( VD: danh sách tên người trực ở Vùng A1:A10, danh sách này luôn thay đổi, có thể nhiều hoặc ít hơn 10 người). Số ngày trong tháng thay đổi tùy theo tháng
2- Chuyển sang dạng trình bày như ở trên (vùng tô màu)
3-Không cho 1 người trực 2 ka trong 1 ngày'
Trân trọng
Link
P/s: em đã điều chỉnh link. Rất mong được sự giúp đỡ của các anh chị
 
Lần chỉnh sửa cuối:
Em có thử làm đoạn code chia ka (sheet Code),
Cột A = Ngày
Từ cột B:D = Ka 1
Từ cột E:G = Ka 2
Từ cột H:J = Ka 3

-Các số trong đó là tên của nhân viên trực 10 người (từ số 1, 2, …10)
-Ds có 10 người, chia làm 3 ka trực, mỗi ka 3 người.
-1 người trực liên tục 6 ngày thì được nghỉ 1 ngày, nhưng đến ngày thứ 5 thì lại có trường hợp 1 ngày lại có 2 người trực 2 ka (K1-K3)
nay nhờ các anh chị xem và giúp em chỉnh sữa lại giúp em,
1- Gán danh sách tên cụ thể từ 1 vùng nào đó ( VD: danh sách tên người trực ở Vùng A1:A10, danh sách này luôn thay đổi, có thể nhiều hoặc ít hơn 10 người). Số ngày trong tháng thay đổi tùy theo tháng
2- Chuyển sang dạng trình bày như ở trên (vùng tô màu)
3-Không cho 1 người trực 2 ka trong 1 ngày'
Trân trọng
Link

Không tải được file---
 
Upvote 0
Em đã cập nhật lai link ở bài 1. Rất mong được sự giúp đỡ của các anh chị

10 ngày = 100 công
6 công nghỉ 1 ngày => tổng ngày nghỉ =100/6 ~ 16 ngày nghỉ

Số ngày nghỉ > ngày làm việc => số người nghỉ trong 1 ngày có khả năng >1
=> sẽ có ngày số người làm việc <9 => việc chia 3 người/ca không đủ.

Có lẽ phải quy ước lại số ngày làm việc / ngày nghỉ. Bạn kiểm tra lại xem sao.
 
Upvote 0
10 ngày = 100 công
6 công nghỉ 1 ngày => tổng ngày nghỉ =100/6 ~ 16 ngày nghỉ

Số ngày nghỉ > ngày làm việc => số người nghỉ trong 1 ngày có khả năng >1
=> sẽ có ngày số người làm việc <9 => việc chia 3 người/ca không đủ.

Có lẽ phải quy ước lại số ngày làm việc / ngày nghỉ. Bạn kiểm tra lại xem sao.
Cám ơn gtri đã quan tâm
Mục đích của em là làm sao để số người trực / 3 ka phải luôn là 9. và Số ngày nghỉ / tháng thì nó tùy thuộc vào số ngày Chủ nhật của tháng, bình quân thì khoảng 4 ngày nghỉ trên tháng đó anh.
Nhưng trực liên tục 6 ngày thì phải được nghỉ 1 ngày. Và trường hợp trực 2 ka / ngày thì phải cách nhau 1 ka mới được trực tiếp (Vd: trực Ka 1 xong thì phải xuống Ka 3 mới được trực tiếp)
Trân trọng
 
Upvote 0
Tôi làm trên file của bạn
(1) để kiểm tra 1 người bị double ca trong một ngày thì sau khi nhập dữ liệu xong, bấm nút "KT Double Ca" để kiểm tra ở sheet(code)
(2) sau khi kiểm tra xong qua sheet(help) bấm nút "Xem Lich" là ok

chúc bạn thành công!
 

File đính kèm

Upvote 0
Tôi làm trên file của bạn
(1) để kiểm tra 1 người bị double ca trong một ngày thì sau khi nhập dữ liệu xong, bấm nút "KT Double Ca" để kiểm tra ở sheet(code)
(2) sau khi kiểm tra xong qua sheet(help) bấm nút "Xem Lich" là ok

chúc bạn thành công!
Cám ơn bạn
Nhưng ý mình là muốn sắp lịch trực làm sao để cho 9 người trực / 3 ka ạ
Mình xem thì code của bạn là kiểm tra xem trường hợp trực 2 ka /ngày. Còn bên sheet Help là sắp xếp lại, nhưng nếu sắp Xếp lại thì những trường hợp trực 2 ka trên ngày thì mình sẽ ghi ký hiệu của 2 ka luôn được không ạ (VD: trực Ka 1 và 3, sẽ ghi ký hiệu là K1-K3)
P/s: Code kiểm tra hình như chỉ kiểm tra đươcj trường hợp đầu tiên. Các trường hợp sau không thông báo trùng
 
Lần chỉnh sửa cuối:
Upvote 0
Em có thử làm đoạn code chia ka (sheet Code),

3-Không cho 1 người trực 2 ka trong 1 ngày'
(1) bạn nói chiện mâu thuẫn, không cho một người trực 2 ka trong một ngày vậy lòi đâu ra ("K1-K3")
(2) bạn đã bấm nút"KT Double Ca" nhiều lần chưa? mà bảo nó chỉ kt được dòng đầu tiên...
 
Upvote 0
(1) bạn nói chiện mâu thuẫn, không cho một người trực 2 ka trong một ngày vậy lòi đâu ra ("K1-K3")
(2) bạn đã bấm nút"KT Double Ca" nhiều lần chưa? mà bảo nó chỉ kt được dòng đầu tiên...
Em đã bấm nhiều lần rồi, nhưng cũng chỉ thông báo "Trùng tên 9 vào ngày 6". Sở dỉ em hỏi trường hợp điêng "K1-K3" là do ngày 6 chỉ có 7 người trực (bên sheet Help), mà mỗi ka thì lại có tới 3 người trực, vậy 1 ngày có tới 9 người trực mới đúng, ... Với lại khi em bấm Xem Lich thì có 1 số trường hợp trực tới 10 ngày liên tục, mới nghỉ, (VD: Người thứ 6, trực từ ngày 16-25). Ý em muốn là chỉ trực tối đa là 6 ngày thì sẽ được nghỉ 1 ngày. Trân trọng cảm ơn.
 
Upvote 0
Em đã bấm nhiều lần rồi, nhưng cũng chỉ thông báo "Trùng tên 9 vào ngày 6". Sở dỉ em hỏi trường hợp điêng "K1-K3" là do ngày 6 chỉ có 7 người trực (bên sheet Help), mà mỗi ka thì lại có tới 3 người trực, vậy 1 ngày có tới 9 người trực mới đúng, ... Với lại khi em bấm Xem Lich thì có 1 số trường hợp trực tới 10 ngày liên tục, mới nghỉ, (VD: Người thứ 6, trực từ ngày 16-25). Ý em muốn là chỉ trực tối đa là 6 ngày thì sẽ được nghỉ 1 ngày. Trân trọng cảm ơn.
(1)"Trung ten 9 vao ngay 6" bạn sửa xong cho khỏi trùng thì bấm tiếp...xem có báo nữa không, chứ dữ liệu bạn nhập nhiều mà tôi cho code lọc chạy hết dữ liệu trùng thì bạn cũng bực mình, bạn có biết là bạn nhập double ca bao nhiêu tên không?, còn nếu muốn nói đến trường hợp riêng đối với tôi chỉ có một cách đó là : ở sheetcode cho tối đa mỗi người làm một ngày 2 ca,quá thì báo cho bạn biết
(2): vấn đề một người làm tối đa 6 ngày một ngày nghỉ đó là do bạn nhập dữ liệu nguồn vào chứ sao hỏi tôi được.
 
Upvote 0
Nếu muốn sheetcode như vậy thì xem code này ở sheet đó...chỉ cần thêm những chỗ tô màu đỏ vào!
Mã:
Private Sub CommandButton1_Click()Dim ArN()
Dim rEnd As Long, i As Long, m As Long, k As Long
rEnd = [a10000].End(xlUp).Row
ArN = Range("b1:j" & rEnd)
    For i = 1 To UBound(ArN, 1)
        For m = 1 To 9
[COLOR=#ff0000]            k = 0[/COLOR]
            For n = m + 1 To 9
                If ArN(i, m) = ArN(i, n) Then
                    k = k + 1
[COLOR=#ff0000]                    If k > 1 Then[/COLOR]
                        MsgBox ("Trung Ten " & ArN(i, m) & " Vao Ngay " & Cells(i, 1) & "")
                    End If
                End If
[COLOR=#ff0000]                If k > 1 Then Exit For[/COLOR]
            Next n
        Next m
    Next i
End Sub
 
Upvote 0
(1)"Trung ten 9 vao ngay 6" bạn sửa xong cho khỏi trùng thì bấm tiếp...xem có báo nữa không, chứ dữ liệu bạn nhập nhiều mà tôi cho code lọc chạy hết dữ liệu trùng thì bạn cũng bực mình, bạn có biết là bạn nhập double ca bao nhiêu tên không?, còn nếu muốn nói đến trường hợp riêng đối với tôi chỉ có một cách đó là : ở sheetcode cho tối đa mỗi người làm một ngày 2 ca,quá thì báo cho bạn biết
(2): vấn đề một người làm tối đa 6 ngày một ngày nghỉ đó là do bạn nhập dữ liệu nguồn vào chứ sao hỏi tôi được.

Vì vậy nãy giờ em và tờ rung hiểu nhằm ý của nhau rồi, ý em muốn là nhờ các anh chị giúp em chỉnh sữa code trong Module 1 của em để có thể chia ka như các yêu cầu của em ở các bài trên, sau khi chia ka xong thì chuyển sang xem công như ở sheet Help (cái này thì tờ rung đã làm rồi). Như vậy chỉ còn việc chia ka cho 10 người, 1 ngày có 3 ka, 3 người/ka, 1 người làm việc 6 ngày liên tục thì sẽ được nghỉ 1 ngày.
Trân trọng cảm ơn
 
Upvote 0
Cám ơn gtri đã quan tâm
Mục đích của em là làm sao để số người trực / 3 ka phải luôn là 9. và Số ngày nghỉ / tháng thì nó tùy thuộc vào số ngày Chủ nhật của tháng, bình quân thì khoảng 4 ngày nghỉ trên tháng đó anh.
Nhưng trực liên tục 6 ngày thì phải được nghỉ 1 ngày. Và trường hợp trực 2 ka / ngày thì phải cách nhau 1 ka mới được trực tiếp (Vd: trực Ka 1 xong thì phải xuống Ka 3 mới được trực tiếp)
Trân trọng

Bài này cũng không có gì nhưng giờ hơi kẹt, chắc mai sẽ gửi bài.
 
Upvote 0
Mình không tham gia từ đầu nên có thể có sai sót không đúng ý . Bạn tham khảo code chia ca của mình xem sao. Mình viết lại cho đơn giản chứ Code của bạn phức tạp quá.
Mã:
Sub ChiaCa()
Dim Ngay, Nguoi, Nghi, Kq(), i, j
ReDim Kq(1 To 31, 1 To 10)
Nghi = InputBox("Nhap nguoi nghi dau thang ( 1 - 10)")
For Ngay = 1 To 31
Kq(Ngay, 1) = Ngay
For i = 2 To 10
Nguoi = (Nghi + Ngay + i - 2) Mod 10
If Nguoi = 0 Then Nguoi = 10
Kq(Ngay, i) = Nguoi
Next
Next
Sheet1.[A1].Resize(31, 10) = Kq
End Sub
 

File đính kèm

Upvote 0
Mình không tham gia từ đầu nên có thể có sai sót không đúng ý . Bạn tham khảo code chia ca của mình xem sao. Mình viết lại cho đơn giản chứ Code của bạn phức tạp quá.
Mã:
Sub ChiaCa()
Dim Ngay, Nguoi, Nghi, Kq(), i, j
ReDim Kq(1 To 31, 1 To 10)
Nghi = InputBox("Nhap nguoi nghi dau thang ( 1 - 10)")
For Ngay = 1 To 31
Kq(Ngay, 1) = Ngay
For i = 2 To 10
Nguoi = (Nghi + Ngay + i - 2) Mod 10
If Nguoi = 0 Then Nguoi = 10
Kq(Ngay, i) = Nguoi
Next
Next
Sheet1.[A1].Resize(31, 10) = Kq
End Sub
Cám ơn anh đã giúp đỡ, code đơn giản hơn rất nhiều,
Nhưng làm sao để cho 1 người trực liên tục 6 ngày thì ngày thứ 7 sẽ được nghỉ, nhưng đảm bảo 1 ka có 3 người trực. (Hiện tại 1 có 1 người trực liên tục 9 ngày mới được nghỉ, Vd như người thứ 3, trực từ ngày 4-12).
Có thể xoay bảng sang dạng bảng Ngang như bên Sheet Help được không anh
 
Upvote 0
Mình thấy yêu cầu của bạn bị mâu thuẫn rồi đấy. Thực sự không thể làm được điều đó, suy luận cũng ra:

10 người mỗi ngày phải có 9 người làm và 1 người nghỉ. Sau 10 ngày thì mới được nghỉ 1 lần nếu không sẽ thiếu người trực.
Cụ thể hơn: Bình quuan 1 tháng 30 ngày sẽ có 270 ca trực và 30 ca được nghỉ, tổng số ca 1 tháng là 300 ca. Nếu vòng ca 7 ngày thì mỗi người đươc nghỉ là 4,3 ngày và số ca tăng thành 318,7 ca. Vậy thì lấy người đâu ra mà trực?

Cong việc xoay ngang xoay dọc thì ta sử là được thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình thấy yêu cầu của bạn bị mâu thuẫn rồi đấy. Thực sự không thể làm được điều đó, suy luận cũng ra:

10 người mỗi ngày phải có 9 người làm và 1 người nghỉ. Sau 10 ngày thì mới được nghỉ 1 lần nếu không sẽ thiếu người trực.
Cụ thể hơn: Bình quuan 1 tháng 30 ngày sẽ có 270 ca trực và 30 ca được nghỉ, tổng số ca 1 tháng là 300 ca. Nếu vòng ca 7 ngày thì mỗi người đươc nghỉ là 4,3 ngày và số ca tăng thành 318,7 ca. Vậy thì lấy người đâu ra mà trực?

Cong việc xoay ngang xoay dọc thì ta sử là được thôi.
Nếu vậy Giả sử cho cho 1 người trực 2 ka / ngày, nhưng phải cách nhau 1 ka, liệu như vậy có đáp ứng được vấn đề 6 ngày liên tục thì nghỉ 1 ngày không anh. Nhưng trường hợp 1 người trực 2 ka/ngày thì hạn chế
 
Upvote 0
Và trường hợp trực 2 ka / ngày thì phải cách nhau 1 ka mới được trực tiếp (Vd: trực Ka 1 xong thì phải xuống Ka 3 mới được trực tiếp)
Trân trọng
Tạm thời code theo ý tưởng này của bạn.
Thời gian làm việc trong tháng tạm lấy = 30 ngày
Nếu đúng yêu cầu, có thể dùng index() điền tên nhân viên vào bảng.

Mã:
Public Sub Truc_Ca()
Dim NVien, Truc, kq(), r As Long, c As Long, i, j

NVien = 10: Truc = 7
ReDim kq(1 To NVien, 1 To 30)

For c = 1 To UBound(kq, 2)
If c Mod Truc = 0 Or c Mod Truc > NVien - Truc + 1 Then
j = j + 1
Else
j = 0
End If

For r = 1 To UBound(kq)
If (c + r - 1) Mod Truc Then
If j = 0 Then
kq(r, c) = "K" & (r - i - 1) Mod 3 + 1 & ((r - i - 1) \ 3 + 1)
Else
kq(r, c) = "K" & (r - i) Mod 3 + 1 & ((r - i - 1) \ 3 + 1)
If kq(r, c) = "K3" & j Then kq(r, c) = "K3" & j & " " & "K13"
End If
Else
i = i + 1
End If
Next r

i = 0
Next c

Sheet3.Range("A1").CurrentRegion.ClearContents
With Sheet3.Range("A1").Resize(UBound(kq), 30)
.Value = kq
.ColumnWidth = 5
.RowHeight = 25
.Borders.LineStyle = 1
.WrapText = True
End With
End Sub
 

File đính kèm

Upvote 0
Tạm thời code theo ý tưởng này của bạn.
Thời gian làm việc trong tháng tạm lấy = 30 ngày
Nếu đúng yêu cầu, có thể dùng index() điền tên nhân viên vào bảng.

Mã:
Public Sub Truc_Ca()
Dim NVien, Truc, kq(), r As Long, c As Long, i, j

NVien = 10: Truc = 7
ReDim kq(1 To NVien, 1 To 30)

For c = 1 To UBound(kq, 2)
If c Mod Truc = 0 Or c Mod Truc > NVien - Truc + 1 Then
j = j + 1
Else
j = 0
End If

For r = 1 To UBound(kq)
If (c + r - 1) Mod Truc Then
If j = 0 Then
kq(r, c) = "K" & (r - i - 1) Mod 3 + 1 & ((r - i - 1) \ 3 + 1)
Else
kq(r, c) = "K" & (r - i) Mod 3 + 1 & ((r - i - 1) \ 3 + 1)
If kq(r, c) = "K3" & j Then kq(r, c) = "K3" & j & " " & "K13"
End If
Else
i = i + 1
End If
Next r

i = 0
Next c

Sheet3.Range("A1").CurrentRegion.ClearContents
With Sheet3.Range("A1").Resize(UBound(kq), 30)
.Value = kq
.ColumnWidth = 5
.RowHeight = 25
.Borders.LineStyle = 1
.WrapText = True
End With
End Sub
Cám ơn gtri nhiều, chúc bạn ngày mới vui vẻ
Về việc chia ngày nghỉ như vậy là đúng ý em rồi, nhưng có trường hợp em không hiểu là
K11: là người thứ 1, ka 1
K12: là người thứ 1, ka 2 (cái này hình như Gtri ghi lộn)
K13: là người thứ 1, ka 3
như vậy là chỉ có 3 người, trực 3 ka. Nhưng danh sách của em tới 10 người trực, 1 ka trực phải có 3 người, 1 ngày là 3 ka, vậy 1 ngày phải có tới 9 người trực.
Trường hợp của anh thì chỉ có 3 người trực / 3 ka
Nhờ anh xem lại giúp em
Trân trọng!
 
Upvote 0
Cám ơn gtri nhiều, chúc bạn ngày mới vui vẻ
Về việc chia ngày nghỉ như vậy là đúng ý em rồi, nhưng có trường hợp em không hiểu là
K11: là người thứ 1, ka 1
K12: là người thứ 1, ka 2 (cái này hình như Gtri ghi lộn)
K13: là người thứ 1, ka 3
như vậy là chỉ có 3 người, trực 3 ka. Nhưng danh sách của em tới 10 người trực, 1 ka trực phải có 3 người, 1 ngày là 3 ka, vậy 1 ngày phải có tới 9 người trực.
Trường hợp của anh thì chỉ có 3 người trực / 3 ka
Nhờ anh xem lại giúp em
Trân trọng!

Giải thích lại tí
K11 là ca thứ 1, người 1
K12 vẫn trong ca thứ 1 nhưng là người thứ 2
K13 vẫn trong ca thứ 1 nhưng là người thứ 3

Tức là mỗi cột là 1 ngày, hai ký tự đầu là thứ tự ca trực, ký tự sau cùng là thứ tự người trong danh sách
Ví dụ có 3 người ca 1 tên A,B,C
=>
K11=ca thứ 1, người A
K12= ca thứ 1, người B
K13= ca thứ 1, người C

Đưa thêm chỉ số để gặp ngày 1 người trực 2 thì ca luân chuyển cho dễ và lọc tên theo danh sách cũng dễ hơn.
 
Upvote 0
Web KT

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

Back
Top Bottom