返回列表 上一主題 發帖

[發問] 請問編排勤務班表問題

[發問] 請問編排勤務班表問題

請問各位excel神人,方便請問一下班表排班函數的設計嗎
排班方式如下:
假如本單位人數為27人,編排勤務是以編號編排的

上班人數為總人數扣掉輪休+差假+休假(即紫色劃線部分)的人皆以號碼表示
而外宿者則在18點後放假,即填寫在外宿處填寫外宿人員號碼(橘線處)且18時之後不會出現在勤務編排上
待命服勤處(綠線)為左側已編排勤務剩下之上班人號碼(紅線),通訊幕僚為待命服勤最前方第一個人編號(藍線)
105.4.1.rar (18.95 KB)

不知道這樣表達是否清楚
小弟只是想減輕主管排班的辛勞,畢竟主管有點年紀了,謝謝

回復 1# 馬納
我完成的第二版,程式碼如下,請指教!

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    For j = 0 To 23
            Cells(9 + j, 19) = "01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,"
        For i = 0 To 11
              '刪除輪休
              If Cells(34, 4 + i) <> "" Then
                  Cells(9 + j, 19) = Replace(Cells(9 + j, 19), Cells(34, 4 + i) & ",", "")
              End If
            
              '刪除外宿
              If Cells(35, 4 + i) <> "" Then
                  Cells(9 + j, 19) = Replace(Cells(9 + j, 19), Cells(35, 4 + i) & ",", "")
              End If
            
              '刪除差假
              If Cells(34, 19 + i) <> "" Then
                  Cells(9 + j, 19) = Replace(Cells(9 + j, 19), Cells(34, 19 + i) & ",", "")
              End If
              
              '刪除休假
              If Cells(35, 19 + i) <> "" Then
                  Cells(9 + j, 19) = Replace(Cells(9 + j, 19), Cells(35, 19 + i) & ",", "")
              End If
        Next i
        
        '刪除已派
        For i = 0 To 13
              If Cells(9 + j, 5 + i) <> "" Then
                  Cells(9 + j, 19) = Replace(Cells(9 + j, 19), Cells(9 + j, 5 + i) & ",", "")
              End If
        Next i
        For i = 0 To 1
             If Cells(9 + j, 29 + i) <> "" Then
                  Cells(9 + j, 19) = Replace(Cells(9 + j, 19), Cells(9 + j, 29 + i) & ",", "")
              End If
        Next i
        
        
        '設定職務派任清單
        With Range(Cells(9 + j, 4), Cells(9 + j, 15)).Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Cells(9 + j, 19)
        End With
        With Range(Cells(9 + j, 29), Cells(9 + j, 30)).Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Cells(9 + j, 19)
        End With
    Next j
End Sub

TOP

回復 1# 馬納
第二版VBA程式碼放在Worksheet_SelectionChange中,只要該時段有輪休、外宿.....,在設勤務時可用下拉式清單

TOP

雖然我回答不了樓一樓大大的問題
不過說真的
這張表我之前有研究過一小段時間(應該跟大大是同道中人)
事實証明了一件事
就是變化大於計劃
函數寫愈多
臨時勤務要修正就愈麻煩

TOP

本帖最後由 ML089 於 2016-4-9 22:24 編輯

橘色區公式,下拉複製
S9 =MID(AH9,2,99)                               
AG9 =MID(AH9,2,99)
                                                                                                                               
黃色區公式,先右拉27格(看有多少人數),在整個下拉複製                                                                       
AH9 =IF(ISERROR(FIND("."&COLUMN(A1)&".",TRIM("."&$E9&"."&$G9&"."&$I9&"."&$K9&"."&$M9&"."&$O9&"."&$Q9&"."&$D$34&"."&$S$34&"."&$S$35&"."))),"."&COLUMN(A1),"")&AI9


http://www.FunP.Net/992889
{...} 表示需要用 CTRL+SHIFT+ENTER 三鍵輸入公式

TOP

小弟初試VBA,請您指教
Sub s1()
    Worksheets("勤務表").Select
    For j = 0 To 23
            Cells(9 + j, 19) = "01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,"
        For i = 0 To 11
              '刪除輪休
              If Cells(34, 4 + i) <> "" Then
                  Cells(9 + j, 19) = Replace(Cells(9 + j, 19), Cells(34, 4 + i), "")
              End If
            
              '刪除外宿
              If Cells(35, 4 + i) <> "" Then
                  Cells(9 + j, 19) = Replace(Cells(9 + j, 19), Cells(35, 4 + i), "")
              End If
            
              '刪除差假
              If Cells(34, 19 + i) <> "" Then
                  Cells(9 + j, 19) = Replace(Cells(9 + j, 19), Cells(34, 19 + i), "")
              End If
              
              '刪除休假
              If Cells(35, 19 + i) <> "" Then
                  Cells(9 + j, 19) = Replace(Cells(9 + j, 19), Cells(35, 19 + i), "")
              End If
        Next i
        
        '刪除已派
        For i = 0 To 13
              If Cells(9 + j, 5 + i) <> "" Then
                  Cells(9 + j, 19) = Replace(Cells(9 + j, 19), Cells(9 + j, 5 + i), "")
              End If
        Next i
        For i = 0 To 1
             If Cells(9 + j, 29 + i) <> "" Then
                  Cells(9 + j, 19) = Replace(Cells(9 + j, 19), Cells(9 + j, 29 + i), "")
              End If
        Next i


    Next j
End Sub

TOP

回復 3# 馬納

排班必須考慮到的條件很多
扣除無法排入的人員,其餘上班人員其勤務順序,每人值班時數,每人是否特定職務等問題均須考量
目前附件中的排班似乎沒有一個準則可循
若休假後回來值勤又該如何插入排班的規則又是如何?
種種問題必須整理出他的規則,才可能用程式來做
是否能將這些問題敘述清楚,才能進一步討論
另有一問題就是你班表內取得的編號又可能是以點作連結來表示多人
這樣的字串也會增加函數的困難
學海無涯_不恥下問

TOP

回復 2# tku0216


總人數為27人,班表上以1.2.3.4.5.....25.26.27 表示
應該是待命服勤處 08-18 時,顯示為總人數編號扣掉休假+差假+輪休再扣掉已編排小時內勤務人數
EX:休假人員為4.7.22 差假3.14.25  輪休1.5.8.15.16.17.20.24
上班人為2.6.9.10.11.12.13.18.19.21.23.26.27   
08-10時 值班10  駕訓21 救護12.27   待命服勤2.6.9.11.13.18.19.21.23.26

而18-08時 待命服勤則須在扣除外宿人員編號

不知道這樣表示是不是正確,我EXCEL一直停在基本函數部分而已...

所以我是覺得函式應該是寫在待命服勤欄位,但是不知道如何挑出未排勤務之編號

TOP

回復 1# 馬納


    不大了解你的需求,所以你是要設計哪個地方的函式?

TOP

        靜思自在 : 難行能行,難捨能捨,難為能為,才能昇華自我的人格。
返回列表 上一主題