XL 2010 Traiter une donnée apparaissant plusieurs fois dans la même colonne

Shapo2Pay

XLDnaute Nouveau
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 :

1031292


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
    14.5 KB · Affichages: 8
Dernière édition:

Calvus

XLDnaute Barbatruc
Bonjour Shapo2pay, le forum,

Bienvenue sur le forum.

Ton problème n'est pas simple.

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
    30.3 KB · Affichages: 4

Shapo2Pay

XLDnaute Nouveau
Bonjour Calvus, le forum,

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 !

Merci encore !
 

Discussions similaires

Statistiques des forums

Discussions
312 088
Messages
2 085 201
Membres
102 816
dernier inscrit
bolivier