MFC chevauchement plages horaires

Kiriko

XLDnaute Occasionnel
Bonjour à tous,
Dans le fichier joint, on considère, par ligne, 4 plages horaires différentes (D:E), (F:G), (H:I) et (J:K). Je cherche des MFC (ou autre système?) qui signalerait en rouge tout "chevauchement" eventuel de plage horaire (sur la même ligne, mais entre n'importe laquelle de chacune des 4 plages). Un exemple "à la main" ligne 6.
Les formats horaires sont [hh]:mm.
Des MFC sont déjà présentes qui valident que les heures de fin soient bien après les heures de début (plage par plage)
J'ai des colonnes masquées qui me servent à d'autres choses mais non utiles pour l'exemple.
En espérant avoir été clair.
Merci par avance !

édit : modif de l'exemple
 

Pièces jointes

  • MFC chevauchement plages horaire.xlsx
    28.6 KB · Affichages: 44
Dernière édition:

job75

XLDnaute Barbatruc
Re : MFC chevauchement plages horaires

Bonjour Kiriko,

Il faut 2 MFC distinctes.

1) Touche Ctrl enfoncée, sélectionner successivement les colonnes E G I, I1 est la cellule active.

Formule de la MFC (rouge) en I1 =ET(LIGNE()>1;J1<>"";I1>J1)

2) Touche Ctrl enfoncée, sélectionner successivement les colonnes F H J, J1 est la cellule active.

Même formule de la MFC (rouge) mais en J1 =ET(LIGNE()>1;J1<>"";I1>J1)

Fichier joint.

Edit : coucou Misange, à la même minute :)

A+
 

Pièces jointes

  • MFC chevauchement plages horaires(1).xls
    75 KB · Affichages: 61
Dernière édition:

Misange

XLDnaute Barbatruc
Re : MFC chevauchement plages horaires

Bonjor

un début de solution que je te laisse continuer si ça te convient.
J'ai transformé tes données en tableau de façon à ce que ça reste dynamique.
Je n'ai fait que la colonne F
j'ai aussi modifié ta MEFC pour l'heure de fin pour éviter de la recopier 4 fois.
 

Pièces jointes

  • Copie de MFC chevauchement plages horaire.xlsx
    39.9 KB · Affichages: 75

Kiriko

XLDnaute Occasionnel
Re : MFC chevauchement plages horaires

