Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2013 Rechercher et mettre en surbrillance des doublons (ou chevauchement)

  • Initiateur de la discussion Initiateur de la discussion ANTONY34200
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

ANTONY34200

XLDnaute Occasionnel
Bonjour,
je cherche un moyen de mettre en surbrillance, et ouvrir une fenêtre d'alerte, automatiquement, sans bouton, en cas de chevauchement ou doublons d'horaire d'une même personne.

Je pense qu'un code VBA est nécessaire, mais j'ai beau chercher dans les forums, je ne trouve pas mon bonheur ...
et je vous avouerais que le VBA, je ne maîtrise pas.

Un petit coup de main serais le bien venu.

Merci d'avance
 

Pièces jointes

Bonjour @ANTONY34200,

Le challenge est intéressant 🙄.
j'ai essayé de voir comment le faire par MFC. J'ai vite abandonner 🙁.
Donc voici une tentative de solution par VBA.

Le planning se met à jour (recherche des incompatibilité des plages pour un opérateur) quand on change une donnée de ce planning.

Il faut sans doute un certain temps pour quitter son poste et prendre en main le suivant. Dans le module1, vous avez une constante InterPoste qui est la durée (en minute) accordée au salarié pour changer de poste. Cette constante est à votre main. Si vous la fixez à zéro, alors l'opérateur peut changer de poste instantanément (c'est peu réaliste!).
Dans l'exemple joint, cette durée InterPoste a été fixée à 15 (minutes) Ce cas est celui de Kevin dans l'exemple joint (ou sur l'image).

Voici ce que donne le planning analysé:

Le code est dans module1:
VB:
Option Explicit

Const InterPoste = 15      ' durée minimale entre la libération d'un poste
                           ' et la prise en main d'un autre poste
                           ' la durée est exprimée en minute.

Sub Reperer_Doublon()
Const Source = "Feuil1"
Dim derlig&, dercol&, t, i&, ii&, j&, jj&, nomOp$

Application.ScreenUpdating = False
' lecture des données - tableau t
Worksheets(Source).Select
derlig = Cells(Rows.Count, "b").End(xlUp).Row + 1  '(une ligne en plus !!! )
dercol = Cells(1, Columns.Count).End(xlToLeft).Column + 4
t = Range("a1").Resize(derlig, dercol).Value

'on "décolore les données sources"
Range("a2").Resize(derlig, dercol).Interior.ColorIndex = xlColorIndexNone
Range("a2").Resize(derlig, dercol).Font.Color = vbBlack

' dans le tableau, on normalise les noms (minuscule)
' et on ajoute la date aux heures [heure  <- date + heure]
For i = 3 To UBound(t)
   For j = 5 To UBound(t, 2) Step 5
      t(i, j - 2) = Trim(LCase(t(i, j - 2)))    'normalisation du nom
      If t(i, j - 2) <> "" And t(i, j) <> "" And t(i, j + 2) <> "" Then
         'nom et horaires non vides, on continue
         If IsDate(t(i, 2)) And IsNumeric(t(i, j)) And IsNumeric(t(i, j + 2)) Then
            ' à priori la date et l'horaire de début et de fin existent
            ' on va rajouter la date aux heures
            If t(i, j + 2) >= t(i, j) Then
               'l'heure de fin est supérieure ou égale à l'heure de début (même jour)
               t(i, j) = t(i, 2) + t(i, j)
               t(i, j + 2) = t(i, 2) + t(i, j + 2)
            Else
               ' l'heure de fin est inférieure à l'heure de début
               '  on rajoute un jour à l'heure de fin
               t(i, j) = t(i, 2) + t(i, j)
               t(i, j + 2) = t(i, 2) + 1 + t(i, j + 2)
            End If
         Else
            'date ou horaires incorrects, le nom est mis à vide
            t(i, j - 2) = Empty
         End If
      Else
         'date ou horaires incorrects, le nom est mis à vide
         t(i, j - 2) = Empty
      End If
   Next j
Next i
'on vide la dernière ligne
For j = 1 To UBound(t, 2): t(UBound(t), j) = Empty: Next

' pour chaque plage d'une ligne, on regarde si l'opérateur correspondant
' n'a pas une autre plage qui la chevauche. (on regarde dans la ligne plus la suivante)
For i = 3 To UBound(t) - 1
   For j = 5 To UBound(t, 2) Step 5
      nomOp = t(i, j - 2)
      If nomOp <> "" Then        'le nom de l'opérateur ne doit pas être vide
         'on regarde les autres plages du même opérateur en excluant la plage en cours
         For ii = i To i + 1
            For jj = 5 To UBound(t, 2) Step 5
               ' on exclut la plage de référence en cours de l'opérateur
               ' les noms doivent être identiques
               If Not (ii = i And jj = j) And t(ii, jj - 2) = nomOp Then
                  If Chevauchement(t(i, j), t(i, j + 2), t(ii, jj), t(ii, jj + 2), InterPoste) Then
                     Range(Cells(i, j - 2), Cells(i, j + 2)).Interior.Color = vbYellow
                     Range(Cells(i, j - 2), Cells(i, j + 2)).Font.Color = vbRed
                     Range(Cells(ii, jj - 2), Cells(ii, jj + 2)).Interior.Color = vbYellow
                     Range(Cells(ii, jj - 2), Cells(ii, jj + 2)).Font.Color = vbRed
                  End If
               End If
            Next jj
         Next ii
      End If
   Next j
Next i
End Sub

Function Chevauchement(x0, y0, x1, y1, DureeInterPoste) As Boolean
Dim interv0, interv1
   'interv0 est la plage dont le début est le plus petit
   If x0 <= x1 Then
      interv0 = Array(x0, y0): interv1 = Array(x1, y1)
   Else
      interv0 = Array(x1, y1): interv1 = Array(x0, y0)
   End If
   'on tient compte de la durée entre deux postes
   Chevauchement = interv1(0) < interv0(1) + DureeInterPoste / 1440
End Function

A vous de vérifiez à fond si les résultats sont justes ou non.

Edit: préférez la v1a
 

Pièces jointes

Dernière édition:
Bonjour mapomme,
je viens d'essayer, c'est impeccable, c'est ce que je cherchais, ça va mettre d'une grande aide.

Par contre, le fichier que je vous ai joint est un exemple et n'est pas complet. j'ai 90 machines ... le code vba que vous avez fait est pour combien de machine ?? 3 comme dans mon exemple ? a quelle niveau va-t-il falloir que j’intervienne pour que la mise en forme se fasse sur l'intégralité des machines ?
De plus je viens de m'apercevoir que j'ai fais une erreur dans mon exemple, les dates son en colonne D et le nom des opérateurs en colonne E.
 
Re,
Par contre, le fichier que je vous ai joint est un exemple et n'est pas complet. j'ai 90 machines ...
Le code est fait pour un nombre quelconque de machines (à tester). Je n'ai pas testé les temps d"exécution pour 90 machines. Je vais devoir le faire. Mais si la durée est trop grande, Il va falloir trouver un autre algorithme. Et ça c’est coton.

De plus je viens de m'apercevoir que j'ai fais une erreur dans mon exemple, les dates sont en colonne D et le nom des opérateurs en colonne E
C'est gênant. Je vais voir ce que je peux faire.
 
Dernière édition:
J'ai fait un test (en PJ) avec le fichier que vous m'avez retourné, c'est quasiment instantané. c'est nickel ... par contre les codes seraient à modifier pour que je l'adapte a mon tableau SVP, voir la feuille2 (le tableau n'est pas joli, mais les cellules correspondent à la réalité de mon tableau original
 

Pièces jointes

Re,

Avec 90 machine, les durées de calculs deviennent longs, très long (je m'en doutais un peu).
Si vous ne le constatez pas, c'est qu'il y a un problème:
  • soit la macro ne s'exécute pas correctement (il y a des chances puisque les colonnes ne sont pas distribuées comme dans le fichier de départ)
  • soit une configuration des opérateurs spécifiques aboutit à cette rapidité
 
Dernière édition:
J'ai fait le test avec 90 machine, et 23 opérateurs ... ce n'ai pas long, car quand je planifie c'est opérateur par opérateur, c'est rare qu'il y est des doublons ou chevauchements ... et la surbrillance est quasiment instantané
 
A savoir, toutes les machines ne seront pas utilisées ... j'ai fait mont tableau sur 90 mais au maximum il y en aura entre 35 et 40 grand max, et les opérateurs 30 maxi environ ... et toutes les machines ne tourneront pas en même temps et encore moins les même jours ... je pense que votre code est bon et qu'il faudrait le réadapté à la feuille 2 ce que je ne saurais pas faire ...
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…