Option Explicit
Private Sub cmd成功例転記_Click()
Sheets("検証データ").Range("成功例_調整").Copy Destination:=Range("変化させるセル")
End Sub
'--------------------------------------
' ワークシート制御
'--------------------------------------
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'
' ワークシートセルの選択位置が変更された場合の処理
'
Dim myCell As Range
Dim tmp
Dim No As Integer
For Each myCell In Target 'はみ出していたら処理しない
If Application.Intersect(Range("不可勤務"), myCell) Is Nothing Then
Unload frm不可勤務
Exit Sub
End If
Next
' 不可勤務内のみを選択した場合の処理
Set rngSelect = Target '選択セル
With frm不可勤務
.Show vbModeless
Dim k As Integer
Dim Kinmus As String
' 選択域の値がすべて同じかを調べる
Kinmus = Target.Cells(1)
For k = 2 To Target.Cells.Count
If Kinmus <> Target.Cells(k) Then '1番目と異なる?
Kinmus = ""
Exit For
End If
Next k
With .ListBox1
For k = 0 To .ListCount - 1 '選択を全て解除
.Selected(k) = False
Next k
tmp = Split(Kinmus, ",") 'カンマ分割
For k = 0 To UBound(tmp)
No = KinmuNo(CStr(tmp(k)))
If No > 0 Then
.Selected(No - 1) = True
End If
Next k
End With
End With
End Sub
'--------------------------------------
' コマンドボタン制御
'--------------------------------------
Private Sub chk前旬列表示_Click()
Application.Goto Reference:="前旬列"
Selection.EntireColumn.Hidden = Not chk前旬列表示.Value
End Sub
Private Sub cmdデータ転記_Click()
'
' 今旬末1週間のデータを先旬に転記
'
If MsgBox("今旬末1週間のデータを先旬に転記します。よろしいですか?", vbOKCancel, "データ転記") = vbOK Then
Dim Col As Integer '今旬末1週間の開始列番号
With Range("変化させるセル")
Col = .Range("a1").Column + .Columns.Count - 7
End With
With Range("前旬")
.Value = .Offset(0, Col - .Column).Value
End With
End If
End Sub
Public Sub cmd勤務色更新_Click()
SetKinmuCellColor ActiveSheet.Range("出力")
End Sub
Private Sub cmd個別実行_Click()
frm個別実行.Show vbModeless
End Sub
Public Sub cmdGo_Click()
'
' 全自動実行
'
Dim StTime As Date, TryCount As Integer
Dim Msg As String, msg_Opt As String
Dim rc As Integer
Dim MaxTimeNoImp As Integer 'ソルバーで解決を続行する最大時間:秒単位
Dim MaxTimeNoImp_Org As Integer '同、退避
TryCount = 1
msg_Opt = "" '追加メッセージ
MaxTimeNoImp_Org = SolverGet(TypeNum:=29) '既存値退避
MaxTimeNoImp = TIME_NO_IMP_INIT '初期値
StTime = DateTime.Time
Do
Range("MSG").Value = DispMsg("確保中…", TryCount, StTime)
初期化 'ソルバー初期化
条件設定_確保
SolverOptions , , , , , , , , , , , , , , , , , , , , MaxTimeNoImp
rc = Solver_Solve(True) '実行
If rc >= 3 Then
msg_Opt = "キャンセル "
Exit Do '中止?
End If
If Val(Range("目標_過不足")) = 0 Then
If Val(Range("条件_確保")) = 0 Then
If chk途中停止.Value Then
If MsgBox("確保成功!" & vbCrLf & vbCrLf & "続けて「勤務日数自動調整」を行いますか?", vbYesNo, "続行確認") = vbNo Then
msg_Opt = "確保成功!"
Exit Do
End If
End If
If 勤務日数自動調整 = 0 Then
If chk途中停止.Value Then
If MsgBox("調整成功!" & vbCrLf & vbCrLf & "続けて「均等最適化」を行いますか?", vbYesNo, "続行確認") = vbNo Then
msg_Opt = "調整成功!"
Exit Do
End If
End If
Range("MSG").Value = "最適化中…"
Call reAllocate("変化させるセル", "条件_最適化", "目標_最適化") '均等再配置
msg_Opt = "完了"
Exit Do
End If
End If
End If
TryCount = TryCount + 1 '試行回数
If MaxTimeNoImp < TIME_NO_IMP_MAX Then MaxTimeNoImp = MaxTimeNoImp + 15
Loop
MyEnd:
'--------------------------------------
'終了
'--------------------------------------
' SolverOptions , , , , , , , , , , , , , , , , , , , , MaxTimeNoImp_Org '復元
SetKinmuCellColor ActiveSheet.Range("出力") '勤務色更新
Msg = DispMsg(msg_Opt, TryCount, StTime)
Range("MSG").Value = Msg
MsgBox "処理終了!" & vbNewLine & vbNewLine & Msg, , "終了"
End Sub
Public Function 勤務日数自動調整() As Integer
Dim i As Integer
Dim Msg As String
条件設定_日数調整
Msg = "調整不良!"
For i = 1 To 10
Range("MSG").Value = "調整中…" & i
DoEvents
If SolverSolve(True) >= 3 Then
Msg = "中止!"
Exit For '実行
End If
If Range("目標_予定数差") = 0 Then
Msg = "調整完了!"
Exit For
End If
Range("MSG").Value = "ランダム入替中…"
Call randomReAllocate("変化させるセル", "条件_調整", 3) 'ランダム入れ替え
Next i
Range("MSG").Value = Msg
勤務日数自動調整 = Range("目標_予定数差")
End Function
Private Function DispMsg(msg_Opt As String, TryCount As Integer, StTime As Date)
DispMsg = msg_Opt & TryCount & "回目 " & Format(DateTime.Time - StTime, "hh:nn:ss")
End Function
'----------------------------------------------
' 初期化
'----------------------------------------------
Public Sub 初期化() '初期化
Application.Calculation = xlCalculationAutomatic
Range("変化させるセル").ClearContents
Call 予約転記
SetKinmuCellColor ActiveSheet.Range("出力") '出力色
DoEvents
End Sub
'----------------------------------------------
' 条件設定
'----------------------------------------------
Public Sub 条件設定_確保()
' 確保条件
SolverReset '既定値にリセット
SolverOk SetCell:=Range("目標_過不足"), MaxMinVal:=2, ByChange:=Range("変化させるセル") '過不足を最小化=要員数に一致させる
SolverAdd CellRef:=Range("条件_確保"), Relation:=2, FormulaText:=0 '必須条件 = 0
Call 共通条件追加
End Sub
Public Sub 条件設定_日数調整()
' 勤務日数自動調整条件
SolverReset '規定値にリセット
SolverOk SetCell:=Range("目標_予定数差"), MaxMinVal:=2, ValueOf:=0, ByChange:=Range("変化させるセル")
SolverAdd CellRef:=Range("条件_調整"), Relation:=2, FormulaText:=0 '調整条件 = 0
Call 共通条件追加
End Sub
Private Sub 共通条件追加()
' SolverOptions Precision:=0.001, Convergence:=0.001
SolverOptions Precision:=Val(Range("設定値_精度")), Convergence:=Val(Range("設定値_収束値"))
SolverAdd CellRef:=Range("変化させるセル"), Relation:=1, FormulaText:=Range("勤務最大値") '変化させるセル 以下
SolverAdd CellRef:=Range("変化させるセル"), Relation:=4 '変化させるセル 整数
End Sub
Public Function Solver_Solve(Optional boolHideDialog As Boolean = False) As Integer
'
' ソルバー実行
'
' boolHideDialog:ダイアログを非表示 True:非表示 False:表示
' 戻り値:SolverSolveからの戻り値
'
' Range("集計").Value = False '集計計算オフ
Solver_Solve = SolverSolve(boolHideDialog) '実行
' Range("集計").Value = True '集計計算オン
End Function