Bonjour job75, bonjour Misange,
Merci de votre aide !
La solution de job75 ne fonctionne visiblement pas, la coloration en rouge se fait dans des cas ou elle ne devrait pas (ligne 1 par exemple dans le fichier joint).
Pour la proposition de Misange, cela semble fonctionner, charge à moi d'essayer de l'adapter aux autres colonnes. Je ne suis pas sûr de pouvoir y arriver (je reviendrais poster mon résultat ou redemander de l'aide le cas échéant). Par contre, pour d'autres raisons, je ne souhaite pas transformer les données en tableau...
Encore Merci à tous les deux en tous les cas !!!!!
 

job75

XLDnaute Barbatruc
Re : MFC chevauchement plages horaires

Re,

Autre solution avec une seule MFC.

Sélectionner les colonnes E à J, E1 est la cellule active.

Formule de la MFC (rouge) en E1 :

Code:
=(LIGNE()>1)*(ET(GAUCHE(E$1;2)="Hf";F1<>"";E1>F1)+ET(GAUCHE(E$1;2)="Hd";E1<>"";D1>E1))
Rappelons que le signe * équivaut à ET, le signe + équivaut à OU.

Fichier (2).

Edit : je n'avais pas vu le post #4, et j'avoue ne pas comprendre.

A+
 

Pièces jointes

  • MFC chevauchement plages horaires(2).xls
    67 KB · Affichages: 36
Dernière édition:

job75

XLDnaute Barbatruc
Re : MFC chevauchement plages horaires

Re,

Une nouvelle solution utilisant une fonction VBA.

Sélectionner les colonnes D à K, D1 est la cellule active.

Formule de la MFC (rouge) en D1 =ET(LIGNE()>1;CHEVAUCHE(D1;$D1:$K1))

La fonction VBA CHEVAUCHE est dans Module1 :

Code:
Function CHEVAUCHE(c As Range, P As Range) As Boolean
If c = "" Then Exit Function
Dim deb, fin, i As Byte
deb = Array(P(1), P(3), P(5), P(7))
fin = Array(P(2), P(4), P(6), P(8))
For i = 0 To UBound(deb)
  If Intersect(c, P(1 + 2 * i).Resize(, 2)) Is Nothing Then
    If c >= deb(i) And c <= fin(i) Then
      CHEVAUCHE = True
      Exit Function
    End If
  End If
Next
End Function
Fichier (3).

A+
 

Pièces jointes

  • MFC chevauchement plages horaires(3).xls
    75.5 KB · Affichages: 37

job75

XLDnaute Barbatruc
Re : MFC chevauchement plages horaires

Re,

La comparaison de 2 heures égales pose souvent des problèmes.

Testez le fichier (3) précédent en mettant 16:30 en G6...

Pour y remédier arrondissons les heures à la 6ème décimale (1/10ème de seconde) :

Code:
Function CHEVAUCHE(c As Range, P As Range) As Boolean
If c = "" Then Exit Function
Dim deb, fin, a As Single, i As Byte
deb = Array(P(1), P(3), P(5), P(7))
fin = Array(P(2), P(4), P(6), P(8))
a = Round(c, 6) 'arrondi à la 6ème décimale
For i = 0 To UBound(deb)
  If Intersect(c, P(1 + 2 * i).Resize(, 2)) Is Nothing Then
    If a >= Round(deb(i), 6) And a <= Round(fin(i), 6) Then
      CHEVAUCHE = True
      Exit Function
    End If
  End If
Next
End Function
Fichier (4).

A+
 

Pièces jointes

  • MFC chevauchement plages horaires(4).xls
    78 KB · Affichages: 36
Dernière édition:

Kiriko

XLDnaute Occasionnel
Re : MFC chevauchement plages horaires

Bonsoir job75,
Merci encore pour le temps passé!
Cela semble fonctionner. j'ai néanmoins supprimé les = des >= et des <= dans la fonction (effectivement, des plages horaires peuvent être contiguës).
J'ai remarqué, mais ce n'est pas vital pour moi de le corriger, une mise en surbrillance moins logique si on note par exemple 19:00 en E2... Effectivement, la 1ère plage ne se met pas en surbrillance quand elle englobe plusieurs autres plages visiblement...
Avec encore tous mes remerciements !
 

job75

XLDnaute Barbatruc
Re : MFC chevauchement plages horaires

Re,

Oui, l'enlèvement du signe = est sans doute judicieux, cela évite de colorer systématiquement lez zones contigües.

Pour les zones "chapeaux" c'est un autre problème, il faudrait colorer les 2 cellules de la zone.

A+
 

Kiriko

XLDnaute Occasionnel
Re : MFC chevauchement plages horaires

Re,
Effectivement, ce serait une bonne solution, qui me conviendrait parfaitement... Mais aucune idée de comment procéder. Si d'aventure vous pouviez m'aider encore une fois en m'indiquant l'ultime modification à faire pour y parvenir (colorer les 2 cellules de chaque zone concernée par un chevauchement), je vous en serais encore plus reconnaissant !
A+
 

job75

XLDnaute Barbatruc
Re : MFC chevauchement plages horaires

Bonjour Kiriko, le fil, le forum,

Voici donc le fichier (5).

Formule de la MFC (rouge) sur D:K, en D1 :

Code:
=CHEVAUCHE(DECALER(D1;;MOD(COLONNES($D1:D1);2)-1;;2);$D1:$K1)
La nouvelle fonction VBA :

Code:
Function CHEVAUCHE(zone As Range, P As Range) As Boolean
If zone(1) = "" Or zone(2) = "" Then Exit Function
Dim deb, fin, zd!, zf!, i As Byte, d!, f!
deb = Array(P(1), P(3), P(5), P(7))
fin = Array(P(2), P(4), P(6), P(8))
zd = Round(zone(1), 6) 'arrondi à la 6ème décimale
zf = Round(zone(2), 6)
For i = 0 To UBound(deb)
  If Intersect(zone, P(1 + 2 * i).Resize(, 2)) Is Nothing _
    And deb(i) <> "" And fin(i) <> "" Then
    d = Round(deb(i), 6)
    f = Round(fin(i), 6)
    If zd > d And zd < f Or zf > d And zf < f Or _
      zd <= d And zf >= f Then CHEVAUCHE = True: Exit Function
  End If
Next
End Function
Le 1er argument est maintenant une zone de 2 cellules.

Noter qu'il n'y pas besoin de test pour la ligne 1 car sur cette ligne la fonction Round crée une erreur.

Bonne journée et A+
 

Pièces jointes

  • MFC chevauchement plages horaires(5).xls
    78.5 KB · Affichages: 72
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 198
Messages
2 086 136
Membres
103 129
dernier inscrit
Atruc81500