Bonjour à tous,
je travail sur un projet depuis un petit moment et je rencontre un problème pour effectuer un calcul, j'ai recherché une solution sur internet mais n'ai rien pu trouvé pouvant m'aider.
Comme il est difficile pour moi d'expliquer mon problème uniquement avec des mots, j'ai créé une version "allégée" de mon tableau en guise de support :
Mon problème : le fait qu'une même personne ne peut faire son action que sur un seul site à la fois n'est pas pris en compte (c.f. lignes 2 et 15 par exemple).
J'aimerais exprimer cela sur Excel mais je ne sais pas comment : "Si les périodes d'action d'une même personne se chevauchent, alors celle ayant sa date/heure de début immédiatement plus tard doit se décaler et commencer à la fin de celle ayant la date/heure de début immédiatement plus tôt (il peut y avoir + de 2 périodes d'action qui se chevauchent!) et si plusieurs périodes commencent en même temps alors l'ordre suit l'ordre croissant des numéros de lignes".
Ce qui me pose vraiment problème c'est le fait de devoir comparer toutes les périodes d'actions d'une même personne. Je ne sais pas comment faire cela avec des fonctions (je ne m'y connais pas vraiment en vba...).
J'espère avoir été assez clair, je joins le fichier Excel (Excel 2010) si cela peut aider.
Merci d'avance pour votre aide !
Pièces jointes
Traiter une donnée apparaissant plusieurs fois dans la même colonne.xlsx
Pour l'instant, j'ai réussi à mettre en évidence les doublons ainsi qu'un avertissement si tu fais travailler quelqu'un 2 fois sur la même plage horaire.
En parcourant les lignes de la colonne B, tu verras les doublons en surbrillance.
Si tu modifies une personne, une boite de dialogue t'avertira.
Tu peux empêcher une nouvelle entrée si elle n'est pas compatible. J'expliquerai comment en dessous du code.
VB:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim Col As Integer
If Target.Value = "" Then Exit Sub
Col = 2
If Target.Column = Col Then
Dim mava As Variant
mava = "=SUMPRODUCT((B2:B500=" & Target.Address & ")*(D2:D500=D" & Target.Row & "))" 'fonctionne
If Evaluate(mava) > 1 Then MsgBox "Saisie Impossible !" & Target & " déjà en poste."
'Target.ClearContents
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i As Integer, j As Integer, c As Range, plage As Range
Dim mava As Variant
mava = "=SUMPRODUCT((B2:B500=" & Target.Address & ")*(D2:D500=D" & Target.Row & "))" 'fonctionne
Set plage = Range("B2:B" & Range("B" & Rows.Count).End(xlUp).Row)
plage.Interior.Color = xlNone
plage.Offset(, 2).Interior.Color = xlNone
For i = Target.Offset(1, 0).Row To Cells(Rows.Count, 2).End(xlUp).Row
For j = Target.Offset(1, 0).Row To Cells(Rows.Count, 4).End(xlUp).Row
If Cells(i, 2) = Target And Cells(j, 4) = Target.Offset(, 2) Then
For Each c In plage
If c = Target And c.Offset(, 2) = Target.Offset(, 2) Then
c.Interior.Color = 18006640
c.Offset(, 2).Interior.Color = 18006640
End If
Next c
End If
Next j
Next i
End Sub
Pour empêcher la saisie, il suffit de supprimer l'apostrophe devant : ' Target.ClearContents dans le code.
Pour le reste, à savoir incrémenter les dates en fonction des disponibilités, c'est une vraie usine à gaz. J'arrive à quelque chose d'approximatif, mais pas totalement.convaincant. Je pense qu'il faut reprendre les données depuis le début, alors que j'ai essayé d'adapter des formules à ton tableau existant. Il faut tout revoir depuis le début.
Je regarderai ça à tête reposée, et regarderai aussi pour une solution vba.
D'ici là, la remontée de ton post donnera peut être d'autres réponses.
Je mets la formule trouvée uniquement à titre indicatif, pour éventuellement donner une piste. Je le redis, elle n'est pas encore totalement fonctionnelle. Elle est là pour donner la prochaine date disponible.
Le résultat se trouve en feuille 2.
Code:
=SI(SOMMEPROD(('Traiter une donnée apparaissant plusieurs fois dans la même colonne TEMP.xlsm'!Tableau1[Personne]=B2)*('Traiter une donnée apparaissant plusieurs fois dans la même colonne TEMP.xlsm'!Tableau1[Début]=D2))>1;MAX(($H$2:$H$24)*($B$2:$B$24=INDEX($B$1:$B$24;GRANDE.VALEUR(SI(EQUIV($B$3:$B$24;$B$3:$B$24;0)=LIGNE()-1;LIGNE($B$3:$B$24);0);LIGNE($B$3:$B$24)-1))));SI(C2=C1;H1;$L$2))
A+
Pièces jointes
Traiter une donnée apparaissant plusieurs fois dans la même colonne.xlsm
Tout d'abord merci beaucoup pour le temps que tu as consacré à mon problème ! J'en suis bien conscient ce n'est pas simple...
Ce que tu as mis en place pour éviter d'entrer des doublons dans le tableau est intéressant et fonctionne bien. Je pense l'intégrer à mon tableau final !
Mais en effet il reste le gros du problème...
Je vais essayer de me pencher sérieusement sur la formule que tu proposes car ça me semble être un bon début !