ページ移動:JavaScriptを有効にして下さい!
12.予約勤務

あらかじめ、指定日の勤務を予約できるようにします。

予約の指定方法行

指定は不可勤務と同じ大きさの表を挿入して、勤務名で指定できるようにします。
単一勤務の指定なので、入力用のリストは「入力規則」で設定。



追加される制約条件

予約表の勤務(数値に直した計算用の表)が、変化させるセルの値と一致していることが、追加の制約条件となります。
 (下図 セル I104
これは、すなわち、予約は計算時に変更されないことを意味します。


入力チェック

予約の実現より、入力される予約勤務のチェックの方が面倒です。

チェックする項目は下記の3つ
・不可勤務との重複 - 不可勤務に含まれる勤務を予約してはいけない - 下図赤の塗り潰しのセル
連続不可勤務との重複 - 予約勤務の並びが連続不可勤務になってはいけない - "連続不可勤務と一致"の行
・要員数との比較 - それぞれの予約勤務の総数が必要人数以下であること - "超過"の列

この条件を満たしていない場合、ソルバーは計算不能に陥ってしまいます。
(どのように試行しても禁止条件に抵触してしまうので・・)

入力チェックの詳細は次項にて説明。


チェック方法

配列数式などを使用して、けっこう複雑な数式となっています。
説明は順次追加していく予定。



シミュレーション結果
不可勤務、連続不可勤務、予約勤務、および指定の必要人数を全て満たした勤務シフト表が作成できました。
作成時間:約1分
 Intel(R) Core(TM) i3-3220 CPU @ 3.30GHz 3.30 GHz 64bit
 EXCEL2010 32bit


VBAコード部 変更/追加点のみ

実行時に予約表(勤務を数値に置き換えた計算用の表)の内容を、変化させるセルの表に転記します。
(転記した値が、予約表と一致していること=予約は変更されない が制約条件)

'--------------------------------------
' コマンドボタン制御
'--------------------------------------

Private Sub cmdGo_Click()
'
' 全自動実行
'  
    Dim StTime As Date
    Range("所要時間").Value = ""
    StTime = Time
    
    Do
        cmdInit_Click   '初期化
         
        If SolverDialog(True) >= 3 Then Exit Do '中止?
        If Val(Range("目的セル")) = 0 Then
            cmdReallocate_Click '均等再配置
            Exit Do
        End If
    Loop

    '--------------------------------------
    '終了
    '--------------------------------------
    Range("所要時間").Value = Time - StTime
    
    MsgBox "処理終了!", , "終了"
    
End Sub

Private Sub 予約転記()
'
' 予約勤務を数値に変換して「変化させるセル」に転記
'

    Application.ScreenUpdating = False  '画面更新停止
    
    Dim r As Integer, c As Integer
    Dim Src
    Src = Range("予約勤務")
    With Range("変化させるセル")
        For r = 1 To .Rows.Count
            For c = 1 To .Columns.Count
                If Src(r, c) <> "" Then
                    .Cells(r, c) = CStr(Src(r, c))
                End If
            Next c
        Next r
    End With

    Application.ScreenUpdating = True  '画面更新再開
    
End Sub


Private Sub cmdInit_Click() 'ソルバー実行
    Range("変化させるセル").ClearContents
    Call 予約転記
End Sub

次項では、予約勤務の入力チェック方法を考えます。

ページ移動:JavaScriptを有効にして下さい!

関連

×
PageTop