Bonjour Brice Curulis et ponpon,
Bon je me suis fait à l'idée d'avoir des noms de remplaçants en dehors des entêtes mais çà promet pour la comptabilité aprés si vous faites pas des NB.SI mensuels.
Merci à Curulis pour son code que j'ai découvert et compris.
Voici ma proposition pour résoudre 2 des 3 derniéres conditions :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'
Dim iRow%, iCol%, iNb%, iNb1%, iNb2%, iNbAbs%, iNbEnd%, iNbWk%, sEq$, sFormula$
'
If Selection.Columns.Count > 1 Or Selection.Row = 1 Then Exit Sub
'
iRow = Target.Row 'ligne ou tu cliques
iCol = Target.Column 'col ou tu cliques
iNb1 = Columns(1).Find(what:="Equipe 1", lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext).Row 'ligne Equipe 1
iNb2 = Columns(1).Find(what:="Equipe 2", lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext).Row 'ligne Equipe 2
iNbAbs = Columns(1).Find(what:="Absence", lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext).Row 'ligne Absence Eq 1
iNbEnd = Columns(1).Find(what:="Equipe", lookat:=xlPart, LookIn:=xlValues, searchdirection:=xlPrevious).Row 'ligne dern éq (eq 7)
iNbWk = (iNbAbs - (iNb1 + 2)) / 2 'nbre de travailleurs par équipe 20-(6+2)/2 = 6
iNb = iNb2 - iNb1 'nbre de lignes (libres comprises) occupées par une équipe
'
Cells.Validation.Delete
If Target.Offset(-1, 0) = "ABS" Then
sEq = Range("A1:A" & iRow).Find(what:="Equipe", lookat:=xlPart, LookIn:=xlValues, searchdirection:=xlPrevious)
'MsgBox sEq 'si sous "abs", donne le nom de l'équipe en cours
For x = iNb1 To iNbEnd Step iNb
If Cells(x, 1) <> sEq And (Cells(x + 1, iCol) = "J" Or Cells(x + 1, iCol) = "REPOS") And Cells(x + 1, iCol + 1) <> "M" Then
For y = 1 To iNbWk
'WorksheetFunction.CountIf(Columns(iCol), Cells(x + (y * 2), 1)) = 0 pas encore été repris ailleurs.
'Cells(x + 1, iCol - 1) = Cells(x + 1, iCol) (même poste M Am ou N la veille du remplaçant)
'Cells(x + 1, iCol + 1) = Cells(x + 1, iCol) (même poste M Am ou N le lendemain du remplaçant)
If Cells(x + (y * 2), 1) <> 0 And Cells(x + (y * 2), iCol) <> "ABS" _
And Cells(x + 1, iCol - 1) = Cells(x + 1, iCol) _
And Cells(x + 1, iCol + 1) = Cells(x + 1, iCol) _
And WorksheetFunction.CountIf(Columns(iCol), Cells(x + (y * 2), 1)) = 0 Then
sFormula = sFormula & IIf(sFormula = "", "", ",") & Cells(x + (y * 2), 1)
End If
Next y
End If
Next x
If sFormula <> "" Then Target.Validation.Add Type:=xlValidateList, Formula1:=sFormula
End If
End Sub
Pour la condition de ne pas travailler plus de 11 jours, j'ai un souci pour valider la plage concernée, à valider :
And WorksheetFunction.CountIf(Columns((iRow-11)":" (iRow-1) , Cells(x + (y * 2)) < 11 '
J'ai quelques questions :
@Curulis c'est quoi les Dim en % et $ , et les
Cells.Validation.Delete .....
IIf(sFormula = "", "", ","
@brice c'est pour quoi le J jour exactement ?
cdt