Option Explicit
Function IlProssimo(Numero, DaInizio, AFine, PassoStep)
If Numero < AFine Then
IlProssimo = Numero + 1
Else
IlProssimo = DaInizio
End If
End Function
Sub Turni()
Dim Giorno As Integer
Dim Infermiere As Integer
Dim Pivot As Range
Dim Turno
Dim TurnoNome(1 To 4)
Dim NumeroInTurno As Integer
Dim NumeroInTurnoMax As Integer
Dim Settimana As Integer
Dim InfermiereOK As Boolean
Dim IndiceInf As Integer
Dim NumInfermieri As Integer
Dim StrReq As Boolean
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
Range("H5:AL20").ClearContents
TurnoNome(1) = "E"
TurnoNome(2) = "D"
TurnoNome(3) = "L"
TurnoNome(4) = "N"
Set Pivot = Range("G4")
NumInfermieri = Range(Pivot.Offset(1, 0), Pivot.Offset(1, 0).End(xlDown)).Count
Do
Infermiere = InputBox("Inserire il Primo Infermiere della Lista. Deve Essere un Numero Compreso tra 1 e " & NumInfermieri & ".", "NUMERO PRIMO INFERMIERE", 1)
InfermiereOK = Infermiere >= 1 And Infermiere <= NumInfermieri
Loop Until InfermiereOK
For Giorno = 1 To 31
Settimana = Pivot.Offset(-2, Giorno)
For Turno = 1 To 4
If ((Pivot.Offset(-1, Giorno) = "S") Or (Pivot.Offset(-1, Giorno) = "D")) Then
If Turno < 4 Then
NumeroInTurnoMax = 2
Else
NumeroInTurnoMax = 1
End If
Else
If Turno < 4 Then
NumeroInTurnoMax = 3
Else
NumeroInTurnoMax = 1
End If
End If
For NumeroInTurno = 1 To NumeroInTurnoMax
Pivot.Offset(Infermiere, Giorno) = TurnoNome(Turno)
IndiceInf = 0
Do
Infermiere = IlProssimo(Infermiere, 1, NumInfermieri, 1)
IndiceInf = IndiceInf + 1
InfermiereOK = Pivot.Offset(Infermiere, -6 + Settimana) + 8 <= Pivot.Offset(Infermiere, -6)
StrReq = IndiceInf > NumInfermieri
Loop While (Not (InfermiereOK Or StrReq))
If StrReq Then
IndiceInf = 0
Do
Infermiere = IlProssimo(Infermiere, 1, NumInfermieri, 1)
IndiceInf = IndiceInf + 1
InfermiereOK = Pivot.Offset(Infermiere, -6 + Settimana) + 8 <= Pivot.Offset(Infermiere, -6) + 4
If Settimana > 1 Then
InfermiereOK = InfermiereOK And Pivot.Offset(Infermiere, -6 + Settimana - 1) <= Pivot.Offset(Infermiere, -6) - 4
End If
StrReq = IndiceInf > NumInfermieri
Loop While ((Not InfermiereOK) Or StrReq)
If StrReq Then
MsgBox ("Non Posso Terminare con i vincoli Proposti")
With Application
.ScreenUpdating = True
.EnableEvents = True
End With
Exit Sub
End If
End If
Next NumeroInTurno
Next Turno
Next Giorno
With Application
.ScreenUpdating = True
.EnableEvents = True
End With
End Sub |