XL 2010 Filtrer la période d'une nuit sur une semaine

zayab

XLDnaute Junior
Bonjour le forum,

Pouvez vous m'aider svp, J'ai besoin de filtrer un tableau des activités de plusieurs jours et nuits pour ne conserver que la période d'une seule nuit entre 22h00 et 07h00. Les deux dates critères du soir et lendemain sont déterminées dans un onglet du même classeur ou apparaîtrai les résultats.
Je joins un exemple simplifié.

Merci mile fois pour votre aide
 

Pièces jointes

  • Travaux.xls
    42.5 KB · Affichages: 51

Dranreb

XLDnaute Barbatruc
Bonjour.
Voulez vous les heures début/fin de la période à extraire ou celles portée dans les données ?
Édit: Attention, vous avez laissé des données apparemment étrangères à partir de la ligne 75.
Je les supprime parce qu'elles font partie de Feuil1.UsedRange

Édit2: Ceci, dans le module de l'objet Worksheet Feuil2 semble faire l'affaire :
VB:
Option Explicit

Private Sub Worksheet_Activate()
ListeAct
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Me.[G2:H2,J2:K2], Target) Is Nothing Then ListeAct
End Sub

Sub ListeAct()
Dim DébP As Date, FinP As Date, TE(), LE As Long, _
    DébT As Date, FinT As Date, TS(), LS As Long
DébP = Me.[G2].Value + Me.[H2].Value
FinP = Me.[J2].Value + Me.[K2].Value
TE = Feuil1.UsedRange.Value
ReDim TS(1 To UBound(TE, 1), 1 To 4)
For LE = 2 To UBound(TE, 1)
   DébT = TE(LE, 2) + TE(LE, 3)
   FinT = TE(LE, 4) + TE(LE, 5)
   If DébT < FinP And FinT > DébP Then
      If DébT < DébP Then DébT = DébP ' S'il faut le début de la période demandée.
      If FinT > FinP Then FinT = FinP ' S'il faut la fin de la période demandée.
      LS = LS + 1
      TS(LS, 1) = TE(LE, 1)
      TS(LS, 2) = DébT: TS(LS, 3) = FinT
      TS(LS, 4) = TE(LE, 6)
      End If: Next LE
With Me.ListObjects("Table2")
   If .ListRows.Count > LS Then .ListRows(LS + 1).Range.Resize(.ListRows.Count - LS).Delete xlShiftUp
   .DataBodyRange.Resize(LS).Value = TS: End With
End Sub
 

Pièces jointes

  • Zayab.xlsm
    22.3 KB · Affichages: 44
Dernière édition:

zayab

XLDnaute Junior
Merci de vos réponses supra rapides,
Je réalise que par souci de clarté, je dois mieux poser mon problème...

J'ai besoin que de la liste initiale des chantiers ne reste que ceux qui auront une activité même seulement 1h00 durant la période allant du 07/10/2016 22:00 au 08/10/2016 07:00
Par exemple:
REHAB - 04/10/2016 11:00:00 au 12/10/2016 10:59:00 Changement des sols __oui
INSTALLATION 08/10/2016 07:00:00 au 08/10/2016 18:00:00 TRAVAUX DE SERRURERI__non
TRAVAUX 07/10/2016 07:00:00 au 07/10/2016 18:00:00 realisation des lign__non (car termine avant 22h00)
montage soirée 06/10/2016 11:00:00 au 08/10/2016 02:59:00 CONNECT#2 - Factory__oui (car sera en activité durant une partie de la nuit du 7 au 8).

Je reverse le fichier Zayab renommé avec les modifications des chantiers pour que ça colle avec ces 3 derniers exemples (macro inchangée)
Merci encore
 

Pièces jointes

  • Zayab 1.2.xlsm
    20.6 KB · Affichages: 42

Dranreb

XLDnaute Barbatruc
Y a-t-il quelque chose de faux dans mon résultat ?
(Ou avez vous été induit en erreur par les heures de début et fin qu'il ne fallait pas tronquer s'il y avait lieu à la période demandée ?)
 
Dernière édition:

zayab

XLDnaute Junior
Mazette! Dranreb!! Vous avez deux fois raison!!:eek:
Induis fus-je par cette tronquerie. Je peux certes faire le deuil de ces heures de début et fin. Il faut avouer que ce bout de code est tout de même un petit peu brillant!!!!!!:cool: (Et je m'y connais en petit peu) :D

Mais comme je dois aimer me faire un peu mal, j'ose l'ultime question:
Et ce que les 2 annotations en vert: " S'il faut le début de la période demandée" et "S'il faut la fin de la période demandée" pourraient signifier que si les 2 lignes de code correspondantes sont effacées il résulterait alors au tableau final Sheet1, les dates et heures d'origine des chantiers :rolleyes:????
 

Dranreb

XLDnaute Barbatruc
Il doit y avoir des lignes parasites qui contiennent autre chose qu'une date et heure de fin.
Quelle est la 1ère chose que vous ne comprenez pas à ce code ? Il n'est pourtant pas très complexe.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Ça se produit quand le tableau est vide.
On peut y remédier en ajoutant cette instruction devant :
If .ListRows.Count = 0 Then .ListRows.Add
Quelle est la 1ère chose que vous ne comprenez pas à ce code ? Il n'est pourtant pas très complexe.
 

zayab

XLDnaute Junior
Ok ça marche au poil. Merci beaucoup.
Concernant ce que je ne comprend pas c'est due à mon approche pas académique du tout du tout. Sans connaissances de base du code, j’expérimente de manière artistique la bricole au cambouis avec du code réchauffé et beaucoup beaucoup beaucoup de philosophie. Un peu entre Champollion et Homer SIMPSON face à un ordinateur Shaddock.
Pour commencer : Option Explicit ça ne m'explicite pas des masses...
 

Dranreb

XLDnaute Barbatruc
C'est une bonne habitude de déclarer les variables qu'on utilise, surtout en les typant convenablement.
Ça facilite la mise au point, entraine des message d'erreur plus clairs à l'exécution, fige la casse de leurs noms et ça les documente un peu.
Si on s'en est fait une règle d'or, Option Explicit offre le service de ne pas tenter d'exécution tant que des oublis de déclaration subsistent.
 

Discussions similaires

Statistiques des forums

Discussions
314 627
Messages
2 111 303
Membres
111 094
dernier inscrit
MFrequence