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

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

  • Doublons.xlsx
    14.4 KB · Affichages: 15

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @ANTONY34200,

Le challenge est intéressant :rolleyes:.
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é: ANTONY34200- Doublons- v1.PNG

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

  • ANTONY34200- Doublons- v1a.xlsm
    32.6 KB · Affichages: 10
Dernière édition:

ANTONY34200

XLDnaute Occasionnel
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.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
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:

ANTONY34200

XLDnaute Occasionnel
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

  • ANTONY34200- Doublons- v1.xlsm
    161.7 KB · Affichages: 6

mapomme

XLDnaute Barbatruc
Supporter XLD
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:

ANTONY34200

XLDnaute Occasionnel
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é
 

ANTONY34200

XLDnaute Occasionnel
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 ...
 

Discussions similaires

Statistiques des forums

Discussions
312 305
Messages
2 087 090
Membres
103 464
dernier inscrit
Inconnu2